This repository contains our reusable GitHub Actions workflows for consistent CI/CD across all our applications. All projects follow RC semantic versioning for both applications and Helm charts.
- Trigger: PR to
mainbranch - Process:
- Build and push Docker images with SHA tags
- Release Please creates semantic versions for both app and chart
- Retag images with RC semantic versions
- Update dev cluster with new image digests + human-readable tags
- Build and publish Helm charts with RC tags
- Update dev cluster with new chart versions
- Result: Auto-merged PRs to dev cluster on green checks
- Note: Both application and Helm chart get RC versions (e.g.,
1.8.0-rc.1)
- Trigger: Manual workflow dispatch in app repo
- Process:
- Extract current dev versions (chart + image digests + tags)
- Retag Docker images with GA semantic versions
- Create GA Helm chart release via Release Please
- Build and publish GA chart
- Promote dev versions to production cluster (including tags)
- Result: PR to production cluster for manual review
- Note: Both application and Helm chart get GA versions (e.g.,
1.8.0)
docker-build-and-push.yml: Build multi-component Docker images, push to GHCR with SHA tags, output digestsdocker-image-retag-ga.yml: Retag existing images with semantic versions (RC/GA) using digests as source, outputs component→version mapping
helm-chart-build-and-publish.yml: Build and publish Helm charts to OCI registryrelease-please.yml: Semantic versioning and release management using Release Pleaserelease-please-enable-automerge.yml: Enable auto-merge on Release Please PRs (reusable)
cluster-config-bump-image-digests.yml: Update ArgoCD applications with new image digests + human-readable tags (dev)cluster-config-bump-chart-version.yml: Update ArgoCD applications with new chart versions (dev)production-promotion.yml: Promote dev versions to production cluster (dev → prod mapping, including tags)
- Human-readable tags alongside digests for better operability
- Zero change to pull semantics - still pin by digest for reproducibility
- Pod labels for
kubectland dashboard visibility - Backward compatible - existing deployments continue working
release_version: Global semver (e.g.,1.8.0-rc.1)image_tags_json: Component-specific mapping (e.g.,{"api":"1.8.0-rc.1"})
image:
repository: ghcr.io/owner/repo/component
digest: sha256:abc123... # Source of truth for pulls
tag: 1.8.0-rc.1 # Human-readable metadata
podLabels:
app.kubernetes.io/version: 1.8.0-rc.1 # For kubectl visibility- Copy workflow files from
captide-document-engine/.github/workflows/ - Update component names and paths
- Configure Release Please configs (
release-please-rc.json,release-please-ga.json) - Set required secrets and variables
App repos should create their own orchestrator workflows using the reusable templates. Reference the workflow files in this repository for implementation examples.
To enable automatic merging of Release Please RC PRs, add the auto-merge workflow to your app repo. See the workflow templates for the complete implementation.
Repository Settings Required:
- Settings → General → Allow auto-merge ✅
- Branch protection on
main: Require status checks (your CIbuildjob etc.) - Do not require push-only jobs (retag/publish/bump) on PRs
CAPTIDE_APP_ID: GitHub App ID for cluster config accessCAPTIDE_APP_PRIVATE_KEY: GitHub App private key
- RC:
1.2.3-rc.1,1.2.3-rc.2(pre-releases) - GA:
1.2.3(stable releases) - Images: Always use digests for retagging, never SHA tags
- Tags: Human-readable metadata alongside digests for operability
- Per-component semver: Each component should have independent versioning (e.g., multiple background workers versioned separately)
- App tags:
v2.0.0,v2.0.0-rc.1(withvprefix) - Helm chart tags:
helm-v1.5.2,helm-v1.5.2-rc.1(withhelm-prefix) - Rationale: Clear distinction between application and infrastructure releases, especially when using Release Please for both
- Selective builds: Use
dorny/paths-filterto only build components that have changed - Lightweight images: Keep Docker images as small as possible for faster builds and deployments
- Fast workflows: Optimize workflow execution time through efficient caching and parallel jobs
- Dev: Automatic via CI/CD pipeline
- Production: Manual via
production-promotion.ymlworkflow in app repo - Coalesced PRs: Multiple updates create/update same PR branch
- Tag Preservation: Image tags flow through promotion pipeline
- RC: New chart package with
-rcsuffix - GA: New chart package from same commit (not retagging)
- Signing: Use
--signfor production charts
- App Changelog:
CHANGELOG.mdin repository root - Chart Changelog:
deploy/helm/{app-name}/CHANGELOG.md - Release Please Configs:
.github/release-please-rc.jsonfor RC releases.github/release-please-ga.jsonfor GA releases
- Conventional Commits: Use
feat:,fix:,breaking:prefixes for automatic changelog generation - Separate PRs: Each package (app/chart) gets its own release PR when changes are detected