Azure Pipelines パイプライン間Artifactsの受け渡し
はじめに
Azure Pipelinesを使用したCI/CDの構築では、パイプライン間でArtifactsを受け渡すシナリオがよくあります。本記事では、Microsoftが推奨するベースラインアーキテクチャを基に、PRパイプラインからCIパイプライン、さらにCDパイプラインへのArtifactsの受け渡しについて解説します。特に、Yamlベースの設定にフォーカスして解説します。
ベースラインアーキテクチャの概要
Azure Pipelinesの推奨アーキテクチャは、以下のようなプロセスを想定しています。
1. Pull Request (PR) パイプライン
- トリガー: 開発者が対象のブランチを作成し、Pull Requestを発行。
-
実行内容:
- 静的コード解析
- セキュリティチェック
- プログラムのビルド
- 単体テストの実行
- 目的: コードの品質を事前に検証し、承認者が安心してPRを承認できる状態を提供。
2. Continuous Integration (CI) パイプライン
- トリガー: PRが承認されてブランチにマージされる。
-
実行内容:
- PRパイプラインと同様の静的解析、ビルド、テスト。
- 結合テスト。
- Artifactsの発行: 次工程のCDパイプラインで使用するビルド成果物をArtifactsとして保存。
- 目的: 信頼性の高いビルド成果物を生成し、リリース工程に進める。
3. Continuous Deployment (CD) パイプライン
- トリガー: CIパイプラインが正常に終了。
-
実行内容:
- CIパイプラインで発行されたArtifactsをダウンロード。
- Dev/Stgなどのターゲット環境にデプロイ。
- 目的: 環境ごとに一貫性のあるリリースを実現。
課題: YamlベースのArtifacts受け渡し設定
クラシックパイプラインでは、GUIでArtifactsの受け渡しを設定するのは簡単でした。しかし、Yamlベースのパイプラインでは、適切な記述方法が分かりにくく苦戦しましたが、最近Yamlを用いたArtifactsの受け渡し方法を理解したため、本記事で備忘録として共有します。
Artifactsの発行と取得方法
CIパイプラインでArtifactsを発行し、CDパイプラインで受け取る具体的なYaml設定を書いてみました。
1. Artifactsの発行 (CIパイプライン)
CIパイプラインでは、ビルド成果物を生成し、それをパイプラインArtifactsとして公開します。
trigger:
- main
pool:
vmImage: 'ubuntu-latest'
steps:
# プロジェクトのビルド
- task: DotNetCoreCLI@2
inputs:
command: 'build'
projects: 'src/Sample/*.csproj'
arguments: '--output $(Build.BinariesDirectory)'
# 成果物の確認
- script: |
echo "Build output files:"
ls $(Build.BinariesDirectory)
# 成果物の公開
- task: PublishPipelineArtifact@1
inputs:
targetPath: '$(Build.BinariesDirectory)'
artifactName: 'build-output'
publishLocation: 'pipeline'
解説
-
DotNetCoreCLI@2
: .NETプロジェクトをビルドし、成果物を$(Build.BinariesDirectory)
に出力。 -
PublishPipelineArtifact@1
: 指定したディレクトリ内のファイルをArtifactsとして公開。artifactName
によってArtifactsの名前を設定します。
ポイントとして、Artifactsの名前(例: build-output
)を明確に設定しておくことで、後続のCDパイプラインで参照しやすくなります。
2. Artifactsの取得 (CDパイプライン)
CDパイプラインでは、CIパイプラインで公開されたArtifactsをダウンロードし、デプロイなどの処理を実行します。
trigger:
none
resources:
pipelines:
- pipeline: A-pipeline # CIパイプラインの名前
source: A-pipeline # リソースとして参照するパイプライン名
trigger: true # CIパイプライン完了をトリガーに実行
pool:
vmImage: 'ubuntu-latest'
steps:
# CIパイプラインで生成された成果物をダウンロード
- task: DownloadPipelineArtifact@2
inputs:
buildType: 'specific' # 特定のビルドを指定
project: 'Hyperion' # プロジェクト名(Azure DevOpsのプロジェクト名)
pipeline: 'A-pipeline' # CIパイプライン名
buildVersionToDownload: 'latest' # 最新のビルドを取得
artifactName: 'build-output' # ダウンロードするArtifacts名
targetPath: '$(Pipeline.Workspace)' # 保存先ディレクトリ
# ダウンロード確認用のログ出力
- script: |
echo "Downloaded build artifacts:"
ls $(Pipeline.Workspace)
解説
-
resources.pipelines
: 依存元のCIパイプライン(A-pipeline
)を指定。これにより、CIパイプラインが発行したArtifactsをCDパイプラインで利用可能にします。 -
DownloadPipelineArtifact@2
: CIパイプラインで発行されたArtifactsをダウンロード。artifactName
で対象のArtifactsを指定し、targetPath
にダウンロード先を定義。 - 成果物の確認: ダウンロードしたファイルが正常かどうかを確認するため、ログにファイル一覧を出力。
設定時の注意点
-
Artifacts名の統一
Artifactsの名前(例:build-output
)は、CIパイプラインとCDパイプラインで一致させる必要があります。 -
パイプラインリソースの設定
resources.pipelines
セクションでCIパイプラインの名前やトリガー設定を正確に記述してください。 -
アクセス権限の確認
Azure DevOpsのプロジェクト内で、パイプライン間のArtifacts共有が許可されていることを確認してください。
まとめ
YamlベースのAzure Pipelinesでは、Artifactsの発行と受け渡しの設定がコードとして明確に記述できます。本記事で紹介した方法を参考に、CI/CDパイプライン間でのArtifacts管理を効率化してみてください。
リファレンス
Discussion