Charm release and promotion process

GitHub runner charm releases move through three Charmhub channels: latest/edge, latest/candidate, and latest/stable.

Publication to latest/edge and promotion to latest/candidate are automated. Two decisions require human review:

  • whether to take a candidate revision into production, and

  • whether a candidate revision has truly soaked in production long enough to become stable.

        flowchart TD
  PUSH[Push to main] --> EDGE[Publish all charms to latest/edge]
  EDGE --> DAILY[Daily edge-to-candidate workflow]
  DAILY -->|edge ahead of candidate| E2E[GARM end-to-end test]
  E2E -->|pass| CAND[Release garm and garm-configurator to latest/candidate]
  CAND --> PROD[Human approves the production promotion]
  PROD --> WEEKLY[Weekly candidate-to-stable workflow]
  WEEKLY -->|7-day soak, approved| STABLE[Release latest/candidate to latest/stable]
    

Channel flow

Every push to main publishes all charms to latest/edge through .github/workflows/publish_charms.yml.

Once a day, promote_edge_to_candidate.yaml compares the edge revision with the candidate revision. If edge is not ahead of candidate, the workflow skips so the repository does not run the expensive end-to-end test. When edge is ahead, the workflow runs the GARM end-to-end test from garm_e2e.yaml against the published edge revision. If that test passes, the workflow releases the new revision to latest/candidate.

Only two charms move through this automated edge-to-candidate promotion: garm and garm-configurator. They always move together because the end-to-end test covers the two charms simultaneously: one revision of garm is validated against only one other revision of garm-configurator. The promotion does not require a new edge revision for both charms — the check step compares each charm’s edge and candidate revisions independently, and promotes whichever charm is ahead. If only garm gets a new revision, garm-configurator is retested and re-released at its current, unchanged edge revision alongside it. A successful promotion leaves latest/candidate holding a pair that was validated together.

Charmhub has no way to release two charms in one transaction, so the workflow releases garm first and garm-configurator after. If the garm-configurator release fails, then latest/candidate holds a mismatched pair. The workflow says so in its run summary, naming what it already released.

Human review gates

Production does not follow candidate automatically. Instead, production is pinned to a specific candidate revision, and moving that pin to a newer candidate revision requires a human to review and approve the change. That approval is the production gate.

Once a candidate revision has soaked for seven days, the weekly promote_candidate_to_stable.yaml workflow promotes it to latest/stable. The workflow uses a GitHub Environment named charmhub-stable with required reviewers so a human approves the stable release at the end of the soak window.

Production promotion gate

This gate decides whether a candidate revision should move into production. The reviewer checks that the revision is the one they want to run in the live environment before approving the change that moves the production pin.

charmhub-stable environment gate

This gate decides whether a candidate revision is ready to become stable. The weekly workflow measures soak time using the Charmhub candidate release timestamp. That timestamp proves when the revision was published to latest/candidate; it does not prove that production ran that revision for the full soak window. The reviewer at this gate must confirm that the revision really has been running in production for the required time.

The charmhub-stable environment

The stable gate needs one piece of repository configuration: a GitHub Environment named charmhub-stable with required reviewers. It already exists. The environment carries no secrets of its own — the weekly workflow authenticates to Charmhub with the repository-level CHARMHUB_TOKEN secret, the same one the other release workflows use. The environment is there for the approval, not for the credentials.

A missing environment would not cause the workflow to fail — GitHub treats environment: pointing at nothing as a no-op and runs the job straight through. The weekly workflow therefore queries the environment using its verify-environment job and fails the run if it is absent.

Hotfixes and rollbacks

Maintainers can release hotfixes to candidate or restore earlier revisions manually. Both paths still require approval before production changes.