🥝

Azure DevOps で dotnet パイプラインを構築(例:WPF アプリ)

に公開

はじめに

レガシーアプリでもビルド、配布の自動化(CI・CD)をあきらめない精神でpiplineを作成しました
Azure CLIを用いたビルドの自動化を説明します。ビルドパイプラインの作成、NuGet の復元、MSBuild によるビルド、成果物のアップロードと CLI を使ったダウンロードまで、dotnet パイプライン(例:WPF アプリ)の構築方法になります!


1. Azure CLI のインストール・ログインおよびプロジェクト登録

1-1. Azure CLI のインストール

まずは Azure CLI をインストールしましょう。公式サイトからダウンロードできます。

インストールが終わったら、以下のコマンドでバージョンを確認してみてください。

az --version

1-2. Azure DevOps へのログイン

Azure DevOps にアクセスする方法として、以下のようにログインできます。

ログイン方法 コマンド例 説明
Personal Access Token (PAT) az devops login --token <YOUR_PAT_TOKEN> あらかじめ発行した PAT を使ってログインする。

<YOUR_PAT_TOKEN> の部分は、事前に Azure DevOps のポータルで発行した PAT に置き換えてください。

1-3. プロジェクトの既定設定

毎回組織やプロジェクトを指定するのは面倒なので、以下のコマンドで既定の設定を行います。

az devops configure --defaults organization=https://dev.azure.com/【ORG】 project=【PROJECT】

ここで 【ORG】 は組織名、【PROJECT】 はプロジェクト名に置き換えてください。


2. ビルド定義および最新ラン ID の取得

2-1. pipeline ID (definitionId) の取得

まずは、Azure DevOps の Web ポータル上でパイプライン一覧を確認し、対象パイプラインの定義 ID(例:【PIPELINE_ID】=49)を把握しておきます。

作成したパイプラインの YAML を編集する際の URL から取得することもできます。
例)

https://dev.azure.com/{organization}/{project}/_apps/hub/ms.vss-build-web.ci-designer-hub?pipelineId={ID}&branch=master

ビルド一覧の取得

ビルド済みパイプライン成果物の定義一覧も、以下のコマンドで確認できます。ID だけほしい場合は top パラメータなどを活用するのがおすすめです。

az pipelines build list --top 3

※ YAML パイプラインの場合は、az pipelines runs list コマンドを利用するとよいでしょう。

2-3. 最新ラン(ビルド)ID の取得

YAML パイプラインの最新実行(ラン)ID を取得するには、次のコマンドを使います。

az pipelines runs list --project 【PROJECT】 --pipeline-id 【PIPELINE_ID】 --top 1 --query "[0].id" -o tsv

たとえば、結果として「4751」が返ってきた場合、最新のラン ID は 4751 ということになります。

パラメーター 説明
--project 【PROJECT】 対象のプロジェクト名
--pipeline-id 【PIPELINE_ID】 対象のパイプライン定義 ID(例:49)
--top 1 最新の実行を 1 件だけ抽出
--query "[0].id" JSON 配列の最初の要素の ID を抽出
-o tsv 出力形式を TSV(文字列のみ)に指定

3. サンプルアプリケーション用 YAML パイプライン定義

ここからは、WPF アプリケーション(例:【APP_NAME】)のビルドパイプラインを YAML で定義する例を紹介します。
各項目は後の表でも解説しているので、必要に応じて参照してみてください。

3-1. サンプル YAML 定義

trigger:
- dev/sample

pool:
  vmImage: 'windows-latest'

variables:
  # プロジェクトや各サブプロジェクトのパス
  projectPath: 'App/【APP_NAME】/【APP_NAME】.csproj'
  buildPlatform: 'x86'
  buildConfiguration: 'Release'
  ## Git サブモジュールを使用しているため、個別に nuget install したい
  subProject1: 'App/subproject/sub/sub.csproj'
  
steps:
- checkout: self

# サブモジュールの同期と更新(PAT を利用した認証が必要)
- powershell: |
    $header = "AUTHORIZATION: bearer $(MY_PAT_BASE64)"
    git -c http.extraheader="$header" submodule sync
    git -c http.extraheader="$header" submodule update --init --force
  displayName: 'サブモジュールの同期と更新'

# ディレクトリ構造の確認(オプション)
- script: |
    tree /F /A
  displayName: 'ディレクトリツリーの表示'

# NuGet ツールのインストール
- task: NuGetToolInstaller@1

# NuGet パッケージの復元(サブプロジェクト)
- task: NuGetCommand@2
  displayName: 'NuGet restore: Sub Project 1'
  inputs:
    restoreSolution: '$(subProject1)'
    solutionDirectory: '$(Build.SourcesDirectory)/App'
    packagesDirectory: '$(Build.SourcesDirectory)/App/packages'

# サブプロジェクトのビルド(例:Sub Project 2)
- script: |
    "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Current\Bin\MSBuild.exe" $(subProject2) /p:Configuration=$(buildConfiguration) /p:PlatformTarget=$(buildPlatform)
  displayName: 'Build: Sub Project 2'

# メインプロジェクトの NuGet パッケージの復元
- task: NuGetCommand@2
  displayName: 'NuGet restore: Main Project'
  inputs:
    restoreSolution: '$(projectPath)'

