🌊

Azure Pipelines パイプライン間Artifactsの受け渡し

2024/12/04に公開

はじめに

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として公開します。

A-pipeline.yml
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をダウンロードし、デプロイなどの処理を実行します。

B-pipeline.yml
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 にダウンロード先を定義。
  • 成果物の確認: ダウンロードしたファイルが正常かどうかを確認するため、ログにファイル一覧を出力。

設定時の注意点

  1. Artifacts名の統一
    Artifactsの名前(例: build-output)は、CIパイプラインとCDパイプラインで一致させる必要があります。

  2. パイプラインリソースの設定
    resources.pipelines セクションでCIパイプラインの名前やトリガー設定を正確に記述してください。

  3. アクセス権限の確認
    Azure DevOpsのプロジェクト内で、パイプライン間のArtifacts共有が許可されていることを確認してください。

まとめ

YamlベースのAzure Pipelinesでは、Artifactsの発行と受け渡しの設定がコードとして明確に記述できます。本記事で紹介した方法を参考に、CI/CDパイプライン間でのArtifacts管理を効率化してみてください。


リファレンス

https://learn.microsoft.com/ja-jp/azure/devops/pipelines/architectures/devops-pipelines-baseline-architecture?view=azure-devops

https://learn.microsoft.com/ja-jp/azure/devops/pipelines/tasks/reference/publish-pipeline-artifact?view=azure-devops

https://learn.microsoft.com/ja-jp/azure/devops/pipelines/tasks/reference/download-pipeline-artifact?view=azure-devops

GitHubで編集を提案

Discussion