← All playbooks
CI/CD migration

GitLab → GitHub Actions

Move GitLab CI pipelines, jobs, runners, variables, schedules, artifacts, environments, and release operations into GitHub Actions without treating an importer pull request as a finished cutover.

Typical timeline15–40 business days60–140 hours active work
Statusneeds review
Source profileGitLab documentation reviewed 2026-10-24
Destination profileGitHub Actions documentation reviewed 2026-10-24
Documentation date
Review window
Evidence3 sources
This route needs review.Use it as a planning baseline, then verify the dated sources and test with representative data before production.
Before you migrate

Should you make this move?

Both platforms have a case. Compare what you gain with what you give up before scheduling the cutover.

Current platform

GitLab

Reasons to stay
  • A comprehensive DevSecOps platform offers deep CI/CD and self-hosting options
  • Repository-centered workflows keep code, review, and automation close together
Reasons to leave
  • Breadth, upgrades, and administration can be heavy for smaller teams
  • Advanced governance and automation can become configuration-heavy
New platform

GitHub Actions

What gets better
  • Automation lives beside the repository with an enormous reusable action ecosystem
  • Repository-centered workflows keep code, review, and automation close together
What gets worse
  • Large workflows can become slow, opaque, and expensive to debug
  • Advanced governance and automation can become configuration-heavy
Best of the move

GitHub Actions: Automation lives beside the repository with an enormous reusable action ecosystem. This removes a major source-side concern: Breadth, upgrades, and administration can be heavy for smaller teams.

Worst of the move

What you lose: A comprehensive DevSecOps platform offers deep CI/CD and self-hosting options. What you inherit: Large workflows can become slow, opaque, and expensive to debug.

Jump to a section
01At a glance

Know the shape of the move.

Transfer outcome12 features audited
Transfer outcome distributionClean transfer: 0, Partial transfer: 5, Manual rebuild: 5, Not transferred: 2.
Clean0
Partial5
Manual5
Lost2
Mapping route9 of 9 fields have a destination path

This timeline assumes

  • Up to 100 active pipelines, 50 runners, and 30 shared templates
  • Repository, infrastructure, security, and release owners approve equivalent pipeline behavior.
  • Destination workflows remain disabled until source queues drain.
  • Representative builds and releases can run safely in an isolated environment.
  • The migration team records evidence for every blocking verification check.
02What transfers

What survives the move.

“Partial” and “manual” are not footnotes. They are work that must be scheduled and verified.

ItemOutcomeImpactWhat happensMitigation
Pipeline YAML and job intentpartialcriticalGitHub documents a syntax map: script becomes run, tags become runs-on, image becomes container, rules become if, and stages become needs. The Actions Importer can convert many pipelines, then still leave manual steps.Run audit, forecast, dry-run, and migrate per namespace, then review every workflow pull request.
Importer coverage and audit scopepartialhighThe audit command only works with a GitLab organization account. Dry-run and migrate work for organization or user accounts. Automatic caching between jobs in different workflows is not supported.Treat unsupported caches as a redesign and keep a ledger of failed or partial conversions.
Masked variables and secretslostcriticalGitHub lists masked project or group variable values as a manual task. Secret values must never travel inside exported YAML.Recreate and rotate credentials as repository or organization secrets with least privilege.
Artifact reportsmanualhighThe importer does not migrate GitLab artifact reports. Artifacts that persist files still need upload-artifact and matching retention.Rebuild test, coverage, and security reports as Actions artifacts or checks.
Runners, tags, and capacitymanualcriticalGitLab tags choose a runner. GitHub uses runs-on. Self-hosted labels from a converted pipeline are not created for you.Build reproducible runners and load-test peak concurrency before cutover.
Triggers and pipeline schedulespartialcriticalGitLab pipeline schedules live in the UI. GitHub schedules use on.schedule in the workflow file. Push, merge-request, and manual rules need an if expression.Test every trigger and prevent duplicate schedules during the dual-CI window.
Includes, templates, and reusable piecesmanualcriticalGitLab include and extends do not become Actions automatically. Teams that used templates usually rewrite reusable workflows or custom actions.Inventory each template and pin a replacement action or reusable workflow.
CachespartialhighGitLab cache keys and paths map conceptually to actions/cache. Cross-workflow automatic caches do not convert.Rewrite cache keys from lockfiles and compare hit rates on a rehearsal branch.
Environments, approvals, and protected releasesmanualcriticalDeployment gates, reviewers, and environment protection need GitHub Environments.Rebuild separation of duties and run a controlled staging release.
Build history and job logslostmediumHistorical GitLab pipelines stay in GitLab. The importer writes conversion files, not past job logs.Archive required evidence before the source becomes read-only.
Notifications and external integrationsmanualhighChat, incident, deployment, and reporting callbacks need new credentials and payloads.Test success, failure, cancel, and timeout notifications.
Dual-CI mirror lagpartialhighA GitLab push mirror can lag for minutes while both CIs run. Teams that compare the same commit can see GitHub start later than GitLab.Measure mirror delay and avoid treating late GitHub starts as workflow defects.
03Field and feature mapping

