更新日:2025年12月8日
22分で読めます
GitLabプロフェッショナルサービスの移行ツールを使用してAzure DevOpsからGitLabへの完全な移行を実行する方法を学びます — 計画、実行から移行後のフォローアップタスクまで。

Azure DevOpsからGitLabへの移行は困難な作業のように思えるかもしれませんが、適切なアプローチとツールを使用すれば、スムーズかつ効率的に進められます。このガイドでは、Azure DevOpsからGitLabへプロジェクト、リポジトリ、パイプラインを正常に移行するために必要な手順を説明します。
GitLabは、Azure DevOps(ADO)からプロジェクトを移行するためのCongregate(GitLabプロフェッショナルサービス(PS)によって管理)と組み込みのGitリポジトリインポートの両方を提供しています。これらのオプションは、リポジトリごとまたは一括移行をサポートし、Gitコミット履歴、ブランチ、タグを保持します。Congregateとプロフェッショナルサービスのツールを使用すると、Wiki、作業アイテム、CI/CD変数、コンテナイメージ、パッケージ、パイプラインなどの追加アセットもサポートされます(この機能マトリクスを参照)。このガイドを参照すれば、移行を計画・実行し、移行後のフォローアップタスクを完了できます。
ADOからGitLabへ移行する企業は、一般的に複数フェーズのアプローチに従います:
移行フェーズの概要:
移行を計画するにあたり、次の質問を検討します:
タイムラインを決定します。これは移行アプローチを大きく左右します。ADOとGitLabの両プラットフォームに精通したチャンピオンやグループ(アーリーアダプターなど)を特定し、導入を推進してアドバイスを提供してもらいます。
移行が必要なものをインベントリ化:
GitLab プロフェッショナルサービスのEvaluateツールを使用して、リポジトリ、PR数、コントリビューターリスト、パイプライン数、作業アイテム、CI/CD変数などを含むAzure DevOps組織全体の完全なインベントリを作成します。GitLabプロフェッショナルサービスチームと連携している場合は、このレポートをエンゲージメントマネージャーまたはテクニカルアーキテクトと共有し、移行計画に役立ててください。
移行のタイミングは、主にプルリクエスト数、リポジトリサイズ、コントリビューション量(PRのコメント、作業アイテムなど)によって決まります。たとえば、PRが少なくコントリビューターが限られた1,000の小規模リポジトリは、数万のPRと数千のコントリビューターを含む少数のリポジトリよりもはるかに高速に移行できます。インベントリデータを使用して作業量を見積もり、本番移行を進める前にテスト実行を計画します。
インベントリを希望のタイムラインと比較し、すべてのリポジトリを一度に移行するか、バッチで移行するかを決定します。チームが同時に移行できない場合は、チームのスケジュールに合わせて移行をバッチ化し、段階的に実行します。たとえば、プロフェッショナルサービスのエンゲージメントでは、複雑さを管理し、GitLabとADOの両方のAPIレート制限を尊重するために、200〜300プロジェクト単位の段階に分割して移行を実施します。
GitLabの組み込みリポジトリインポーターは、Gitリポジトリ(コミット、ブランチ、タグ)を1つずつ移行します。Congregateは、可能な限りプルリクエスト(GitLabではマージリクエストとして知られています)、コメント、関連メタデータを保持するように設計されています。シンプルな組み込みリポジトリインポートは、Gitデータ(履歴、ブランチ、タグ)のみに焦点を当てています。
通常、個別の移行または手動での再作成が必要な項目:
各ツール(Congregateと組み込みインポート)が何を移行するかを確認し、ニーズに合ったものを選択します。手動で移行または再作成する必要があるデータやインテグレーションのリストを作成します。
誰が移行を実行するか?
移行は通常、GitLabグループオーナーまたはインスタンス管理者、または移行先グループ/プロジェクトに必要な権限を付与された指定の移行担当者によって実行されます。CongregateとGitLabインポートAPIには、Azure DevOpsとGitLabの両方の有効な認証トークンが必要です。
注: CongregateはADO移行のためにファイルベースのインポート機能を活用し、実行にはインスタンス管理者権限が必要です(ドキュメントを参照)。GitLab.comに移行する場合は、プロフェッショナルサービスの利用を検討してください。詳細については、Professional Services Full Catalogを参照してください。管理者以外のアカウントでは、コントリビューションの帰属を保持できません。
GitLabでどのような組織構造を望むか?
ADO構造をGitLab構造に直接マッピングすることは可能ですが、移行中に構造を合理化および簡素化することをお勧めします。チームがGitLabでどのように作業するかを検討し、コラボレーションとアクセス管理を促進する構造を設計します。ADO構造をGitLab構造にマッピングする方法は次のとおりです。
推奨アプローチ:
ADOボードと作業アイテム: 移行の状態
作業アイテムがADOからGitLab Plan(イシュー、エピック、ボード)にどのように移行されるかを理解することが重要です。
例: 個別の作業アイテムのGitLabイシューへの移行(フィールドの正確性と関係性を含む):

