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 タスクでのsolutionDirectory
とpackagesDirectory
の指定や、PublishPipelineArtifact タスクによる成果物アップロード方法をしっかり把握しておく。 -
成果物のダウンロード
az pipelines runs artifact download
コマンドを使えば、CLI 上で簡単に成果物を取得できる。
これらの手順を順番に実施することで、Azure DevOps 上で dotnet パイプラインを構築し、ビルド→成果物管理→ダウンロードまでをスムーズに実現できます。ぜひ試してみてくださいね!
Discussion