Migrate from GitLab to GitHub

Groups, subgroups and GitLab CI, from GitLab.com or self-managed. Includes and CI/CD components become reusable workflows, and variables land as secrets, variables and environments, scoped the way they were.

Pipelines and GitLab.com repositories run in the app
.gitlab-ci.ymlGitLab
include:
  - project: platform/ci-templates
    file: /templates/maven-build.yml
    inputs:
      java_version: "21"

build:
  extends: .maven-build
  stage: build
.github/workflows/ci.ymlGitHub Actions
name: ci
on: [push, pull_request]
jobs:
  build:
    uses: acme/ci-templates/.github/workflows/maven-build.yml@v4
    with:
      java_version: "21"
    secrets: inherit
A shared CI template include becomes a call to the reusable workflow built from it.

Trusted by teams moving to GitHub at scale

What moves

Everything your GitLab estate runs on.

  • Repositories

    GitLab.com groups and subgroups, exported and moved with full history. Self-managed with our team.

  • GitLab CI

    .gitlab-ci.yml, includes and CI/CD components, from GitLab.com or self-managed.

  • Shared templates

    project and component includes become reusable workflows or building blocks.

  • Variables

    Masked variables become secrets, protected ones environment secrets, and scoped ones GitHub Environments.

  • Group variables

    Group and instance variables become organization-level secrets and variables.

  • Security templates

    GitLab SAST and dependency templates map to CodeQL and Dependabot.

inventoried together, up to 50 groups per connection
Groups + subgroups
GitLab CI pipelines from either
.com + self-managed
per shared include or component, not one per project
1 workflow

How it maps

GitLab concepts, in GitHub Actions terms.

Predefined variables such as $CI_COMMIT_SHA map to their GitHub context equivalents, like github.sha.

How GitLab configuration maps to GitHub Actions
GitLabGitHub Actions
stages:jobs with needs:
rules: if $CI_PIPELINE_SOURCE == "merge_request_event"on: pull_request
extends: / !referenceflattened, or a composite action
include: project / componentreusable workflow or building block
include: template (SAST)CodeQL / Dependabot
artifacts: expire_inupload-artifact retention-days
cache:actions/cache
parallel: matrixstrategy.matrix
when: manualEnvironment with required reviewers
resource_groupconcurrency

No surprises at cutover.

The parts that need a person are named in the plan up front, so they are decided before cutover, not discovered during it.

What needs a person

  • Remote includes, which are never fetched from the internet automatically
  • Runner tags, confirmed against your runner labels rather than guessed
  • Pipeline schedules, multi-project triggers and cross-project needs
  • Docker-in-Docker jobs and Git LFS objects

GitLab-specific

  • Groups and subgroups are inventoried together, and overlapping groups are caught before anything moves
  • Variable scopes are preserved: environment_scope becomes a GitHub Environment
  • Projects are exported a few at a time, so your GitLab instance stays responsive

The same method for every GitLab estate.

See the full method
  1. 01Inventory everything
  2. 02Convert families, not files
  3. 03Ship in waves of pull requests
  4. 04Cut over with rollback

Your migration, your way

Run it yourself, or run it with us.

Self-serve

Migration Assistant

The whole program in one app: inventory, families, waves of pull requests and cutover. Built for platform teams who want to drive.

  • Inventory, families, waves and cutover in one app
  • Pull requests to repository owners, not tickets
  • Start free on 10 repositories, no card
Start free on 10 repositories →

With our migration team

Migration services

We scope, plan and run the move alongside your team, on the same platform, for the estates and deadlines that can't slip.

  • GitHub Enterprise Cloud to EMU and data-residency moves
  • Scoping, wave plans and cutover support
  • The custom pipelines nobody wants to touch
  • A team that has done this at enterprise scale

After the move

Land clean, then stay clean.

CodeCargo Manage keeps every repository on the standards and building blocks you migrated onto, fixing drift as pull requests, as far on its own as you allow.

See how Manage works

GitLab migration questions.

Don't see yours? Our migration team will walk through your GitLab estate with you.

Do you support GitLab self-managed?

Yes. GitLab CI pipelines convert from both GitLab.com and self-managed instances. GitLab.com repositories move in the app; self-managed repositories are moved with our migration team.

What happens to GitLab CI includes and components?

Shared includes and CI/CD components become reusable workflows or building blocks, so every project calls one definition instead of carrying its own copy.

How are GitLab CI/CD variables migrated?

Masked variables become secrets, protected variables become environment secrets, environment-scoped variables become GitHub Environments, and group variables become organization-level secrets and variables.

Will the migration slow down our GitLab instance?

No. Projects are exported a few at a time, so the instance stays responsive for the teams still working in it.

Find out how many weeks
your migration takes.

Or start free on 10 repositories.

Migrate GitLab to GitHub: Repos and GitLab CI | CodeCargo