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 のパーソナルアクセストークンを入力します。
パイプライン作成後、[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 です。失礼いたしました。