Skip to content

ci+test: consolidated fail-fast CI + tests/ folder (functional & e2e CLI) - #18

Merged
gustavobertoi merged 1 commit into
mainfrom
nightly/ci-e2e
Jun 29, 2026
Merged

ci+test: consolidated fail-fast CI + tests/ folder (functional & e2e CLI)#18
gustavobertoi merged 1 commit into
mainfrom
nightly/ci-e2e

Conversation

@gustavobertoi

Copy link
Copy Markdown
Contributor

Addresses the request: a dedicated tests/ folder driving the built binary, a consolidated fail-fast CI, Docker for the tests that need it, and dependency caching.

tests/ (new)

  • tests/e2e drives the compiled devstack CLI (all //go:build e2e; builds the binary once in TestMain):
    • functional (no daemon): generate + --check, config validate, template list, status, version, up-outside-workspace error.
    • daemon e2e (Docker): full up → status → re-up (idempotent) → down against a real Engine, gated on DEVSTACK_E2E=1 (it mutates the shared stack) with t.Cleanup teardown of the stack + network. Verified locally (14s, green); leaves the machine clean.
  • tests/README.md documents layout + how to run.

CI: 7 jobs → 2

  • ci — one lane ordered cheap → expensive, fail-fast: gofmt → vet → installer lint → static build → unit -race → smoke → determinism → cross-compile (4 targets, one step) → govulncheck → integration (-tags=integration -race) → e2e (-tags=e2e, DEVSTACK_E2E=1). setup-go caches GOMODCACHE+GOCACHE (keyed by go.sum); ubuntu-latest's Docker backs the integration + e2e steps.
  • release-dryrun — kept separate (expensive, independent, needs full history) so it never gates fast feedback.
  • concurrency cancels superseded runs.

Makefile

make integration + make e2e; help regex now matches digit names (e2e).

Note: go test ./... (unit lane) silently skips the all-e2e-tagged package (only explicit paths error), so the static/unit lanes are unaffected — verified.

🤖 Generated with Claude Code

…e2e CLI tests

Per request: a dedicated tests/ folder driving the built binary, a consolidated
fail-fast CI, Docker for the tests that need it, and dependency caching.

tests/ (new):
- tests/e2e — drives the compiled `devstack` CLI. All `//go:build e2e` (never in
  the fast unit lane; builds the binary once via TestMain).
  - functional (no daemon): generate + --check, config validate, template list,
    status, version, and `up` outside a workspace errors.
  - daemon e2e (Docker): a full `up → status → re-up(idempotent) → down` against
    a real Engine, gated on DEVSTACK_E2E=1 (it mutates the shared stack) with
    t.Cleanup teardown of the stack + network. Verified locally (14s, green) and
    leaves the machine clean.
- tests/README.md documents the layout + how to run.

CI (.github/workflows/ci.yml): collapse 7 jobs → 2.
- `ci`: one lane ordered cheap → expensive so a lint/unit failure fails fast
  before the costly Docker + cross-compile work: gofmt → vet → installer lint →
  static build → unit -race → smoke → determinism → cross-compile (4 targets in
  one step) → govulncheck → integration (-tags=integration -race) → e2e
  (-tags=e2e, DEVSTACK_E2E=1). setup-go caches GOMODCACHE+GOCACHE (keyed by
  go.sum); ubuntu-latest's Docker backs the integration + e2e steps.
- `release-dryrun`: kept separate (expensive, independent, needs full history) so
  it never gates the fast feedback.
- concurrency group cancels superseded runs.

Makefile: `make integration` + `make e2e` targets; help regex now matches names
with digits (e2e).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@gustavobertoi
gustavobertoi merged commit 79f4eef into main Jun 29, 2026
2 checks passed
@gustavobertoi
gustavobertoi deleted the nightly/ci-e2e branch June 29, 2026 14:32
gustavobertoi added a commit that referenced this pull request Jun 30, 2026
Designs the "complete devstack = local cloud" vision (4 specs, adversarially
verified) + FEATURES #18-21 + a ROADMAP M9 lane (~14w, stays 0.x):

- 26 CLI completeness & README reconciliation: the README is stale (up/down/
  secrets/trust/dns/tunnel are SHIPPED, only shell/logs are stubs); land real
  shell, up --rebuild/--skip-clone, tunnel up/down, machine-wide workspace
  list + registry, reserve post-1.0 verbs. Ships first as v0.3.0.
- 27 data-plane resource layer: generalize provision-on-demand into a Resource
  model + per-engine Provisioner family (internal/resource) + a declarative
  resources: block (the recommended path) + a new up-saga phase; free-text kind
  ledger (zero migrations), crypto/rand keygen, RemoveProvisioned op.
- 28 cloud-engine templates: LocalStack + ministack (ministack.org AWS-emulation
  image, provides: aws, interchangeable with LocalStack) + NATS (JetStream) +
  Kafka (Redpanda default) + RabbitMQ. Native messaging default, LocalStack opt-in.
- 29 imperative resource commands: db/s3/queue/stream/topic + thin `aws --`
  shim, each mirroring the provision-phase lock->overlay->provisioner->ledger
  flow. db+s3 ship now on the PG/MinIO substrate; messaging gated on spec 28.

Owner decisions recorded: ministack = the ministack.org image (AWS-emulation
engine, not a preset); native NATS/Redpanda default + LocalStack opt-in;
declarative resources: is the recommended path; build spec 26 first then the
substrate + db/s3. Adversarial verify caught + fixed spec 26 duplicating specs
16 (logs)/13 (purge-data)/05 (tunnel-secret-guard).

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant