You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This plan provides a structured, security-first approach to adopting GitHub Enterprise Cloud, migrating from Azure DevOps. It is organized into 11 phases (0–10), progressing from foundational governance through pilot migration. The philosophy is "governance before migration" — all security, policies, identity, and structure must be validated before any code moves.
Cost Considerations (High-Level)
Item
Pricing Model
Notes
GitHub Enterprise Cloud
Per-user/month
All enterprise members
GitHub Secret Protection
Per active committer/month
Secret scanning + push protection (formerly part of GHAS)
GitHub Code Security
Per active committer/month
CodeQL + Dependabot + Copilot Autofix (formerly part of GHAS)
GitHub Copilot Business
Per-seat/month
IDE + Chat + CLI
GitHub Actions
Per-minute (hosted) or self-hosted
Linux $0.008/min; Windows $0.016/min; estimate from gh actions-importer forecast
ADO overlap period
Double licensing risk
ADO Advanced Security + GHAS run in parallel during transition
⚠️GHAS Unbundling: As of 2024, GitHub Advanced Security was split into GitHub Secret Protection and GitHub Code Security — two separately-licensed SKUs. Budget and enable each independently. Contact GitHub Sales for current pricing.
💡 Work with GitHub Sales to build a detailed cost model in Phase 0 before proceeding.
⚠️Staffing Note: This compressed timeline requires Security SME and Platform Engineer at 30-40% during their peak phases (not 10-20%). The Migration Lead backup should be identified by Week 1. Phases 2-3 and 6-7 can partially overlap to stay on track.
Approach Challenge & Rationale
The original email proposed a linear phase sequence. After deep analysis of GitHub Enterprise documentation, ADO migration guides, and best practices, this plan restructures and enriches the phases as follows:
Original Phase
Revised Phase
Rationale
Phase 0: Review docs
Phase 0: Discovery & Planning
Inventory ADO, plan org structure, align stakeholders (EMU already established)
Effort: ~2 weeks | Who: Migration Lead (100%) + Project Sponsor (20%) Priority: 🔴 CRITICAL — Must complete before any technical work Deliverable: ADO inventory complete, org structure planned, stakeholders aligned
✅ Enterprise type already decided: This is an EMU (Enterprise Managed Users) organization with SSO/SCIM already established. Phase 0 focuses on ADO inventory, org structure planning, and stakeholder alignment.
✅ Enterprise account and SSO/SCIM already exist. This phase focuses on validating the existing setup, configuring migration-specific policies, and ensuring audit logging is active.
1.1 Enterprise Account Validation
Task
Owner
Status
Verify enterprise account is operational (EMU)
Enterprise Admin
☐
Confirm enterprise shortcode and username format (user_shortcode)
Enterprise Admin
☐
Verify setup user credentials ({shortcode}_admin) are accessible and tested
Security SME
☐
Verify 3-5 Enterprise Owners are assigned with hardware security keys (U2F/WebAuthn)
Enterprise Admin
☐
Verify Billing Managers are assigned
Enterprise Admin
☐
Review and adjust spending limits (Actions, Packages) for migration workloads
Billing Manager
☐
1.2 SSO/SCIM Validation for Migration
Task
Owner
Status
Verify OIDC or SAML is configured and enforced at enterprise level
Security SME
☐
Test SSO authentication flow is working
Security SME
☐
Verify SSO auto-redirect is enabled
Security SME
☐
Test break-glass procedure — verify setup user can access enterprise if IdP is down
Security SME
☐
Verify Conditional Access Policies are appropriate (if Entra ID)
Security SME
☐
1.3 SCIM Provisioning Validation
Task
Owner
Status
Verify SCIM provisioning is active and syncing users
Security SME
☐
Verify IdP group sync is provisioning teams correctly
Security SME
☐
Verify all ADO committers are SCIM-provisioned — critical for mannequin reclamation
Security SME
☐
Test user deprovisioning — verify instant access revocation
Security SME
☐
Test user reactivation flow
Security SME
☐
⚠️Critical for migration: Any ADO committer NOT provisioned via SCIM will appear as an unrecoverable mannequin in GitHub. Verify provisioning coverage before Phase 8.
1.4 Network Security
Task
Owner
Status
Document corporate VPN/office/cloud IP ranges
Network/Security
☐
Configure enterprise IP allow list
Enterprise Admin
☐
Add GitHub-hosted runner IPs (or plan self-hosted runners)
Platform Engineer
☐
Test access from allowed and non-allowed IPs
Security SME
☐
1.5 Audit Logging
Task
Owner
Status
Enable audit log streaming to SIEM (Splunk, Azure Sentinel, Datadog)
Security SME
☐
Enable source IP display in audit logs
Security SME
☐
Configure log retention strategy (GitHub retains audit events ~180 days, Git events only ~7 days; stream for longer retention and SIEM)
Security SME
☐
Create alerting rules for privilege changes, policy changes, suspicious activity
Security SME
☐
🔑 Key: Stream audit logs from day 1. GitHub does not retain indefinitely.
Phase 2: Organization Structure & Policies
Effort: ~1-2 weeks | Who: Migration Lead (100%) + Sponsor (10%) Priority: 🔴 HIGH Prerequisites: Phase 1 complete Deliverable: Organizations created with security policies enforced
2.1 Create Organizations
Organization
Purpose
Status
company-green
Main development (innersource)
☐
company-red
Confidential/regulated repos
☐
company-sandbox
Experiments, POCs, trial migrations
☐
company-archive
Historical/retired repos
☐
2.2 Enterprise-Level Policies (Enforced Across All Orgs)
Policy
Setting
Status
Base repository permissions
Enforce: No permission
☐
Repository creation
Enforce: Organization Owners only
☐
Public repository creation
Disable
☐
Repository visibility change
Restrict to Org Owners
☐
Repository deletion/transfer
Restrict to Org Owners
☐
Repository forking
Restrict within same org
☐
Default branch name
Enforce: main
☐
Outside collaborators
Restrict to Org Owners
☐
Block user namespace repos (EMU)
Enable (mandatory for EMU — prevents personal repos)
☐
Deploy keys
Restrict (prefer GitHub Apps)
☐
Issue deletion
Restrict to Org Owners
☐
2.3 Organization-Level Settings (Per Org)
Setting
Green Org
Red Org
Sandbox
Archive
Base permission
None
None
None
None
Default repo visibility
Internal
Private
Internal
Internal
Team creation
Org Admins only
Org Admins only
Org Admins only
Org Admins only
Outside collaborators
Org Owners only
Org Owners only
Org Owners only
Disabled
OAuth app restrictions
Enable
Enable
Enable
Enable
2.4 PAT Policies
Policy
Setting
Status
Fine-grained PAT access
Allow with approval
☐
Classic PAT access
Restrict or Block
☐
PAT maximum lifetime
90-365 days
☐
Fine-grained PAT approval
Require approval
☐
Phase 3: Teams, Permissions & Access Model
Effort: ~1-2 weeks | Who: Migration Lead (100%) + Security SME (10%) Priority: 🟡 HIGH Prerequisites: Phase 2 complete Deliverable: Team hierarchy created, IdP sync operational, CODEOWNERS model defined
⚠️GHAS is now two SKUs:GitHub Secret Protection (secret scanning + push protection) and GitHub Code Security (CodeQL + Dependabot + Copilot Autofix). Budget and enable each independently.
Configure push protection bypass permissions (Security team only, with approval workflow)
Security SME
☐
4.3 ADO Advanced Security → GHAS Migration
Since ADO Advanced Security is already in place:
⚠️Critical: ADO Advanced Security alert history does NOT migrate to GHAS. When GHAS runs its first scan on migrated repos, it generates a fresh alert set. Existing ADO alert state (open/dismissed/fixed + rationale) must be exported beforehand and reconciled manually.
ADO Feature
GHAS Equivalent
Migration Action
ADO Code Analysis
CodeQL + SARIF
Map rules, start with default setup, expand to advanced; run shadow comparison on 2-3 pilot repos for 2 weeks
ADO Secret Detection
Secret scanning + push protection
Enable org-wide, add custom patterns; ⚠️ expect historical scan alert flood on first enable
ADO Dependency Alerts
Dependabot + dependency review
Enable org-wide, configure .github/dependabot.yml
Alert Baseline Reconciliation:
Task
Owner
Status
Export ADO AdvSec alert inventory (open/dismissed/fixed with rationale) as CSV — completed in Phase 0.4
Security SME
☐
After GHAS first scan on pilot repos, reconcile GHAS findings against ADO export
Security SME
☐
Carry forward known-false-positive dismissals to GHAS
Security SME
☐
Document detection-parity gaps (rules in ADO not covered by CodeQL)
Security SME
☐
Plan for SARIF import of historical scan results using upload-sarif action if audit trail needed
Security SME
☐
Estimate and plan for alert triage workload — secret scanning historical backfill can generate hundreds of alerts
Temporarily bypass org rulesets that could block import (add "Repository migrations" bypass)
Migration Lead
☐
8.2.1 Mannequin Reclamation Strategy
⚠️EMU Critical: Mannequins can ONLY be reclaimed to users already provisioned via SCIM. Complete SCIM provisioning for all committers of pilot repos BEFORE migration. Unprovisioned committers become permanently unrecoverable mannequins.
Task
Owner
Status
Create ADO user → GitHub EMU user mapping file before migration
Migration Lead
☐
Verify all pilot repo committers are SCIM-provisioned in EMU
Migration Lead
☐
Document criteria for unmapped users (reclaim as specific identity or accept mannequin)
Migration Lead
☐
Plan mannequin reclamation effort (manual CSV workflow — slow at scale)
Migration Lead
☐
8.2.2 Git LFS Migration Procedure
GEI does NOT migrate LFS objects. For repos identified with LFS in Phase 0.4:
# 1. Clone the repo with full LFS content from ADO
git clone --mirror https://dev.azure.com/ORG/PROJECT/_git/REPO
cd REPO.git
git lfs fetch --all
# 2. Push everything including LFS objects to GitHub
git remote set-url origin https://github.com/ORG/REPO.git
git push --mirror
git lfs push --all origin
Task
Owner
Status
For each LFS repo: clone with --mirror, fetch all LFS, push to GitHub
Migration Lead
☐
Verify LFS objects are accessible after push (clone from GitHub, git lfs pull)
Migration Lead
☐
⚠️Execute LFS migration immediately after GEI migration, BEFORE developer unfreeze and CI validation. Broken LFS = broken builds.
8.3 Azure Pipelines Hybrid Integration (CRUCIAL)
During migration, repos move to GitHub while Azure Pipelines remains. This requires rewiring:
Impact Area
Action Required
Priority
Pipeline templates
Update type: git → type: github, add endpoint
🔴 High
Repository resources
Update name format from Project/Repo to Org/Repo
🔴 High
Service connections
Create GitHub App service connection in Azure DevOps
🔴 High
Resource triggers
⚠️resources.repositories triggers are limited for GitHub repos — implement webhooks or GitHub Actions triggers. resources.pipelines triggers are unaffected.
🔴 High
CI/PR triggers
Generally continue working, but require repo-by-repo validation (check names, branch filters, path filters)
🟡 Medium
Status checks/PR gates
Verify check names match — ADO check names may differ when repo source changes
🟡 Medium
Hybrid Model Setup:
Task
Owner
Status
Create GitHub App service connection in ADO project settings
Platform Engineer
☐
⚠️EMU Requirement: The GitHub App must be installed by an Enterprise Owner. PAT-based service connections do NOT work with EMU. For multiple ADO organizations, create a separate service connection per ADO org.
| Test service connection with a sample pipeline | Platform Engineer | ☐ |
| Inventory all pipelines referencing repos being migrated | Platform Engineer | ☐ |
| Identify all template dependencies (extends, template) | Platform Engineer | ☐ |
| Document all resource triggers (will stop working) | Platform Engineer | ☐ |
| Prepare pipeline YAML updates in branches (ready to deploy on cutover) | Platform Engineer | ☐ |
| Plan alternative for resource triggers (webhooks / GitHub Actions → Azure Pipeline) | Platform Engineer | ☐ |
⚠️Critical: If you use a central template repository, ALL pipelines referencing it must be updated atomically when that repo moves to GitHub. This cannot be done incrementally.
Deploy Azure Pipeline YAML updates (template/resource type changes)
Platform Engineer
13
Verify CI/CD pipelines execute successfully
Platform Engineer
14
Remove temporary allow list entries and ruleset bypasses
Migration Lead
16
Migrate Git LFS objects (if applicable)
Migration Lead
17
Rotate all credentials — new secrets in GitHub, revoke ADO migration PATs
Security SME
18
Notify developers with new repo URLs and access info
Developer Champion
19
Revoke ADO write access for migrated repos
Migration Lead
⚠️Post-cutover grace period: Maintain a 24-48h commit freeze on GitHub after migration before declaring success. If critical issues arise, reverse-sync to ADO with git remote push during this window.
9.3 Rollback Strategy
GEI has no built-in rollback. Mitigate with:
Strategy
Detail
Trial first
Always run trial migration in sandbox org
Freeze source
No changes during cutover window
Keep ADO accessible
Don't delete ADO repos until validation complete — keep read-only for minimum 2 weeks per wave
Grace period
24-48h commit freeze on GitHub post-migration before declaring success
Reverse-sync
During grace window: git remote push from GitHub back to ADO if abort needed
If migration fails
Keep ADO as source of truth, fix issues, re-run
ADO retention policy
Define formal sign-off gate before deleting any ADO repos (recommend: 30 days after validation)
Incident checklist
Day-of-cutover: if pipeline breaks → check GitHub status → check ADO service connection → revert YAML if needed
Communication
Pre-communicate rollback criteria to stakeholders
9.4 Exception & Bypass Request Process
Task
Owner
Status
Define RACI for ruleset/policy exceptions
Security SME
☐
Create exception request template (GitHub Issue or internal ticket)
Define auto-rollback mechanism for temporary bypasses
Migration Lead
☐
Document escape hatch: Org Owners + Security SME approval + recorded reason
Security SME
☐
Phase 10: Pilot Migration & Validation
Effort: ~2-3 weeks | Who: Migration Lead (100%) + Platform Engineer (15%) + Developer Champion (15%) Priority: 🟡 HIGH Prerequisites: Phase 9 Go decision Deliverable: Successful pilot migration, validated repos, lessons learned document
10.1 Pilot Repo Selection
Select 3-5 repos with these characteristics:
Criteria
Why
Low production risk
Minimize impact if issues arise
Medium size with PR history
Test GEI migration fidelity
At least 1 repo with branch policies
Test ruleset mapping
At least 1 repo with Azure Pipeline
Test hybrid model
Active development team willing to provide feedback
Validate developer experience
10.2 Execute Pilot Migration
Follow the Cutover Runbook from Phase 9.2 for each pilot repo.
10.3 Validation Checklist (Per Repo)
Pilot Success Criteria: ALL validation items must pass. Any failure = "critical" blocker for Wave 1. Approval Authority: Sponsor + Security SME sign-off on lessons learned before Wave 1 planning.
Validation
Status
Git history complete (all commits, branches, tags)
☐
Pull requests migrated with history
☐
Repository visibility correct
☐
Team access permissions working
☐
CODEOWNERS file present and working
☐
Branch protection ruleset applied
☐
GHAS features active (secret scanning, CodeQL)
☐
Dependabot configured and scanning
☐
CI/CD pipeline executes (Azure Pipelines from GitHub)
☐
PR workflow works (create PR → review → CI passes → merge)
☐
Copilot accessible to pilot developers
☐
Developer can clone, push (to feature branch), and create PR
Total findings: ~70 across all reviewers. 20+ critical/high items were incorporated into the final document. Remaining medium/low items are listed below for future refinement.
Corrections Applied
Category
Examples
Factual corrections
GHAS unbundled into 2 SKUs; SHA pinning is not a native toggle; audit log Git events = 7 days; OIDC only for EMU
Context: The customer has an existing EMU enterprise with ADO Advanced Security in place. The team consists of 1 member dedicated 100% and 4 others supporting at 10-20%. The goal is a phased GitHub Enterprise Cloud adoption (Phases 0–10) covering governance, security, and migration.
Original phased outline provided:
Phase
Description
0
Review tentative plan, docs, and reference materials
1
Enterprise Policies and Settings
2
Organization Policies and Settings
3
Teams
4
Repository Settings (pilot repo)
5
Repository Rulesets
6
Documentation of all decisions (what and why)
7
Global security review of plan, policies, and settings
8
Pilot migration and Azure Pipelines integration (crucial)
9
Go/No-Go Checklist for Migration
10
Pilot Migration with few repos
Key requirements from the original request:
Read all reference docs to understand concepts and the migration/adoption plan
Focus on setup, configuration, structure, governance, policies, settings, and advanced security
Once governance is in place, target ADO → GitHub repo migration, Azure Pipelines rewiring, and pilot team migrations
Focus on phases and create a high-level plan that can be detailed as each phase is worked on