Azure Reposから別のプロジェクトのReposへコピーする
0. はじめに
Azure Reposとは
Azure ReposとはAzure DevOpsに含まれるサービスの1つです。
ソースコードの管理やチームでの共有、バージョン管理を行えます。
バージョン管理の方法としてはGitとTFVCの2種類が用意されていますが、本記事ではGitです。
本記事で実現すること
Azure Reposのソースコードやドキュメントを別のプロジェクトのAzure Reposへ、
Azure Pipelinesを活用し、自動的かつ継続的にコピーさせる方法を検証してみました。
本記事では、特定のブランチ(ここではmainブランチ)内の
特定のディレクトリ(ここではtestディレクトリ)へのプッシュをトリガーとし、
特定のディレクトリ内のファイルを自動的にコピーさせるようにトリガーを設定しました。
前提条件
- 2つのAzure Repos(コピー元とコピー先)が作成できていること
- Azure Pipelinesを作成するために必要なアクセス権を持っていること
1. YAMLファイルとコピー対象のディレクトリの準備
コピー対象のディレクトリの準備
コピー対象であるtestディレクトリを準備しました。YAMLファイルはまだ書いていません。
YAMLファイルの準備
パイプライン化に必要なYAMLファイルを以下のように書いていきます。
なお、PAT_CHILDという変数は後ほど設定します。
trigger:
branches:
include:
- main # mainブランチへの変更をトリガーとする
paths:
include:
- test/** # testディレクトリ配下の変更もトリガーとする
pool:
vmImage: 'windows-latest'
jobs:
- job: SyncParent
steps:
- checkout: self # 現在のリポジトリをチェックアウトする
persistCredentials: true # 認証情報をパイプラインの実行中に保持する
- script: |
git config user.email "{YOUR_EMAIL}" # Gitの設定でユーザーのメールアドレスを設定する
git config user.name "{YOUR_USER_NAME}" # Gitの設定でユーザーの名前を設定する
# リモートリポジトリをchild-remoteという名前で追加する
git remote add child-remote https://$(PAT_CHILD)@dev.azure.com/{YOUR_ORGANIZATION_NAME}/{YOUR_PROJECT_NAME}/_git/{YOUR_REPOS_NAME} || echo "child-remote already added"
# child-remoteからparent-baseというブランチを取得する(存在しない場合はメッセージを表示)
git fetch child-remote parent-base || echo "parent-base branch does not exist on child-remote"
# originにあるリモートリポジトリの完全なコミット履歴を取得する
git fetch --unshallow origin || echo "Failed to fetch unshallow origin"
# parent-baseという新しいローカルブランチを作成してチェックアウトする
git checkout -b parent-base || echo "Failed to create or switch to parent-base branch"
# originのmainブランチから最新の変更を取得し、parent-baseにリベースする
git pull --rebase origin main || echo "Failed to pull and rebase main branch from origin"
# parent-baseブランチの内容をchild-remoteに強制プッシュする
git push -f child-remote parent-base || echo "Failed to push parent-base branch to child-remote"
displayName: 'Sync Project Parent changes to Child' # このステップの表示名を設定する
2. PAT(Personal Access Token)の準備
プロジェクトParentのソースコードをプロジェクトChildにコピーしたい場合、
ParentからChildのリポジトリにアクセスできる(権限が付いている)ように
ChildでPAT(Personal Access Token)というトークンをを払い出す必要があります。
PATの払い出し方法についても本記事で扱おうと思いましたが、、、
公式ドキュメントに分かりやすく整理されていたため省略します。
ソースコードのコピーに必要な権限は「Code」の「Read&Write」のみです。
PATが漏洩したときの危険性が高いので「Full Access」にするのは非推奨です。
「Create」を押下するとPATが払い出されるので、コピーして控えておいてください。
3. Azure Pipelinesの準備
DevOpsのProjectに入ると以下の画面になります。
「Pipelines」を選択し、右上のほうにある「New pipeline」を選択して作成していきます。
「Where is your code?」と示された以下の画面に映ります。
実行するYAMLファイルはReposにあるので、ここでは「Azure Repos Git」を選択します。
続いて「Select a repository」と示された以下の画面に映ります。
実行するYAMLファイルを保存するリポジトリを選択してください。
続いて「Configure your pipeline」と示された以下の画面に映ります。
YAMLファイルは既にあるので「Existing Azure Pipelines YAML file」を選択します。
続いて「Review your pipeline YAML」と示された以下の画面に映ります。
右上のほうにある「Variables」を選択し、先ほどコピーしたPATを変数に設定します。
PATの設定ができたら「Run」を選択して、パイプラインを実行すればコピーできます。
ここでは手動で実行されましたが、トリガーを設定しているため、以降は自動になります。
4. おわりに
本記事では、Azure Pipelinesを利用して、
異なるプロジェクトのAzure Repos間でソースコードを自動的にコピーしました。
これにより、異なるプロジェクト間でのコードの一貫性を保つことができそうです。
Discussion