バッチ処理のガイダンス:
パイプライン移行
Congregateは最近、Azure DevOpsからGitLab CI/CDへのマルチステージYAMLパイプラインのAI搭載変換を導入しました。この自動変換は、シンプルな単一ファイルパイプラインに最適で、本番環境対応の.gitlab-ci.ymlファイルではなく、動作する出発点を提供するように設計されています。このツールは、機能的に同等のGitLabパイプラインを生成し、その後特定のニーズに合わせて調整および最適化できます。
.gitlab-ci.yml形式に自動変換します。リポジトリオーナーは、初期変換後にパイプラインをさらに最適化および強化するために、GitLab CI/CDドキュメントを確認する必要があります。
変換されたパイプラインの例:
# azure-pipelines.yml
trigger:
- main
variables:
imageName: myapp
stages:
- stage: Build
jobs:
- job: Build
pool:
vmImage: 'ubuntu-latest'
steps:
- checkout: self
- task: Docker@2
displayName: Build Docker image
inputs:
command: build
repository: $(imageName)
Dockerfile: '**/Dockerfile'
tags: |
$(Build.BuildId)
- stage: Test
jobs:
- job: Test
pool:
vmImage: 'ubuntu-latest'
steps:
- checkout: self
# Example: run tests inside the container
- script: |
docker run --rm $(imageName):$(Build.BuildId) npm test
displayName: Run tests
- stage: Push
jobs:
- job: Push
pool:
vmImage: 'ubuntu-latest'
steps:
- checkout: self
- task: Docker@2
displayName: Login to ACR
inputs:
command: login
containerRegistry: '<your-acr-service-connection>'
- task: Docker@2
displayName: Push image to ACR
inputs:
command: push
repository: $(imageName)
tags: |
$(Build.BuildId)
# .gitlab-ci.yml
variables:
imageName: myapp
stages:
- build
- test
- push
build:
stage: build
image: docker:latest
services:
- docker:dind
script:
- docker build -t $imageName:$CI_PIPELINE_ID -f $(find . -name Dockerfile) .
only:
- main
test:
stage: test
image: docker:latest
services:
- docker:dind
script:
- docker run --rm $imageName:$CI_PIPELINE_ID npm test
only:
- main
push:
stage: push
image: docker:latest
services:
- docker:dind
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
script:
- docker tag $imageName:$CI_PIPELINE_ID $CI_REGISTRY/$CI_PROJECT_PATH/$imageName:$CI_PIPELINE_ID
- docker push $CI_REGISTRY/$CI_PROJECT_PATH/$imageName:$CI_PIPELINE_ID
only:
- main
最終チェックリスト:
計画後、トライアル実行から始めて、段階的に移行を実行します。トライアル移行は、組織固有の問題を早期に明らかにし、期間を測定し、結果を検証し、本番環境前にアプローチを微調整する上で役立ちます。
トライアル移行が検証する内容:
ダウンタイムのガイダンス:
バッチ処理のガイダンス:
推奨手順:
.gitlab-ci.yml)または(該当する場合は)変換されたパイプラインを検証します。| GitLab | Azure DevOps | 類似点と主な違い |
|---|---|---|
| グループ | 組織 | トップレベルのネームスペース、メンバーシップ、ポリシー。ADO組織にはプロジェクトが含まれ、GitLabグループにはサブグループとプロジェクトが含まれます。 |
| グループまたはサブグループ | プロジェクト | 論理コンテナ、権限境界。ADOプロジェクトは多数のリポジトリを保持し、GitLabグループ/サブグループは多数のプロジェクトを整理します。 |
| Project(Gitリポジトリを含む) | リポジトリ(プロジェクト内) | Git履歴、ブランチ、タグ。GitLabでは、「プロジェクト」はリポジトリとイシュー、CI/CD、Wikiなどを含みます。プロジェクトごとに1つのリポジトリ。 |
| マージリクエスト(MR) | プルリクエスト(PR) | コードレビュー、ディスカッション、承認。MRルールには、承認、必要なパイプライン、コードオーナーが含まれます。 |
| 保護されたブランチ、MR承認ルール、ステータスチェック | ブランチポリシー | レビューとチェックを強制。GitLabは保護 + 承認ルール + 必要なステータスチェックを組み合わせます。 |
| GitLab CI/CD | Azureパイプライン | YAMLパイプライン、ステージ/ジョブ、ログ。ADOにはクラシックUIパイプラインもあり、GitLabは.gitlab-ci.ymlを中心にしています。 |
| .gitlab-ci.yml | azure-pipelines.yml | ステージ/ジョブ/トリガーを定義。構文/機能が異なります。ジョブ、変数、アーティファクト、トリガーをマッピングします。 |
| Runner(共有/特定) | エージェント/エージェントプール | マシン/コンテナでジョブを実行。デマンド(ADO)対タグ(GitLab)でターゲット。登録/スコーピングが異なります。 |
| CI/CD変数(プロジェクト/グループ/インスタンス)、保護/マスク | パイプライン変数、変数グループ、ライブラリ | 設定/シークレットをジョブに渡します。GitLabはグループ継承とマスキング/保護フラグをサポートします。 |
| インテグレーション、CI/CD変数、デプロイキー | サービス接続 | サービス/クラウドへの外部認証。インテグレーションまたは変数にマッピング。クラウド固有のヘルパーが利用可能。 |
| 環境とデプロイメント(保護された環境) | 環境(承認付き) | デプロイターゲット/履歴を追跡。GitLabでは保護された環境と手動ジョブを介した承認。 |
| リリース(タグ + ノート) | リリース(クラシックまたはパイプライン) | バージョン管理されたノート/アーティファクト。GitLabリリースはタグに結び付けられ、デプロイメントは個別に追跡されます。 |
| ジョブアーティファクト | パイプラインアーティファクト | ジョブ出力を保持。保持/有効期限はジョブまたはプロジェクトごとに設定されます。 |
| パッケージレジストリ(NuGet/npm/Maven/PyPI/Composerなど) | Azureアーティファクト(NuGet/npm/Mavenなど) | パッケージホスティング。認証/ネームスペースが異なります。パッケージタイプごとに移行します。 |
| GitLabコンテナレジストリ | Azureコンテナレジストリ(ACR)または他 | OCIイメージ。GitLabはプロジェクト/グループごとのレジストリを提供します。 |
| イシューボード | ボード | 列で作業を視覚化。GitLabボードはラベル駆動型で、プロジェクト/グループごとに複数のボードがあります。 |
| イシュー(タイプ/ラベル)、エピック | 作業アイテム(ユーザーストーリー/バグ/タスク) | 作業単位を追跡。ADOタイプ/フィールドをラベル/カスタムフィールドにマッピング。エピックはグループレベルです。 |
| エピック、親子イシュー | エピック/機能 | 作業の階層。スキーマが異なります。エピックとイシュー関係を使用します。 |
| マイルストーンとイテレーション | イテレーションパス | タイムボックス化。GitLabイテレーション(グループ機能)またはプロジェクト/グループごとのマイルストーン。 |
| ラベル(スコープ付きラベル) | エリアパス | 分類/所有権。階層エリアをスコープ付きラベルに置き換えます。 |
| プロジェクト/グループWiki | プロジェクトWiki | マークダウンWiki。両方ともリポジトリでバックアップされます。レイアウト/認証がわずかに異なります。 |
| CI経由のテストレポート、要件/テスト管理、インテグレーション | テストプラン/ケース/実行 | QA証拠/トレーサビリティ。ADOテストプランとの1対1対応はありません。多くの場合、CIレポート + イシュー/要件を使用します。 |
| ロール(オーナー/メンテナー/デベロッパー/レポーター/ゲスト) + カスタムロール | アクセスレベル + きめ細かい権限 | 読み取り/書き込み/管理を制御。モデルが異なります。グループ継承と保護されたリソースを活用します。 |
| Webhook | サービスフック | イベント駆動型インテグレーション。イベント名/ペイロードが異なります。エンドポイントを再設定します。 |
| 高度な検索 | コードサーチ | フルテキストリポジトリ検索。Self-managed版のGitLabでは、高度な機能にElasticsearch/OpenSearchが必要な場合があります。 |
このブログ記事を楽しんでいただけましたか?ご質問やフィードバックがあればお知らせください。GitLabコミュニティフォーラムで新しいトピックを作成してあなたの声を届けましょう。
フィードバックを共有する