GitHub Workflows
GitHub Workflows Documentation
This document provides an overview of all GitHub Actions workflows used in the launcher project.
Last Updated: 2026-06-02
Workflow Summary
| Workflow | File | Triggers | Purpose |
|---|---|---|---|
| CI | ci.yml | push, PR, merge_group, schedule, manual | Testing, linting, building, cross-platform binaries |
| Deploy Docs | deploy-docs.yml | push to main (docs paths), workflow_dispatch | Multi-version docs deployment |
| Release | release.yml | version tags | Release with GoReleaser, SBOM, docs deploy |
| Create Release | release-create.yml | workflow_dispatch | Pre-release test gate + tag creation |
| PR Review | pr-review.yml | pull_request | Two-pass AI code review via claude-max-proxy |
| Claude | claude.yml | PR/issue/comment events | @claude AI assistant |
The last five workflows are thin callers that delegate to reusable workflows in go-kure/.github. See go-kure/.github AGENTS.md for their full documentation.
CI Workflow
File: .github/workflows/ci.yml
Name: CI
Triggers
- Push to:
main,develop,release/* - Pull requests to:
main,develop - Merge group (merge queue’s temporary branch — required checks must report here)
- Schedule: 4am UTC daily (catch external changes)
- Manual dispatch
Concurrency
Uses github.ref to cancel superseded runs on the same branch or PR:
Job Dependency Graph
On merge_group events (merge queue), lint/test/build run against the queue’s
temporary branch — the merged result — before the PR is allowed to land.
Jobs Detail
| Job | Check Name | Timeout | Dependencies | Purpose |
|---|---|---|---|---|
changes | detect-changes | 2 min | — | Path filter: go: and docs: outputs control downstream jobs |
validate | lint | 20 min | changes | go-version, fmt, tidy, vet, lint; diff-based lint on PRs |
test | test | 25 min | changes | Unit tests with race detection and coverage (-race); CGO enabled |
security | Security | 10 min | changes | govulncheck, outdated deps check, sensitive file scan |
coverage-check | Coverage Check | 5 min | test | 80% threshold, Codecov upload, PR sticky comment |
build-binaries | Build kurel | 10 min | changes, test | Build kurel linux/amd64 binary; uploaded as artifact |
docs-build | docs-build | 15 min | changes | Hugo site build for docs; go + Hugo caches |
build | build | 1 min | validate, test, build-binaries, docs-build, coverage-check | Aggregation gate |
cross-platform | Cross-Platform Build | 15 min | build-binaries | Matrix: linux × amd64/arm64 (main + release/* only) |
analyze-changes | Analyze Changes | 5 min | — | Changed files summary, breaking change warning for pkg/ (PR only) |
Cross-Platform Matrix
Runs on main and release/* branches only (not PRs):
| OS | amd64 | arm64 |
|---|---|---|
| linux | ✅ | ✅ |
Configuration
- Go Version: read from
mise.toml(single source of truth) - Golangci-lint Version:
v2.10.1 - Coverage Threshold:
80% - Test Timeout:
5m(longer than kure; builds include CGO)
Features
- Path filtering —
dorny/paths-filterskips jobs when unrelated files change - Diff-based lint — on PRs, lint only checks new/changed lines (
--new-from-rev) - CGO enabled — test job installs
build-essentialfor cgo-dependent packages - Binary artifact —
kurellinux/amd64 binary uploaded per run (7-day retention) - Cross-platform artifacts — 5 binaries uploaded per main push (30-day retention)
- Skip draft PRs —
if: github.event.pull_request.draft == false - make install guard — every job that calls
makeinstalls it first (runner image lacks it)
Deploy Docs Workflow
File: .github/workflows/deploy-docs.yml
Name: Deploy Docs
Triggers
- Push to main (paths:
site/**,docs/**,*.md,CHANGELOG.md,DEVELOPMENT.md,scripts/gen-versions-toml.sh) - Manual dispatch with inputs:
version_slot,version_label,set_latest
How It Works
- Determines version parameters (dev for push to main, explicit slot for manual dispatch)
- Reads Hugo and Go versions from
mise.toml - Runs
scripts/gen-versions-toml.shto generate versioned Hugo config overlay - Builds the Hugo site targeting
https://www.gokure.dev/launcher/<slot>/ - If
set_latest=true, also builds athttps://www.gokure.dev/launcher/ - Checks out
go-kure/go-kure.github.ioand deploys to thelauncher/subdirectory
Trigger Matrix
| Event | Deploys To | BaseURL |
|---|---|---|
Push to main (docs paths) | launcher/dev/ | www.gokure.dev/launcher/dev/ |
workflow_dispatch | launcher/<slot>/ | www.gokure.dev/launcher/<slot>/ |
workflow_dispatch + set_latest=true | launcher/<slot>/ + launcher/ | both |
Concurrency
Per-slot group (deploy-docs-<slot>) with cancel-in-progress: false — deploys queue rather
than cancel, so a race between two slot deployments doesn’t corrupt the site.
Preservation
Only the target slot is replaced. Other launcher/v*/, launcher/dev/, CNAME, and .nojekyll
are preserved. The root launcher/ files are only overwritten when set_latest=true.
Authentication
Requires DEPLOY_TOKEN secret — a PAT with write access to go-kure/go-kure.github.io.
Merge Queue
launcher merges through GitHub’s native merge queue (configured in the main-protection
ruleset, not a workflow file). This replaced the former rebase-check job and auto-rebase.yml
workflow — it is the native equivalent of GitLab’s merged-results pipelines.
How It Works
- A reviewed PR is added to the queue (“Merge when ready”).
- The queue creates a temporary branch combining
main+ the PR and fires amerge_groupevent;lint/test/buildrun against that merged result. - If green, the PR lands on
mainwith the rebase merge method (linear history preserved). If the merged result fails, the PR is dropped from the queue andmainstays green.
Why
- Tests the actual merged result, which
rebase-check(ancestry-only) could not. - No force-pushing contributor branches and no per-merge auto-rebase storm — the queue rebases once, at merge time.
Configuration (ruleset merge_queue rule)
- Merge method:
REBASE(linear history) - Grouping:
ALLGREEN(a failing entry is dropped from the group) - Batch size: 1 (conservative; tune after observing runner load)
- Required checks on the queue:
lint,test,build(must also trigger onmerge_group)
Auto-merge is not enabled — every PR is reviewed and queued manually. The merge queue rule is
managed centrally in go-kure/.github (governance/repository-settings-policy.yaml).
Release Workflow
File: .github/workflows/release.yml
Reusable source: go-kure/.github/.github/workflows/release.yml@main
Triggers
- Push of version tags:
v*(triggered byrelease-create.yml)
Job Sequence
Key Input
Requirements
Secrets: RELEASE_APP_ID, RELEASE_APP_PRIVATE_KEY (kure-release-bot GitHub App)
Create Release Workflow
File: .github/workflows/release-create.yml
Reusable source: go-kure/.github/.github/workflows/release-create.yml@main
Triggers
- Manual dispatch with inputs:
type(alpha/beta/rc/stable/bump),scope(minor/major),dry_run(default: false)
Purpose
Pre-release test gate + tag creation. Runs full tests before pushing any tag, so a failing test suite never results in a published release.
Requirements
Secrets: RELEASE_APP_ID, RELEASE_APP_PRIVATE_KEY (GitHub App token, so tag push triggers
subsequent workflows — GITHUB_TOKEN pushes do not trigger workflows).
PR Review Workflow
File: .github/workflows/pr-review.yml
Reusable source: go-kure/.github/.github/workflows/pr-review.yml@main
Triggers
- Pull requests:
opened,synchronize,ready_for_review,reopened - Skips draft PRs and fork PRs
How It Works
Two-pass AI review via the cluster-local claude-max-proxy sidecar:
- Pass 1 — Review: Sends PR diff +
AGENTS.md+.claude/CLAUDE.mdto the review model. Posts up to 3 findings in a structured table as a PR comment. - Pass 2 — Assessment: If the review found issues, an assessment model fact-checks each finding against the actual diff and the provided standards. Posts a verification comment.
Non-blocking: uses continue-on-error: true so review failures never prevent merging.
Context Input
Claude Workflow
File: .github/workflows/claude.yml
Reusable source: go-kure/.github/.github/workflows/claude.yml@main
Triggers
- PR events (opened, synchronize, ready_for_review, reopened)
- Issue comments and PR review comments (when
@claudeis mentioned) - Issues opened or assigned
- PR reviews submitted
Purpose
Runs the anthropics/claude-code-action@v1 agent on any PR or issue that mentions @claude.
The agent has full repo access via checkout and can read code, answer questions, or suggest
changes.
Requirements
Secret: CLAUDE_CODE_OAUTH_TOKEN
Configuration Standards
Go Version
All jobs read go-version from mise.toml dynamically:
mise.toml is the single source of truth (kept in sync via make check-go-version).
Caching
Module and build caches use explicit actions/cache@v5 steps with cache: false on setup-go:
Cache and artifact traffic routes through an in-cluster cache server. Setting
ACTIONS_RESULTS_URL in the workflow env: block ensures upload/download-artifact and
actions/cache see the correct in-cluster URL (the runner binary patch renames the env var
injected into step processes as a side effect).
Self-Hosted Runner
All jobs run on the autops-kube-kure GitHub ARC scale-set. The runner image lacks make,
so every job that calls make installs it first:
Maintenance Notes
- When adding/modifying workflows: Update this document
- Version updates: Run
make sync-go-versionto update Go version across all files - Version check: Run
make check-go-versionto verify consistency - New jobs using
make: Include the install guard step above - Reusable workflows: Changes in
go-kure/.githubtake effect immediately for all callers
See Also
- Makefile — Local development commands
- mise.toml — Local tool versions
- go-kure/.github AGENTS.md — Reusable workflow reference
- scripts/gen-versions-toml.sh — Versioned docs config generator