💿

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の払い出し方法についても本記事で扱おうと思いましたが、、、
公式ドキュメントに分かりやすく整理されていたため省略します。
https://learn.microsoft.com/ja-jp/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops&tabs=Windows

ソースコードのコピーに必要な権限は「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