Skip to content

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

@coilysiren

Description

@coilysiren

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions