Case study / Platform migration

GitLab to GitHub migration with CI/CD, runners and security controls.

A repository migration program moved engineering workloads from GitLab to GitHub while preserving delivery capability, introducing a consistent security baseline and separating runner requirements from repository migration work.

Context

Move the development platform, not just the Git history.

The source platform included repositories, CI/CD definitions, credentials, runner assumptions and security controls. The target therefore needed an operating model for GitHub Actions, repository governance and access controls before migrations could become routine.

BeforeGitLab

Existing delivery model

  • Repositories hosted in GitLab
  • GitLab CI/CD workflows with repository-specific behavior
  • Existing build, release and infrastructure automation
  • Security and runner requirements that varied by workload
AfterGitHub

Target delivery model

  • Repositories hosted in GitHub
  • GitHub Actions for CI/CD and automation
  • Multiple runner classes for different workload constraints
  • Organization-level repository governance and security gates

Constraints

The migration had to preserve delivery behavior while adopting a stricter GitHub operating model.

Repository transfer was the simplest part. Authentication, pipeline semantics, runner placement and security enforcement determined whether the migrated repository could actually operate on the target platform.

SSO and authentication

GitHub access was governed through enterprise SSO, so workflows and automation had to use approved authentication patterns rather than assuming unrestricted personal tokens.

Pipeline translation

GitLab CI/CD behavior had to be mapped to GitHub Actions without losing release sequencing, environment logic or rollback expectations.

Runner diversity

Some workloads fit managed runners while others required Kubernetes-based or cloud-hosted self-managed capacity.

Security baseline

Code, dependency, secret, container and Infrastructure as Code scanning had to become part of the target delivery path rather than an optional follow-up.

Repository governance

Review requirements, rulesets and automated security gates needed to be consistent enough to scale across migrated repositories.

Staged migration

Repositories could not all move as one event. Each migration required validation of source, CI/CD, permissions and runtime dependencies.

Approach

Establish the target baseline first, then make each repository migration repeatable.

The migration pattern separated platform decisions from repository-specific work so the same controls did not have to be rediscovered for every project.

Classify repositories

Identify language, build process, release behavior, secrets, runner needs and external dependencies before migration.

Define the GitHub baseline

Standardize repository settings, review requirements, security checks and target workflow conventions.

Translate CI/CD

Rebuild GitLab pipelines as GitHub Actions workflows while preserving functional behavior and making GitHub-native improvements where useful.

Route workloads to runners

Use managed, Kubernetes-based or cloud-hosted runners according to network, capacity and isolation requirements.

Validate and cut over

Verify builds, tests, security gates, artifact delivery and deployment behavior before treating the GitHub repository as authoritative.

Security and governance

The target platform included controls that were enforced as part of delivery.

The exact checks depended on repository type, but the migration established a reusable security toolchain and organization-level governance model.

Code security

CodeQL and language-specific static analysis were integrated where appropriate for the repository type.

Infrastructure scanning

KICS and related Infrastructure as Code checks were included for Terraform and infrastructure-heavy repositories.

Container and dependency checks

Trivy, dependency security controls and update automation were used to surface vulnerable components earlier in delivery.

Secret detection

Secret scanning and repository controls reduced the risk of credentials entering version control or migration history unnoticed.

Rules and reviews

Repository rulesets and required reviews made key delivery controls enforceable rather than dependent on team convention.

Centralized policy

Organization-level controls provided a common baseline while still allowing repository-specific workflows where needed.

Outcome

A repeatable GitHub migration pattern replaced one-off repository moves.

No synthetic productivity or cost metrics are claimed. The result is described in terms of platform capability, governance and migration repeatability.

GitHub became an operational target

Migrated repositories could build, test and deliver through GitHub rather than existing as read-only copies of GitLab projects.

CI/CD migration became structured

Workflow translation followed a defined pattern instead of being redesigned independently for every repository.

Security moved into the pipeline

Static analysis, dependency, secret, container and IaC checks were integrated with GitHub delivery workflows.

Runner options were explicit

Repository migration no longer depended on a single runner model because workloads could be routed according to execution constraints.

Governance was enforceable

Rulesets, review requirements and automated gates established a consistent operating baseline for migrated repositories.

Migration could continue incrementally

The target platform supported repository-by-repository migration without requiring a single high-risk cutover for the entire engineering estate.

Technology

Repository hosting, automation, runners and security were treated as one platform.

The migration combined GitHub platform configuration with CI/CD engineering and security automation rather than treating them as separate follow-up projects.

GitHubTarget

Target stack

  • GitHub repositories and GitHub Actions
  • GitHub Container Registry
  • Managed and self-managed runner pools
  • Actions Runner Controller for Kubernetes-based runners
  • Organization rulesets and review controls
  • CodeQL and dependency security controls
SecurityPipeline

Security toolchain

  • CodeQL
  • Semgrep
  • Trivy
  • KICS
  • Bandit and Safety where applicable
  • Secret detection and dependency update automation

Planning a GitLab to GitHub migration without breaking delivery?

Start with repository classification, CI/CD behavior, runner constraints and the governance model you need on the target platform.