Repository navigation
Publishing Docker Images
Index · Publishing to PyPI · Publishing to Artifactory
Three images are published to GitHub Container Registry (GHCR) via GitHub Actions, from one matrix job in docker-publish.yml: testo-runner (Dockerfile.testo-runner, the CLI for running cycles in CI, and the default image stages run in with TESTO_RUNNER=container), testo-server (Dockerfile.testo-server, the API with the web UI built in, used by the Team Server) and testo-runner-service (Dockerfile.testo-runner-service, the service that starts each stage in a throwaway container, Runs in throwaway containers). Images are built for linux/amd64 and linux/arm64 on the floating python:3.11-slim-bookworm base, so each build picks up current Debian security fixes, and are scanned with Trivy before they are pushed.
-
Registry:
ghcr.io -
Images:
ghcr.io/taltal-beep/testo-runner,ghcr.io/taltal-beep/testo-server,ghcr.io/taltal-beep/testo-runner-service -
Auth: Uses
GITHUB_TOKEN(automatic for public repos, no additional secrets needed)
- Create a GitHub Release with a semver tag (e.g.
v1.0.0). - The
docker-publish.ymlworkflow triggers automatically:- Checks the tag matches the
pyproject.tomlversion. - For each image, scans its Dockerfile with Trivy for configuration issues.
- Builds the
linux/amd64image locally, scans it with Trivy for fixable critical vulnerabilities and checks it starts (testo run --helpfor the runner; the API imports and the UI build is in place for the server). Nothing is pushed if either fails. - Builds the multi-arch image (
linux/amd64,linux/arm64) via Docker Buildx and pushes it to GHCR, tagged with semver (1.0.0), major.minor (1.0), major (1), commit SHA, andlatest.
- Checks the tag matches the
- To rebuild the image for an existing release (for example after a base-image fix), run the workflow by hand from the Actions tab with the tag as input. It builds the selected branch, so use it only when that branch carries the same package version.
- The first push of each image creates a private package (
testo-serveris new as of 2026-10-22,testo-runner-serviceas of the release after 1.2.0). Make it public once under the package's settings (Package settings → Danger Zone → Change visibility).
| Tag pattern | Example | When applied |
|---|---|---|
| Full semver | 1.0.0 |
Every release |
| Major.minor | 1.0 |
Every release (floating) |
| Major | 1 |
Every release (floating) |
| Commit SHA | 03043a2b |
Every release |
latest |
latest |
Default branch releases only |
docker pull ghcr.io/taltal-beep/testo-runner:latest
docker run --rm ghcr.io/taltal-beep/testo-runner:latest run --help# GitHub Actions
- name: Run tests
run: |
docker run --rm \
-v ${{ github.workspace }}:/workspace \
ghcr.io/taltal-beep/testo-runner:1.0.0 \
run --cycle smoke --ci
# docker-compose.yml (override)
services:
runner:
image: ghcr.io/taltal-beep/testo-runner:1.0.0-
Trivy blocks the build: Fix the reported vulnerabilities or update the base image. Critical and high severity issues block the Dockerfile scan; fixable critical issues block the image scan. The v1.1.1 release run failed this way on 2026-10-19 because the base was pinned to
python:3.11.9-slim-bookworm, after the vulnerable image had already been pushed; the scan now runs before the push. -
Multi-arch build fails: Ensure QEMU is set up correctly (the workflow handles this with
docker/setup-qemu-action). -
Image pull fails: For private repos, authenticate with
docker login ghcr.io -u <username> --password-stdinusing a PAT withread:packagesscope.
- Publishing to PyPI — Python package publishing
- CI-CD Pipeline Setup — CI workflow overview
- Workflow file:
.github/workflows/docker-publish.yml - Dockerfile:
Dockerfile.testo-runner
Generated from docs/Processes & Guides/Publishing Docker Images.md. Edit it there; changes made in the wiki are overwritten.
Architecture
CLI Commands
Processes & Guides
- CI-CD Pipeline Setup
- E2E Harness Operations Guide
- GitLab Pages Demo
- Publishing Docker Images
- Publishing to Artifactory
- Publishing to PyPI
- Team Server
Prompts & Snippets
Roadmap & Strategy
Specs & ADRs
- Alerts Where Developers Look - 2026-10-22
- Architecture Consolidation - 2026-10-06
- BehaveX Reports - 2026-10-21
- Command Adapter and JUnit Import - 2026-09-25
- Config JSON Schema - 2026-10-22
- Delta Comparison Policy
- Docs Site - 2026-10-19
- Docs Vault and Wiki Sync - 2026-10-07
- Flaky Test Quarantine - 2026-10-22
- GitHub Action PR Comment - 2026-10-19
- Ingest and Team Server - 2026-10-22
- Interview Readiness Fixes - 2026-10-07
- Library Packaging
- Open Source Features - 2026-10-19
- Phase 3 Delta Comparison Engine Plan
- Phase 3 Unified Dashboard Plan
- Phase 4 BYOK and Failure Analysis
- Phase 5 UI Redesign - Cycles-First Navigation
- Playwright Adapter - 2026-10-19
- Playwright JSON Import - 2026-10-22
- Plugin API - 2026-10-19
- Product Roadmap Work - 2026-10-25
- Product to Ten - 2026-10-25
- Specs & ADRs
- Repository Pattern - Database-Agnostic Refactor
- Scale Runs and Stages - 2026-10-24
- Switchable Team Features - 2026-10-24
- Throwaway Stage Containers - 2026-10-24
- UI Restyle - 2026-10-19
Testing Workflows
Vault