How to Use a Manifest Repo to Track Versions Across Repos
A manifest repo holds one file listing each service pinned version, turning a release into a single reviewable change that CI acts on.
Store a versions.yaml (or JSON) mapping each service to a version. A change to that file is the release trigger: the manifest CI diffs it and dispatches deploys for the services that moved.
Steps
- Keep a
versions.yamlmapping service to pinned version. - On push, diff which services changed version.
- Dispatch deploys only for the changed services.
Manifest file
versions.yaml
services:
api: 2.4.1
web: 5.0.0
worker: 1.9.3Manifest-driven deploy job
.github/workflows/rollout.yml
on:
push:
paths: ['versions.yaml']
jobs:
rollout:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 2
- env:
GH_TOKEN: ${{ secrets.CROSS_REPO_PAT }}
run: ./scripts/deploy-changed-services.shGotchas
- Fetch at least two commits so the job can diff the manifest against the previous version.
- Keep the manifest the single source of truth; drift appears the moment a service deploys outside it.
Related guides
How to Coordinate a Release Across Multiple RepositoriesShip a coordinated release across several repos by driving them from an orchestrator workflow that tags each…
How to Dispatch Deploys to Multiple RepositoriesTrigger deploy workflows in several repos from one place by looping over the repo list and calling gh workflo…