The GitHub Actions job "Required Checks" on texera.git/main has failed.
Run started by GitHub user github-merge-queue[bot] (triggered by 
github-merge-queue[bot]).

Head commit for run:
bf9733ffd388634de1fe50710caf16078ce0f6c7 / Yicong Huang 
<[email protected]>
feat(infra): add bin/single-node.sh wrapper for the docker deploy (#5998)

### What changes were proposed in this PR?

`bin/single-node/` shipped the docker-compose deploy (compose file,
`.env`, examples profile, nginx + litellm config, README) but had no
script wrapper. Contributors had to `cd bin/single-node && docker
compose up` from a specific directory. After `bin/local-dev.sh` landed
for the native dev stack, this left the two deploys with asymmetric UX.

Mirror the local-dev shape: a thin `bin/single-node.sh` wrapper plus the
engine inside the existing `bin/single-node/` folder.

```
bin/
├── single-node.sh                # 3-line wrapper → bin/single-node/main.sh
└── single-node/
    ├── main.sh                   # engine (new)
    ├── docker-compose.yml        (existing)
    ├── .env                      (existing)
    ├── litellm-config.yaml       (existing)
    ├── nginx.conf                (existing)
    ├── examples/                 (existing)
    ├── README.md                 (existing — Launch / Stop / Uninstall /
    │                              Volume recovery sections updated)
    └── tests/
        └── test_single_node_sh.sh
```

Subcommands are deliberately minimal — the docker deploy doesn't need
the `auto` / `-i` TUI / per-service restart machinery the dev tool has:

```
bin/single-node.sh up [--with-examples]   docker compose up -d
                                          (add --with-examples to also load the
                                          examples profile: 2 demo workflows +
                                          datasets pre-created on boot)
bin/single-node.sh down [--volumes]       docker compose --profile examples down
                                          (always passes the profile so it
                                          cleans up demo containers if they
                                          were started; --volumes also drops
                                          data volumes — full reset)
bin/single-node.sh status (no-arg)        docker compose ps + URL/login tip 
block
bin/single-node.sh logs <service>         docker compose logs -f <service>
bin/single-node.sh --help                 usage reference
```

Examples profile is **opt-in** — `bin/single-node.sh up` boots the bare
stack so a fresh user starts with an empty workspace. Demo content is
one flag away.

Pre-flight check on `up` / `down` / `status` / `logs`: docker binary on
PATH, daemon reachable, compose v2 available, compose file present.
Failures exit cleanly with a one-line hint — no stack traces. Argument
validation runs **before** the docker pre-flight, so on CI runners
without docker installed the arg-error paths are still exercised
cleanly.

Only `bin/single-node.sh` appears in `--help`, error messages,
status-block tips, and the updated README. The engine at
`bin/single-node/main.sh` is implementation detail — not surfaced in
user-visible text — matching the local-dev convention.

### Any related issues, documentation, discussions?

Closes #5996.

### How was this PR tested?

* `bash bin/single-node/tests/test_single_node_sh.sh` → `8 passed, 0
failed`. Eight cases: bash-syntax across every `*.sh` under
`bin/single-node/`, `--help` output, unknown-subcommand exit code +
`--help` hint, `logs` without arg refuses cleanly without leaking the
engine path, `down --not-a-real-flag` is rejected, `up
--not-a-real-flag` is rejected, `up --with-examples` is accepted by the
flag parser, and (when docker isn't running) every `*` subcommand aborts
cleanly with a "Docker" hint.
* Re-ran the same suite with docker explicitly stripped from `PATH`
(mimicking the macOS GitHub Actions runner shape that broke an earlier
iteration of this PR) — also `8 passed, 0 failed`. Confirms the
arg-validation-before-pre-flight ordering.
* End-to-end:
* `bin/single-node.sh --help` and `bin/single-node.sh status` (no-arg)
render the expected header + URL/login tip block; engine path not
surfaced.
* `bin/single-node.sh frobnicate` → `unknown subcommand: frobnicate (try
\`bin/single-node.sh --help\`)`, exit 1.
* `bin/single-node.sh logs` → `usage: bin/single-node.sh logs
<service>`, exit 1 (no `main.sh` leak).
* Did **not** spin up the actual stack — local machine already has
`texera-local-dev` infra holding the same ports / images, so a real `up`
would clash. The compose-side behavior is unchanged from before this PR
(we're just wrapping the same `docker compose ...` invocations).

Smoke test is auto-discovered by the `infra` GitHub Actions job's `find
bin -name 'test_*.sh'` step; no workflow edits needed. `bin/**` labeler
glob already covers the new files.

### Was this PR authored or co-authored using generative AI tooling?

Generated-by: Claude Code (Anthropic, Claude Opus 4.7).

Report URL: https://github.com/apache/texera/actions/runs/28340287425

With regards,
GitHub Actions via GitBox

Reply via email to