ADO to GitHub MigrationSingle-page static handbook for repositories, pipelines, and infrastructure
Migration Handbook
Azure DevOps to GitHub
This static page consolidates the migration website into one document. It covers repository migration,
pipeline conversion, discovery, Terraform setup, prerequisites, and automation guidance without relying on Docusaurus routing.
This guide is intended for teams moving source control and delivery workflows from Azure DevOps to GitHub.
It combines the original website content into one HTML page so it can be shared or opened directly without a site generator.
The end-to-end architecture is organized into staged layers so teams can move from discovery to validation with clear traceability.
1. Discovery and prerequisites
Validate Azure DevOps organization and repository access.
Prepare GitHub destination organizations, repositories, and credentials.
Confirm migration scope, sequencing, and success criteria.
2. Migration execution
Run repository migration by web importer or CLI.
Convert or refactor pipelines into GitHub Actions.
Use repeatable scripts to reduce manual variance.
3. Infrastructure and state
Use Terraform-managed Azure resources where infrastructure is part of the move.
Maintain consistent backend and state storage.
Capture outputs and variables needed for deployment workflows.
4. Validation and rollout
Verify repositories, branches, and pipeline behavior.
Run smoke tests and policy validation.
Complete phased rollout and handoff.
Prerequisites
Prepare access, accounts, and clone credentials
Before migrating anything, verify the target GitHub permissions, Azure DevOps repository access, repository clone URLs, and the Personal Access Token required for authentication.
GitHub account and organization setup
Create or confirm a GitHub account with the correct permission scope for the destination repositories.
Push all refs, branches, and tags with mirror mode.
When to use PowerShell automation
Use the scripted approach when migrating multiple repositories in Windows-heavy environments or when you want an opinionated workflow with prerequisite checks and guided prompts.
Interactive input collection for GitHub and Azure DevOps details.
Built-in checks for Git and GitHub CLI.
Automated repository creation, mirror clone, remote add, and push.
Cleanup and optional browser launch at the end.
Common troubleshooting across migration methods
Repository not found: verify the clone URL directly from Azure DevOps.
Authentication failed: confirm username format and PAT scope.
Import timed out or failed: use the CLI path for large repositories.
Missing branches or commits: re-run using mirror clone and mirror push.
12-Step Process
Recommended end-to-end migration workflow
The migration process moves from discovery through preparation, cutover, validation, and production rollout. Follow the steps sequentially and validate each one before proceeding.
Inventory repositories, pipelines, dependencies, and complexity.
Step 2
Environment preparation
Create GitHub org structures, permissions, and migration tooling.
Step 3
Repository migration
Move repositories with full history and validate the result.
Step 4
Azure DevOps lockdown
Make the source repository read-only and notify developers.
Step 5
Secrets and variables
Re-create repository secrets and environment variables in GitHub.
Step 6
Runner configuration
Set up GitHub-hosted or self-hosted runners.
Step 7
Pipeline creation
Convert Azure Pipeline definitions to GitHub Actions workflows.
Step 8
Authentication setup
Configure cloud credentials, OIDC, or service principals.
Step 9
Migration testing
Trigger workflows and validate outputs, deployments, and logs.
Step 10
Issue fixing
Iteratively debug syntax, dependencies, and environment differences.
Step 11
Push final changes
Commit workflow configuration and update supporting docs.
Step 12
Production validation
Run the production pipeline and confirm everything works.
Repository Type
Total Timeline
Typical Notes
Simple
1 to 2 days
No pipelines or minimal integration work.
Medium
3 to 5 days
One or two pipelines plus validation.
Complex
1 to 2 weeks
Multiple pipelines and higher dependency count.
Enterprise
6 to 8 weeks
Many repositories, teams, and phased rollout.
Decision points and rollback guidance
Method selection
Use web import for repositories under 5 GB and simple one-off moves.
Use CLI for large repositories, batch migrations, or Git LFS.
Use PowerShell automation in Windows enterprise workflows.
Runner selection
Use GitHub-hosted runners for standard public-network builds.
Use self-hosted runners for private network access or special toolchains.
Immediate rollback: re-enable Azure DevOps and notify the team.
Partial rollback: keep GitHub repositories but temporarily continue using Azure Pipelines.
Prevention: test in non-production, document rollback, and keep ADO access during transition.
Pipeline Conversion
Map Azure Pipelines concepts to GitHub Actions
Azure DevOps and GitHub Actions both use YAML, but the pipeline model, naming, and integration mechanisms differ. Treat conversion as a structured refactoring rather than a direct text rewrite.
name: CI Pipeline
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '16'
- run: npm install
- run: npm test
Common task mappings
Azure DevOps Task
GitHub Actions Equivalent
checkout: self
actions/checkout@v4
NodeTool@0
actions/setup-node@v4
UseDotNet@2
actions/setup-dotnet@v4
UsePythonVersion@0
actions/setup-python@v5
Docker@2 buildAndPush
docker/build-push-action@v5
AzureCLI@2
azure/login plus shell commands
PublishBuildArtifacts@1
actions/upload-artifact@v4
DownloadBuildArtifacts@0
actions/download-artifact@v4
Conversion guidance
Analyze triggers, agent pools, custom tasks, templates, variables, secrets, and service connections first. The hard part is usually external dependency mapping and authentication, not YAML syntax.
Discovery and Analysis
Front-load the inventory work before the first migration
The discovery phase reduces migration risk by exposing repository size, pipeline complexity, external integrations, and compliance requirements before execution begins.
Repository inventory
Repository name and business owner.
Repository size, large files, and Git LFS usage.
Branch count, commit count, and contributor activity.
Capture triggers, stages, tasks, templates, and dependencies.
List service connections, secrets, and deployment environments.
Identify classic UI pipelines that need manual YAML conversion.
Integration points
Cloud services across Azure, AWS, or GCP.
Artifact registries, package feeds, and container registries.
Monitoring systems such as Application Insights or Datadog.
Notification channels like Teams or Slack.
Security and compliance
Compliance standards and audit expectations.
Secret management requirements.
Access models and environment controls.
Data residency or regulatory constraints.
Complexity
Criteria
Migration Effort
Simple
Under 100 MB, under 10 branches, no pipelines
1 to 2 hours
Medium
100 MB to 1 GB, 10 to 50 branches, 1 to 3 pipelines
4 to 8 hours
Complex
Above 1 GB, many branches, multiple pipelines
1 to 3 days
Critical
Production workloads and high dependency density
3 to 7 days
Risk assessment examples
Risk
Severity
Mitigation
Repository larger than web importer supports
High
Use CLI mirror migration.
Complex pipeline dependencies
Medium
Allocate extra conversion and testing time.
Many active developers
Medium
Schedule migration windows and freeze periods.
Production deployment pathways
High
Stage first and validate with rollback procedures.
Client Discovery
Use a structured questionnaire before planning the cutover
The questionnaire in the original site was designed to collect enough information to define scope, estimate effort, identify risks, and align on success criteria.
Business goals and drivers
Why is the team migrating to GitHub?
What is the required timeline and urgency?
Are there blackout windows or downtime constraints?
How will migration success be measured?
Repository inventory
Total repositories, archived repositories, and test repositories.
Monorepos, large binaries, and branching strategy.
Priority, last activity, and representative complexity samples.
CI/CD and automation
What CI/CD systems are in use today?
How many build, test, deployment, and scheduled pipelines exist?
Are pipelines YAML-based, UI-defined, or mixed?
Are custom tasks, templates, or extensions involved?
Integrations and environments
Which cloud platforms, subscriptions, and accounts are connected?
Where are artifacts stored?
Which monitoring, chat, and quality tools are integrated?
What type of agents or runners are needed?
Questionnaire outcome
The goal is not just information gathering. The output should become a migration plan with repository priorities, identified blockers, target timelines, and success metrics that stakeholders agree to before execution.
Terraform
Infrastructure as code support for repeatable environments
The original Terraform documentation described a supporting Azure infrastructure layout that can be provisioned consistently and tracked in source control.
Resources covered
Azure resource group.
Linux App Service plan.
Linux web app.
Storage account and private container.
Azure Container Registry.
Optional SQL resources noted as currently disabled.
Configuration files
provider.tf for provider and client config.
variables.tf for inputs such as location and tags.
backendstg.tf for remote state storage.
output.tf for resource names and endpoints.
terraform init
terraform validate
terraform plan
terraform apply
Prerequisite
Reason
Terraform installed
Required to initialize, validate, plan, and apply IaC.
Azure CLI installed
Used for Azure authentication and subscription selection.
Azure login completed
Needed before provisioning or planning against a subscription.
PowerShell Automation
Interactive automation for repeatable repository migration
The PowerShell scripts documented in the site automate the CLI path with user prompts, validation, and cleanup. They are intended for Windows users who want a repeatable guided migration flow.
Interactive migration script workflow
Check whether Git is installed.
Check whether GitHub CLI is installed and authenticated.
Prompt for GitHub owner, repository name, Azure DevOps username, PAT, organization, project, and repository name.
Create the destination GitHub repository.
Mirror-clone the Azure DevOps repository.
Add GitHub as a remote and push with mirror mode.
Remove temporary clone data and optionally open the result in a browser.
# Typical steps performed by the script
gh repo create repo-name --private --description "Migrated from Azure DevOps"
git clone --mirror https://ado-user:PAT@dev.azure.com/org/project/_git/repo
cd repo.git
git remote add github https://github.com/github-user/repo-name.git
git push --mirror github
Operational caution
Because the script collects credentials and repository details interactively, confirm that your terminal history, logging, and execution environment are appropriate for handling sensitive values.