Skip to content

Phase 3: deploy one isolated live runner and prove one-job destruction #7

Description

@Nickfost

Outcome

Deploy one controller on one isolated Docker host, register one organization-level experimental scale set, run one manually dispatched read-only job, and prove that the runner and job resources disappear afterward.

sequenceDiagram
  participant O as Operator
  participant G as GitHub
  participant C as ci-fleet controller
  participant R as ephemeral runner
  O->>C: start with MIN=0 MAX=1
  O->>G: dispatch read-only pilot
  G->>C: desired runners = 1
  C->>R: create with one JIT config
  R->>G: execute pilot
  G->>C: job completed
  C->>R: capture logs and destroy
  O->>C: verify no residue
Loading

Prerequisites

  • Select one isolated Docker host and assign a stable fleet instance ID
  • Create an organization-owned GitHub App with Metadata read-only and Self-hosted runners read/write
  • Install the App on only the target organization
  • Store the PEM only at /etc/ci-fleet/secrets/github-app.pem
  • Create/restrict the experimental runner group to the pilot repository
  • Complete the committed preflight without warnings

Pilot

  • Start exactly one unique host scale set with MIN=0, MAX=1
  • Confirm zero runner containers before dispatch
  • Dispatch the committed read-only pilot workflow
  • Confirm exactly one runner appears and accepts the job
  • Confirm the job has only contents: read
  • Confirm the runner container is destroyed after completion
  • Confirm no job containers, networks, volumes, workspaces, or credentials remain
  • Save controller and host-health evidence without secret values

Rollback

  • Stop the controller
  • Verify/delete only this host's experimental scale set
  • Run scoped cleanup in dry-run mode, inspect, then apply if needed
  • Remove the App installation and local PEM if the pilot is abandoned
  • Confirm existing downstream-consumer runners remain unchanged

Hard gates

  • Do not target downstream consumers yet.
  • Do not allow public repositories or fork-originated code to use the group.
  • Do not raise maximum concurrency above one.
  • Do not use a PAT.
  • Stop immediately if preflight, permissions, lifecycle cleanup, or residue checks fail.

Repository preparation evidence

  • Unique scale-set identity per host plus shared routing-label model implemented
  • Public ci-fleet repository excluded from live runner access
  • Private-repository pilot workflow template committed
  • GitHub App permissions and secret-storage runbook committed
  • Host preflight, maintenance timers, and rollback procedure committed
  • Inert controller and runner image validation passed

Evidence: commit 8447ef8, validation run 29287297659.

The issue remains open at the host, private pilot repository, runner-group, and GitHub App authorization gate.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions