How to Migrate CI Incrementally by Running Both in Parallel
A safe cutover runs the old CI and GitHub Actions side by side, keeps the old one authoritative, and only makes Actions a required check once results match.
Do not flip everything at once. Add the Actions workflow alongside the existing pipeline, leave the old system as the required check, compare outcomes for a while, then swap the required status to Actions and retire the old config.
Phases
| Phase | Action |
|---|---|
| 1. Shadow | add Actions workflow, keep old CI required |
| 2. Compare | watch both on the same PRs for divergence |
| 3. Promote | make the Actions check required |
| 4. Retire | remove old config once Actions is trusted |
Shadow workflow
.github/workflows/ci.yml
# Runs in parallel with the old CI but does not block merges yet.
on: [push, pull_request]
jobs:
ci:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm ci && npm testWhat does not map cleanly
- Running two systems doubles minutes during the overlap; keep the shadow window short, or use cheaper managed runners such as Latchkey while you compare.
- Only one system should be a required check at a time to avoid confusing merge gates.
- Remove the old config in the same PR that promotes Actions so history stays clear.
Related guides
How to Use GitHub Actions Importer to Migrate PipelinesUse the gh actions-importer CLI extension to audit and dry-run convert Jenkins, GitLab, CircleCI, Azure, Trav…
How to Migrate Reusable Pipeline Patterns to GitHub ActionsReplace GitLab templates, CircleCI orbs, and YAML anchors with GitHub Actions reusable workflows and composit…