# ソリューション全体の復元(dotnet コマンド)
- script: dotnet restore $(Build.SourcesDirectory)/App/【SOLUTION_NAME】.sln
  displayName: 'Restore All Projects'

# 再度、ディレクトリ構造の確認
- script: |
    tree /F /A
  displayName: 'ディレクトリツリーの表示'
  
# メインプロジェクトのビルド
- script: |
    "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Current\Bin\MSBuild.exe" $(projectPath) /p:Configuration=$(buildConfiguration) /p:PlatformTarget=$(buildPlatform)
  displayName: 'Build: Main Project'

# 成果物のアップロード(パイプラインアーティファクト形式)
- task: PublishPipelineArtifact@1
  displayName: 'Publish Main Project Artifact'
  inputs:
    targetPath: '$(Build.SourcesDirectory)/App/【APP_NAME】/bin/$(buildConfiguration)'
    artifact: 【APP_NAME】_Artifact

3-2. YAML 定義内各パラメーターの詳細説明

項目 説明
trigger パイプラインをトリガーするブランチを指定。 - dev/sample
pool 使用するビルドエージェントを指定。ここでは Windows 最新イメージを利用。 vmImage: 'windows-latest'
variables ビルドに必要な各種パスや設定値を定義。 projectPath: 'App/【APP_NAME】/【APP_NAME】.csproj'
NuGetCommand@2 NuGet パッケージを復元するためのタスク。
restoreSolution 復元対象のソリューションやプロジェクトファイルのパスを指定。 '$(subProject1)'
solutionDirectory NuGet 復元のベースディレクトリ。通常、ソリューションファイルがあるディレクトリを指定。 '$(Build.SourcesDirectory)/App'
packagesDirectory NuGet パッケージの出力先ディレクトリ。デフォルトではグローバルなキャッシュやソリューション内のフォルダに格納されるが、明示的に指定したい場合に利用。 '$(Build.SourcesDirectory)/App/packages'
PublishPipelineArtifact@1 成果物をパイプラインアーティファクト形式でアップロードするタスク。従来のファイルコンテナ形式ではなく、最新の形式で管理・ダウンロードが行える。
targetPath アップロード対象のフォルダパス。ビルド後の成果物が入っているディレクトリを指定。 '$(Build.SourcesDirectory)/App/【APP_NAME】/bin/$(buildConfiguration)'
artifact 成果物の名前。CLI や Web ポータルからこの名前で参照される。 【APP_NAME】_Artifact

4. 成果物のダウンロード(CLI を利用)

パイプラインの実行が終わると、成果物は Azure DevOps 上にアップロードされます。ここでは、CLI を使って成果物をダウンロードする方法を説明します。

4-1. 最新ラン ID の取得(再掲)

あらためて、最新ラン(ビルド)の ID を取得するコマンド例を載せておきます。

az pipelines runs list --project 【PROJECT】 --pipeline-id 【PIPELINE_ID】 --top 1 --query "[0].id" -o tsv

例えば、「4759」が返ってきたら、そのパイプラインの最新ラン ID は 4759 です。

4-2. 成果物のダウンロード

アップロードしたパイプラインアーティファクトをダウンロードするには、以下のコマンドを使います。

az pipelines runs artifact download --project 【PROJECT】 --run-id 4759 --artifact-name {パイプラインでpublishした名前} --path ./

パラメーター 説明
--project 【PROJECT】 対象のプロジェクト名
--run-id 4759 最新ランの ID(例:4759)
--artifact-name 成果物の名前。YAML 定義の PublishPipelineArtifact タスクで指定した名前と一致させる必要がある
--path ./ 成果物をダウンロードする先のディレクトリ

※ 成果物の名前は、YAML 定義でアップロードした際に指定したものと同じである必要があります。


5. まとめ

この記事では、Azure DevOps CLI を使ってプロジェクトを登録するところから、ビルド定義の取得、最新ラン ID の抽出、YAML 定義による dotnet(WPF)アプリケーションのパイプライン構築、さらに CLI での成果物ダウンロードまで、ひと通りの流れを解説しました。

主なポイントは以下の通りです:

  • プロジェクト登録
    az devops configure --defaults organization=https://dev.azure.com/【ORG】 project=【PROJECT】 のように、組織とプロジェクトを既定で設定しておくと楽。

  • ビルド定義と最新ラン ID の取得
    Azure DevOps の Web ポータルでパイプラインの定義 ID を確認し、az pipelines runs list コマンドで最新ランを検索して ID を入手。

  • YAML 定義によるパイプライン構築
    NuGetCommand タスクでの solutionDirectorypackagesDirectory の指定や、PublishPipelineArtifact タスクによる成果物アップロード方法をしっかり把握しておく。

  • 成果物のダウンロード
    az pipelines runs artifact download コマンドを使えば、CLI 上で簡単に成果物を取得できる。

これらの手順を順番に実施することで、Azure DevOps 上で dotnet パイプラインを構築し、ビルド→成果物管理→ダウンロードまでをスムーズに実現できます。ぜひ試してみてくださいね!

Accenture Japan (有志)

Discussion