Adopt Dagger for CI pipeline, replacing docker-compose #10

Closed
opened 2026-05-23 20:54:23 +00:00 by coilysiren · 1 comment
Owner

Originally filed by @coilysiren on 2026-04-14T09:24:46Z - https://github.com/coilysiren/gauntlet/issues/3

Why

Gauntlet is the best-fit repo in the coilysiren portfolio to adopt Dagger:

  1. Already a multi-container pipeline. docker-compose.yml has api, demo, and test services with healthcheck-gated dependencies. This is exactly what Dagger replaces — the compose topology becomes a typed Python function where test depends on api.as_service(), with real caching between runs.
  2. uv already in use. Dagger's Python SDK is first-class and plays nicely with uv. pyproject.toml needs no changes.
  3. Dagger's LLM/agent primitives map onto what Gauntlet is. Dagger shipped LLM-native pipeline nodes in 2025 — pipeline steps can call Anthropic/OpenAI with tool-use, sandboxed per run. Gauntlet already orchestrates Anthropic + OpenAI as attacker/inspector; running those inside Dagger gives per-run caching, parallelism, and a trace UI for free.
  4. Matrix runs become trivial. The (attacker × inspector × target) combinatorial explosion is ugly in compose or pytest. In Dagger it's a map over a list of configs.
  5. Local = CI. Same function runs on laptop and in GitHub Actions. No duplicated pipeline definitions, no "works on my machine."

Scope

  • Add dagger-io to dev dependencies via uv
  • Create ci.py (or gauntlet/ci/) with a dagger.Client-based module
  • Port api service → Dagger function returning a Service
  • Port demo service → Dagger function that consumes api
  • Port test service → Dagger function running pytest -m "not docker"
  • Add a top-level test() function composing the three
  • Add a matrix function for (attacker_type × inspector_type) combinations
  • Wire into GitHub Actions as a single dagger call test step
  • Delete docker-compose.yml once parity is reached
  • Update README.md / CONTRIBUTING.md with the new dev loop

Non-goals

  • Not adopting Dagger in other coilysiren repos yet (backend is a candidate second, but after this beachhead proves out)
  • Not replacing invoke/tasks.py workflows outside CI

Context

_Originally filed by @coilysiren on 2026-04-14T09:24:46Z - [https://github.com/coilysiren/gauntlet/issues/3](https://github.com/coilysiren/gauntlet/issues/3)_ ## Why Gauntlet is the best-fit repo in the coilysiren portfolio to adopt [Dagger](https://github.com/dagger/dagger): 1. **Already a multi-container pipeline.** `docker-compose.yml` has `api`, `demo`, and `test` services with healthcheck-gated dependencies. This is exactly what Dagger replaces — the compose topology becomes a typed Python function where `test` depends on `api.as_service()`, with real caching between runs. 2. **`uv` already in use.** Dagger's Python SDK is first-class and plays nicely with uv. `pyproject.toml` needs no changes. 3. **Dagger's LLM/agent primitives map onto what Gauntlet *is*.** Dagger shipped LLM-native pipeline nodes in 2025 — pipeline steps can call Anthropic/OpenAI with tool-use, sandboxed per run. Gauntlet already orchestrates Anthropic + OpenAI as attacker/inspector; running those inside Dagger gives per-run caching, parallelism, and a trace UI for free. 4. **Matrix runs become trivial.** The (attacker × inspector × target) combinatorial explosion is ugly in compose or pytest. In Dagger it's a `map` over a list of configs. 5. **Local = CI.** Same function runs on laptop and in GitHub Actions. No duplicated pipeline definitions, no "works on my machine." ## Scope - [ ] Add `dagger-io` to dev dependencies via `uv` - [ ] Create `ci.py` (or `gauntlet/ci/`) with a `dagger.Client`-based module - [ ] Port `api` service → Dagger function returning a `Service` - [ ] Port `demo` service → Dagger function that consumes `api` - [ ] Port `test` service → Dagger function running `pytest -m "not docker"` - [ ] Add a top-level `test()` function composing the three - [ ] Add a matrix function for (attacker_type × inspector_type) combinations - [ ] Wire into GitHub Actions as a single `dagger call test` step - [ ] Delete `docker-compose.yml` once parity is reached - [ ] Update `README.md` / `CONTRIBUTING.md` with the new dev loop ## Non-goals - Not adopting Dagger in other coilysiren repos yet (backend is a candidate second, but after this beachhead proves out) - Not replacing `invoke`/`tasks.py` workflows outside CI ## Context - Upstream: https://github.com/dagger/dagger - Python SDK: https://docs.dagger.io/sdk/python - Motivation is also career/platform-eng signal — Dagger is trending in 2025-2026 alongside Backstage as a "programmable CI" story.
Author
Owner

Iceboxed in the 2026-05-29 backlog burn-down: Speculative 'adopt Dagger tool' wish, no current dependency. Reopen anytime if it becomes real.

Iceboxed in the 2026-05-29 backlog burn-down: Speculative 'adopt Dagger tool' wish, no current dependency. Reopen anytime if it becomes real.
coilysiren 2026-05-30 05:44:10 +00:00
  • closed this issue
  • added the
    P4
    label
Commenting is not possible because the repository is archived.
No description provided.