Azure DevOpsからGitHubへリポジトリを移行する手順
目次
はじめに
MS開発部の松坂です。
これまでAzure DevOpsで管理していたソースコードを、GitHubへ移行する機会があったため、今回実施した移行手順を備忘録としてまとめます。
今回は複数のリポジトリをまとめて移行するため、GitHub CLIとgh-ado2ghを利用し、PowerShellから移行処理を実行しました。
また、リポジトリを移行して終わりではなく、移行後にはアクセス権やブランチ保護、Secretsなど、GitHub側であらためて確認・設定する項目があります。
本記事では、実際の移行作業から移行後の設定までを順番に紹介します。
1.GitHub CLIをインストール
まず、GitHub CLIをインストールします。
GitHub CLIは、コマンドラインからGitHubのリポジトリ操作やPull Requestの作成など、さまざまなGitHubの操作を実行できるツールです。
今回利用するgh-ado2ghもGitHub CLIの拡張機能として利用するため、最初にGitHub CLIを準備します。
以下はWinGetを利用したインストールのコマンドになります。|
1 |
winget install --id GitHub.cli |
インストール後、PowerShellなどから以下のコマンドを実行して、インストールできていることを確認します。
|
1 |
gh --version |
バージョン情報が表示されれば、GitHub CLIのインストールは完了です。
2.gh-ado2ghをインストール
続いて、Azure DevOpsからGitHubへの移行に利用するgh-ado2ghをインストールします。
gh-ado2ghは、GitHub CLIの拡張機能として提供されており、Azure DevOpsのリポジトリなどをGitHubへ移行するために利用できます。
以下のコマンドを実行します。
|
1 |
gh extension install github/gh-ado2gh |
インストール後、ヘルプを表示して利用できることを確認します。
|
1 |
gh ado2gh --help |
コマンドのヘルプが表示されれば問題ありません。
3.Azure DevOps側のPATを作成
Azure DevOpsからリポジトリを取得するため、Azure DevOps側でPersonal Access Token(PAT)を作成します。
Azure DevOpsの画面から「User Settings」を開き、「Personal access tokens」を選択します。
画面が切り替わったら「New Token」を選択してトークンを作成します。その際に必要なScopeは以下です。
- Code (Read)
- Work Items (Read)
- Identity (Read)
PATが生成されたら、文字列をコピーしておきます。
4.GitHub側のPATを作成
GitHub にサインインして、「Settings」画面から 「Developer settings」を選択し、 「Personal access tokens」の「 Tokens (classic) 」を選択します。
「Generate new token」→「Generate new token(classic)」を選択してトークンを作成します。
トークン作成に必要なScopeは以下です。
- repo
- admin:org
- workflow
Azure DevOps側のPATが「Azure DevOpsからデータを取得するため」の認証情報なのに対し、GitHub側のPATは「GitHubへ移行したデータを書き込むため」の認証情報として利用します。
PATの管理は十分注意してください。
5.PATをPowerShellの環境変数に設定
Azure DevOpsとGitHubのPATを用意したら、PowerShellの環境変数に設定します。
|
1 2 |
$env:ADO_PAT = "Azure DevOpsのPAT" $env:GITHUB_PAT = "GitHubのPAT" |
移行スクリプトから環境変数を参照することで、PATをスクリプトへ直接記述せずに済みます。
特に今回のような移行作業では、PowerShellのスクリプトを後からGitで管理したり、他のメンバーへ共有したりする可能性があります。そのため、認証情報をスクリプトへ直接書き込まないようにすることが重要です。
6.複数リポジトリを移行する
ここまでの準備ができたら、Azure DevOpsからGitHubへのリポジトリ移行を実行します。
今回は1つのリポジトリだけではなく、複数のリポジトリを移行する必要があったため、gh-ado2ghが生成するPowerShellスクリプトを利用して移行処理をまとめて実行しました。
移行スクリプトを作成する
まず、gh-ado2ghを利用して移行用のPowerShellスクリプトを作成します。
このスクリプトには、Azure DevOpsのOrganizationやプロジェクト、移行対象となるリポジトリなど、移行に必要な情報が記載されています。
複数のリポジトリを移行する場合でも、このスクリプトをベースにすることで、同じ作業をリポジトリごとに手動で繰り返す必要がなくなります。
|
1 2 3 4 |
gh ado2gh generate-script ` --ado-org <Azure DevOps 組織名> ` --github-org <GitHub Organization 名> ` --output migration.ps1 |
移行スクリプトを編集する
生成されたスクリプトを、そのまま実行するのではなく、今回の移行対象に合わせて編集します。
上記のスクリプトを実行した場合は migration.ps1 が生成されます。
中身を確認すると、DevOpsでアクセスできる全リポジトリを移行する処理であることが確認できます。
移行しないリポジトリやプロジェクトなどある場合は削除してください。
移行スクリプトを実行する
編集したPowerShellスクリプトを実行します。
|
1 |
.\migration.ps1 |
スクリプトを実行すると、Azure DevOpsからGitHubへの移行処理が順番に実行されます。
複数のリポジトリを対象にしている場合は、各リポジトリの移行結果を確認しながら処理を進めます。
移行が完了したら、以下の画像のように成功したかどうかがPowerShell上で見れるので、失敗した場合はPowerShellのログを確認して対応してください
PowerShell上で成功したことが確認できたらGitHub側でも対象のリポジトリが作成されていることを確認します。
6.移行後にすること
単純にリポジトリがGitHub上に存在していることだけを確認して終わりにするのではなく、これまでAzure DevOps側で行っていた権限管理や開発ルールなどが、GitHub側でも適切に設定されているかを確認することが重要です。
移行結果とMigration Logを確認する
まず、移行したリポジトリについて、正常に移行できているかを確認します。
- リポジトリが作成されているか
- ブランチが移行されているか
- コミット履歴が確認できるか
- Pull Requestなど、必要な情報が移行されているか
あわせて、Migration Logも確認します。
移行処理自体が成功していても、すべてのデータが問題なく移行されているとは限りません。Migration LogにWarningや移行されなかったデータに関する情報が記録されている場合があるため、移行完了後に一度確認しておきます。
リポジトリのアクセス権を設定する
移行直後のリポジトリでは、ユーザー単位でアクセス権が設定されている場合があります。
しかし、会社で複数人が利用するリポジトリでは、個人に直接権限を付与するよりも、GitHubのTeamを利用して権限を管理するほうが運用しやすくなります。
例えば、開発者を「Developers」というTeamに所属させ、そのTeamに対してリポジトリへの権限を付与します。
|
1 2 3 |
Developers Team ↓ Repository |
こうすることで、メンバーの追加や異動が発生した場合にも、個々のリポジトリの権限を一つずつ変更する必要がなくなります。
移行後は、Azure DevOpsで設定していた権限とGitHub側の権限を確認し、意図したアクセス権になるように整理します。
ブランチ保護・Rulesetを設定する
次に、mainブランチなどの重要なブランチに対して、ブランチ保護やRulesetを設定します。
Azure DevOpsでPull Requestのレビューや直接Pushの制限などを設定していた場合、GitHub側でも同等のルールを設定する必要があります。
例えば、以下のようなルールが考えられます。
- mainブランチへの直接Pushを禁止する
- Pull Requestによるマージを必須にする
- Pull Requestのレビューを必須にする
- CIの成功をマージ条件にする
- Force Pushを禁止する
GitHubではRulesetを利用することで、リポジトリやブランチに対するルールをまとめて管理できます。
移行前のAzure DevOpsで設定していたブランチポリシーを確認し、GitHub側でも同じような開発ルールになるように設定しておきます。
Secrets / Variablesを確認する
GitHub Actionsなどを利用する場合は、SecretsやVariablesについても確認します。
Azure DevOps Pipelinesで使用していた環境変数やシークレットがある場合、それらをGitHub Actions側で利用するのであれば、GitHub Secretsなどへ設定し直す必要があります。
例えば、APIキーや接続文字列などの機密情報をGitHubのリポジトリへ直接記述するのではなく、Secretsとして管理します。
また、OrganizationやEnvironment単位で共有する値についても、Repository単位で持たせる必要があるのか、OrganizationやEnvironmentで管理するのかを整理しておくと、今後の運用がしやすくなります。
Organizationの監査ログを確認する
GitHubでは、Organization内で行われたさまざまな操作をAudit Logから確認できます。
例えば、リポジトリや権限設定の変更など、Organization上で誰がどのような操作を行ったのかを確認できます。
Azure DevOpsからGitHubへ移行した後は、GitHub側の運用管理についても確認できるように、Audit Logの存在と確認方法を把握しておきます。
その他のセキュリティ設定
最後に、GitHub側で利用できるセキュリティ機能についても確認します。
会社で利用するリポジトリであれば、必要に応じて以下のような機能を有効化します。
- Secret scanning
- Dependabot
- Code scanning
- 2要素認証
- SSO
これらはリポジトリを移行するために必須というわけではありませんが、GitHubを開発基盤として利用していくのであれば、移行をきっかけにセキュリティ設定を見直しておくとよいでしょう。
まとめ
今回は、Azure DevOpsからGitHubへ複数のリポジトリを移行した際の手順を紹介しました。
Azure DevOpsからGitHubへの移行では、GitHub CLIとgh-ado2ghを利用することで、複数のリポジトリを効率よく移行できます。移行対象が多い場合は、生成したPowerShellスクリプトを編集して実行することで、作業をまとめて進められます。
ただし、移行処理が完了しただけでは、GitHubでの運用準備が整ったとはいえません。Migration Logや移行結果を確認したうえで、アクセス権、ブランチ保護、Secrets、監査ログ、セキュリティ機能などを設定する必要があります。
Azure DevOpsとGitHubでは、権限管理や開発ルールの仕組みが異なります。そのため、移行時には「データを移す作業」と「GitHubで安全に運用できる状態を整える作業」を分けて考えることが重要です。
以上、最後までご愛読いただき
ありがとうございました。
お問い合わせは、
以下のフォームへご連絡ください。