Where each thing goes.

SourceDestinationMethodNotes
GitLab job scriptGitHub Actions run steptransformKeep checkout explicit with actions/checkout.
Runner tagruns-on labeltransformCreate missing self-hosted labels before enabling the workflow.
imagecontainertransformPin the image digest when the job is production-critical.
rulesif expressiontransformTest branch, merge-request, and schedule filters.
stageneeds dependencytransformPreserve failure and ordering behavior.
CI/CD variable or masked variableGitHub Actions secret or variablemanualRotate masked values. Do not paste them into YAML.
cache pathsactions/cachetransformCross-workflow caches need a new design.
artifacts paths or reportsactions/upload-artifact or a checkmanualReports do not convert automatically.
include, extends, or templateReusable workflow or custom actionmanualPin versions and review permissions.
04Before you begin

Make the move recoverable.

Backup procedure

Create the source-of-truth backup

Preserve GitLab data, configuration, and operating evidence before any destination write.

  1. Export GitLab CI YAML, includes, variables inventory, schedules, environments, runners, and audit evidence.
  2. Inventory every credential reference, network dependency, notification, and release target.
  3. Record recent duration, queue, failure, retry, and artifact baselines.
  4. Hash configuration exports and archive required historical logs.

Proof to capture: A signed manifest reconciles every scoped record class, runtime dependency, export file, count, and hash.

Transformation · GitHub Actions Importer audit and migration workbook

Pipeline capability inventory

Map syntax, templates, runners, credentials, triggers, and release controls.

  1. Run gh actions-importer audit gitlab for each organization namespace.
  2. List secrets, self-hosted labels, and unknown build steps from the summary.
  3. Reject unmapped critical jobs.

Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.

Transformation · Importer dry-run, dual CI, and artifact comparison

Converted workflow test harness

Prove artifact and deployment equivalence before writes move.

  1. Dry-run each active pipeline and review the YAML.
  2. Run the same revision on GitLab and GitHub.
  3. Reconcile accepted, rejected, and rewritten steps.

Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.

05Handle with care

The things most likely to hurt.

These are operating limits. Treat every “Stop if” condition as a blocked migration, not a suggestion.

Pilot

Converted workflows pass but produce different artifacts

criticalpossible likelihood

A green build hides dependency, environment, or packaging differences.

Consequence
Bad releases reach users.
Mitigation
Compare checksums, provenance, tests, and deploy side effects.

Stop if: A critical artifact or release invariant differs.

Cutover

Both systems trigger deployments

criticalpossible likelihood

The same commit starts GitLab and GitHub release workflows.

Consequence
Deployments race or duplicate changes.
Mitigation
Disable destination deploy jobs until source queues drain, then switch once.

Stop if: Any source deployment can still start after ownership moves.

Security

Runner or secret access is over-broad

criticalpossible likelihood

Untrusted code can reach credentials or protected networks.

Consequence
Build compromise becomes production compromise.
Mitigation
Use isolated least-privilege runners and short-lived identity.

Stop if: A test job can access an unauthorized secret or network.

06Precise timeline

Do the work in this order.

