fbpx

Azure DevOps の CI パイプラインを使用して GitLab とのハイブリッド運用をしてみる #azure #gitlab

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

はじめに

弊社業務において、GitLab と Azure DevOps の両方を使用したハイブリッド運用をする機会がありました。シチュエーションとしては以下の通りです。

  • 開発チームとしては Azure DevOps を使用してプロジェクト管理をしている。
  • すでに Azure DevOps の CI パイプラインでアプリケーションをビルドしている。
  • お客様は GitLab を使用しているので、ソースファイルを提示 (納品) するときは GitLab を使用しないといけなくなった。

要点は、Azure DevOps の Git リポジトリを GitLab のリポジトリに定期的にコピー (ミラーリング) することですが、これを手作業や定期バッチ処理で行うのではなく、Azure DevOps の CI パイプラインで実現してみましたので、簡単にですが説明します。ワークフローは以下の通りです。

Azure DevOps の Git リポジトリを用意する

Azure DevOps の Git リポジトリ (以下の画像では cl-lab という名前のリポジトリ) を用意します。こちらは開発用のメインリポジトリになります。
ここに、C 言語で書かれた適当なソースファイルを push しておきます。

参考: https://docs.microsoft.com/en-us/azure/devops/repos/git/create-new-repo

GitLab の Git リポジトリを用意する

GitLab の Git リポジトリ (以下の画像では cl-lab-mirror という名前のリポジトリ) を用意し、空の状態のままにしておきます。
こちらは開発には使用しない、参照専用のミラーになります。

参考: https://docs.gitlab.com/ee/gitlab-basics/create-project.html

GitLab のパーソナルアクセストークンを作成する

Azure DevOps の CI パイプラインのタスク内で GitLab のリポジトリにアクセスします。アクセスするにはパーソナルアクセストークンが必要になりますので、作成しておきます。

GitLab 画面右上のユーザーメニューから [Settings] をクリックし、左メニューから [Access Tokens] をクリックすれば設定画面が開きます。

[Name] に適当な名前を入力し、[write_repository] にチェックを入れます。その後、[Create personal access token] をクリックします。

トークンが表示されるので、控えておきます。※トークンの再表示はできませんので、注意してください。

参考: https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html

Azure DevOps の CI パイプラインを作成する

パイプラインは、YAML 形式で以下のように定義します。Git リポジトリの複製は、最後に定義している script フェーズの git コマンドになります。

variables:
  AppName: hello-app
  OutputDir: _buildOutput
  TmpRepoDir: _repo
  GitLabPath: gitlab.jp/<group or user name>/cl-lab-mirror.git
pool:
  vmImage: 'ubuntu-latest'
trigger:
- master
steps:
- script: |
    cd $(Build.SourcesDirectory) && mkdir $(OutputDir)
    gcc main.c -o $(OutputDir)/$(AppName)
  displayName: Build
- task: CopyFiles@2
  inputs:
    contents: '$(OutputDir)/**'
    targetFolder: $(Build.ArtifactStagingDirectory)
- task: PublishBuildArtifacts@1
  inputs:
    pathToPublish: $(Build.ArtifactStagingDirectory)
    artifactName: MyBuildOutputs    
- script: |
    cd /tmp && rm -rf /tmp/$(TmpRepoDir)
    git -c http.extraheader="AUTHORIZATION: bearer $(System.AccessToken)" clone --mirror $(Build.Repository.Uri) $(TmpRepoDir)
    git -C /tmp/$(TmpRepoDir) push --mirror https://oauth2:$(GitLabToken)@$(GitLabPath)
  displayName: 'Copy to GitLab'

参考: https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema

変数 $(GitLabToken) には GitLab のパーソナルアクセストークンが入りますが、秘密の値になるので、この YAML では定義していません。

そこで、YAML 編集画面右上にある [Valiables] から変数を追加します。
以下の画面で、先ほど作成した GitLab のパーソナルアクセストークンを入力します。

参考: https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?tabs=yaml%2Cbatch#secret-variables

パイプライン作成後、[Save] をクリックして保存します。
なお、保存するときにコミットメッセージの入力画面になりますが、YAML ファイルはそのまま Git リポジトリに追加されます。

動作確認

保存後すぐに、CI パイプラインが開始されます。
"master ブランチの更新" をトリガーとしてパイプラインが自動実行されるように YAML で定義していますが、作成した YAML はプロジェクトルートに保存されて、master ブランチに commit → push されます。このタイミングでパイプラインが開始されるからです。※デフォルトでの動作

特に問題がなければ、以下の画像の様に完走します。

GitLab を確認すると、Azure DevOps のリポジトリが複製されていることがわかります。

Azure DevOps から、main.c の中身を編集して commit → push してみます。

GitLab を確認します。こちらも更新されています。

さいごに

このように 、CI パイプラインを使用すれば、別の Git リポジトリに複製を作成することも容易にできます。今回は行いませんでしたが、Azure DevOps の CI パイプラインでコンテナイメージをビルドした後、GitLab のコンテナレジストリに登録することも可能です。

ちなみに、GitLab のミラーリング機能を利用することにより ほぼ同等のことができると思います。ただし、同期のタイミングは変わります。

お詫び: 筆者は普段 C#er なので 、main 関数の引数を char *args[] としてしまいましたが、一般的には argv です。失礼いたしました。

クリエーションライン(株) 富山事業所
〒939-8201 富山県富山市花園町3-2-9 池田ビル 3F
Twitter: CL_toyama
新規CTA