Estimate forUp to 100 active pipelines, 50 runners, and 30 shared templates
Total elapsed15–40 business days
Active work60–140 hours
BufferAdd time for a monorepo, self-hosted runner fleets, many templates, or a long dual-CI proving period.
01
Days 1–4Inventory and decisions3–4 days
02
Days 4–7Backup and reconcile2–3 days
03
Days 7–24Map and pilot8–16 days
04
Days 20–35Final delta and switch1–5 days
05
Days 22–50Observe and close4–12 days
  1. Days 1–4 · inventory

    Inventory and decisions

    8–16 hours active3–4 days elapsedOwner review waiting
    • Inventory GitLab pipelines, templates, runners, variables, and integrations.
    • Approve which jobs convert, rewrite, or retire.

    Depends on: GitLab and GitHub Actions administrator access

    Stop / go checkpoint

    Export?

    Go when: Every critical item has an owner and disposition.

    Stop when: Consent, billing, access, or system ownership is unclear.

  2. Days 4–7 · backup

    Backup and reconcile

    5–10 hours active2–3 days elapsedExport processing waiting
    • Export pipeline YAML, variable inventories, and recent job evidence.
    • Reconcile counts, totals, and hashes.

    Depends on: Approved inventory

    Stop / go checkpoint

    Transform?

    Go when: Source totals and export manifests agree.

    Stop when: Any critical dataset or configuration is absent.

  3. Days 7–24 · pilot

    Map and pilot

    20–70 hours active8–16 days elapsedDual-CI comparison waiting
    • Convert a test repository, then lower-impact projects.
    • Run GitLab and GitHub on the same revisions and compare artifacts.

    Depends on: Verified backup

    Stop / go checkpoint

    Scale?

    Go when: Pilot mappings, behavior, access, and evidence pass.

    Stop when: Any critical check fails or produces unexplained variance.

  4. Days 20–35 · cutover

    Final delta and switch

    6–24 hours active1–5 days elapsedQueue drain waiting
    • Disable GitLab writers and deploy jobs.
    • Enable GitHub as the only automation platform and run blocking checks.

    Depends on: Passed pilot and approved rollback

    Stop / go checkpoint

    Open production?

    Go when: Counts reconcile and one destination system owns production.

    Stop when: A source writer remains active or a blocking check fails.

  5. Days 22–50 · observe

    Observe and close

    4–20 hours active4–12 days elapsedOperating-cycle evidence waiting
    • Monitor one complete operating cycle.
    • Sign the verification report and close rollback only after stability.

    Depends on: Verified cutover

    Stop / go checkpoint

    Close rollback?

    Go when: No trigger occurs during the agreed observation period.

    Stop when: Data, access, delivery, routing, or business results regress.

07The point of change

Cut over with a way back.

Go live

Cutover

Make GitHub Actions the only production automation system without losing the final GitLab delta.

Recommended window: A low-volume weekday morning with platform, security, and release owners available.

  1. Drain GitLab deploy queues and disable production GitLab pipelines.
  2. Enable the approved GitHub workflows and protected environments.
  3. Switch remotes, deploy keys, and release integrations to GitHub.
  4. Run every blocking verification check and keep GitLab readable.
  5. Keep the source intact through the rollback window.

Proof to capture: GitHub Actions owns production automation, totals reconcile, and every blocking check has durable evidence.

Return to safety

Rollback

Return production automation to GitLab without losing destination-era changes.

Deadline: Within seven days and before source data, plans, credentials, domains, or billing are changed.

  1. Stop new GitHub deploy workflows.
  2. Restore the prior GitLab pipeline schedules, deploy jobs, and remotes.
  3. Export GitHub post-cutover workflow and release evidence.
  4. Review and apply safe destination-era changes to GitLab.
  5. Run the same blocking checks against the restored source.

Proof to capture: GitLab again owns production automation with current configuration and no duplicate destination action.

Rollback immediately when
  • Unexplained critical count or value variance
  • Missing or exposed critical data
  • Duplicate production action
  • Failed access, routing, delivery, or integration check
  • A critical feature has no safe destination replacement
08Verification report

Prove the migration worked.

Every blocking check must pass. Capture the evidence before cleanup begins.

0%
Interactive report preview0 / 8 checks passed
PassIDCheckMethodExpected resultEvidence
V-01BlockingPipeline coverageReconcile active GitLab jobs to destination workflows or retirements.Every job has one approved disposition.Pipeline ledger.
V-02BlockingCommand and test parityRun identical revisions and inputs.Required tests and exit behavior match.Run comparison.
V-03BlockingBinary equivalenceCompare checksums, metadata, provenance, and retention.Approved artifacts match.Artifact report.
V-04BlockingEvent and schedule behaviorExercise push, merge request, manual, and cron paths.One correct run per approved event.Trigger log.
V-05BlockingEnvironment and capacityTest tools, network, isolation, and peak concurrency.Jobs run within approved security and time objectives.Runner report.
V-06BlockingSecrets and permissionsRun allowed and denied access tests.Least privilege and no secret disclosure.Security evidence.
V-07BlockingApprovals and deploymentRun a controlled staging and production release.Gates, concurrency, rollback, and notifications pass.Release evidence.
V-08BlockingSingle automation platformInspect source queues, triggers, webhooks, and schedules.GitHub Actions alone starts approved work.Cutover checklist.
09Post-migration cleanup

Remove the scaffolding safely.

Safe after: One complete operating cycle, at least seven stable days, and owner sign-off on every blocking check.

  1. Create final GitLab exports and archive verification evidence.
  2. Revoke temporary credentials, API keys, webhooks, and elevated roles.
  3. Remove obsolete pipelines, schedules, integrations, and unused runners.
  4. Keep the source intact through the approved retention window.
  5. Cancel paid plans only after billing, legal, and recovery review.
  6. Schedule the next GitHub Actions backup, access, and migration-playbook review.
10Experiences from the field

When the plan met reality.

First-hand accounts are preferred. Vendor case studies are labeled, and every note below is an editorial paraphrase—follow the link for the full context.

First-person accountJoseph DeChicchis and Sachin Ananth Navale · Clear Street

GitLab to GitHub Part 2: Ready, set, migrate!2023

Clear Street Engineering described moving self-hosted GitLab CI to GitHub Actions over two and a half quarters, with one quarter spent on the Fleet monorepo. They mirrored GitLab to GitHub, ran dual CI, and built Octomigrator so each GitLab merge request opened a GitHub pull request and posted the Actions result back. Lower-impact Terraform and Retool repos moved first. Cutover was disabling GitLab writes and switching remotes. They later measured p90 queue time around 80 seconds and reported mirror lag from a few minutes up to 15 minutes during the side-by-side phase.

What they recommend
  • Mirror the repository and run both CIs on the same changes until you can fail the source pipeline when the destination workflow fails.
  • Move a low-traffic repository first, then recruit a person from each team that owns a different pipeline.
Worth noticing
  • The hard work was proving parity on a monorepo, not flipping the git remote.
  • GitLab’s push mirror added minutes of delay while both systems ran, which slowed the comparison loop.
First-person accountBram Wiepjes · Baserow

We moved one of the most-starred projects on GitLab to GitHub2026

Baserow CEO Bram Wiepjes wrote that the project left GitLab as its primary home in November 2025 and kept GitLab as a read-only mirror. The largest piece of work was rebuilding CI for GitHub Actions, which they said had no simple one-to-one path from .gitlab-ci.yml. Issues and open merge requests moved with a modified node-gitlab-2-github after a test on an empty repository. After the move they reported more than 1,000 GitHub stars in about three months, faster pipelines, and some GitLab review features they still missed.

What they recommend
  • Budget a CI rewrite instead of a mechanical YAML conversion, and keep the old GitLab file as evidence.
  • Rehearse issue and merge-request import on an empty repository before you touch the production project.
Worth noticing
  • CI rebuild time dominated the migration even for a team that already had a GitHub mirror.
  • Community reach drove the platform change, while review workflow details were the main regret.
Sources and evidence

Verify against the primary material.

Platform behavior changes. Check these sources and the review dates above before executing a production migration.

  1. GitHub: migrate from GitLab CI/CDAccessed 2026-10-24
  2. GitHub: GitLab Actions ImporterAccessed 2026-10-24
  3. GitLab: CI/CD YAML syntaxAccessed 2026-10-24