ツナ缶雑記

ぐうたらSEのブログです。主にマイクロソフト系技術を中心に扱います。

Azure PipelinesからAzure ArtifactsにNuGetパッケージを公開する

やりたいこと

前回作成した NuGet パッケージを、 Azure Artifacts にアップロードして、プライベートな NuGet パッケージリポジトリを構築します。

NuGet パッケージのもとになるソースコード一式は、 Azure DevOps の Git リポジトリに配置します。 その後、ビルドパイプライン、リリースパイプラインを通して、 Azure Artifacts にアップロードできるようにしたいと思います。

前提条件

NuGet パッケージを作成するもとになるソースコード一式を Azure DevOps の Git リポジトリに入れておいてください。

Azure Artifacts のフィードを作成する

プライベートな NuGet パッケージリポジトリを作成するにあたり、まずは Azure Artifacts にその場となるフィードを作成します。

Azure DevOps にログインして、 [Artifacts] のメニューを選択してください。 以下のような画面になったら、画面中央の [+ New feed] ボタンを押下します。

f:id:masatsuna:20190923235218p:plain
フィードの追加

フィードの名前や公開範囲の設定を行います。 今回はこの組織に属しているユーザー間でのみ共有するプライベートな NuGet リポジトリにしたいので、以下のような設定としました。

f:id:masatsuna:20190924000950p:plain
新しいフィードの設定

フィードの作成が完了すると、以下のようになります。

f:id:masatsuna:20190924001205p:plain
フィード作成後

ビルドパイプラインを構築する

続いて Git リポジトリに登録したソースコードをビルドするためのビルドパイプラインを作成します。 ビルドパイプラインには、ソースコードをビルドして、リリースするための資材を作る役割を持たせます。 今回のリリース資材は、NuGetパッケージそのものである .nupkg ファイルです。 ビルドパイプライン内で、 .nupkg ファイルを作成していきます。

Azure DevOps の [Pipelines] メニューを開き、 [Pipelines] を選択します。

f:id:masatsuna:20191004235723p:plain
Pipelines を選択

画面右上の [New pipeline] ボタンを押下して、ソースコードの場所を選択します。 今回は Azure DevOps の Git リポジトリソースコードがあるので、 [Azure Repos Git] を選択します。

f:id:masatsuna:20191004235912p:plain
ソースコードの場所を選択

次にリポジトリを選択します。 ソースコードを配置したリポジトリを選択してください。

次にビルドパイプラインのテンプレートを選択します。 今回は .NET Framework の NuGet パッケージを作成するので、最も近い [.NET Desktop] を選択します*1

f:id:masatsuna:20191005000235p:plain
パイプラインのテンプレートを選択

作成したyamlファイルの全体像

今回は簡単に作るので、生成されたテンプレートをほぼそのまま使用し、 NuGet パッケージのビルドと、ビルド Artifact のアップロード処理を追加しています。 こちらがyamlファイルの全体像です。

trigger: none

pool:
  vmImage: 'windows-latest'

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'

steps:
- task: NuGetToolInstaller@1

- task: NuGetCommand@2
  inputs:
    restoreSolution: '$(solution)'

- task: VSBuild@1
  inputs:
    solution: '$(solution)'
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'

- task: VSTest@2
  inputs:
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'

- task: NuGetCommand@2
  displayName: 'NuGet パッケージの作成'
  inputs:
    command: 'pack'
    packagesToPack: '**/AppSettings.Core.csproj'
    versioningScheme: 'off'

- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'AppSettingsCore'
    publishLocation: 'Container'

以下個別に実装内容を解説します。

trigger

ビルドトリガーを設定する箇所です。 ここは唯一テンプレートから変更しています。 今回は手動でビルドパイプラインをキックするので、 trigger の設定値を none にしています。 CI を行いたい場合は、ここにブランチ名を設定していきます。

pool

ビルドを実行する場所を設定します。 今回はマイクロソフトの提供するビルドエージェントを使うので、 [windows-latest] を設定しています。 選択可能なエージェント名は、以下のページから確認できます。

docs.microsoft.com

自分専用のビルドマシンを使うこともできますが、ここでは割愛します。

variables

ビルドパイプライン内で使用する変数を定義します。 ここに定義した変数は「$(<変数名>)」とすることで、後から参照することができます。

steps

ビルドの処理ステップを定義します。

task: NuGetToolInstaller@1

NuGet.exe をダウンロードします。 今回の例では何も設定を行っていません。 何も設定を行わないと、最新の NuGet.exe がダウンロードされます。

task: NuGetCommand@2 1つ目

アプリケーションの使用する NuGet パッケージを復元します。 Visual Studio で実行する [NuGet パッケージの復元] と同じことを行ってくれます。

task: VSBuild@1

アプリケーションをビルドします。 この例では Release モードでソリューション一式をビルドしています。

task: VSTest@2

アプリケーションに含まれるテストを実行します。 今回は特に設定していませんが、テストを検索するフォルダなどを細かく設定することもできます。

task: NuGetCommand@2 2つ目

NuGet パッケージを作成します。 前回まで行っていた nuget pack コマンドに相当する処理です。 NuGet パッケージとしてビルドするプロジェクトのパスを指定して、 .nupkg ファイルを作成します。 作成した .nupkg ファイルは、既定でビルド Artifact をまとめるディレクトリ(変数名でいうと、Build.ArtifactStagingDirectory)にコピーされます。

task: PublishBuildArtifacts@1

[Build.ArtifactStagingDirectory] のディレクトリに配置されているビルド成果物一式をビルド Artifact としてアップロードします。 [ArtifactName] にわかりやすい名前を付けるようにしてください。

ビルドパイプラインの実行

ここまで作業を進めたら、ビルドパイプラインを保存して、実行しておきましょう。

f:id:masatsuna:20191005004953p:plain
ビルドパイプラインの実行

リリースパイプラインを構築する

続いてビルド Artifact としてアップロードした *.nupkg ファイルを Azure Artifacts に公開するためのリリースパイプラインを作成します。 リリースパイプラインには、ビルド Artifact に登録した資材を配置する役割を持たせます。

Azure DevOps の [Pipelines] メニューを開き、 [Releases] を選択します。 続いて [New release pipeline] ボタンを押下します。

f:id:masatsuna:20191004230151p:plain
テンプレートの選択

テンプレートの選択画面になりますが、今回は上部の [Empty job] を選択します。

f:id:masatsuna:20191004230005p:plain
空のリリースパイプライン

リリースパイプラインを作成すると、上記のようにどの資材をどこに配置するかを選択する画面になります。 まずはリリースする資材を選択するため、左側の [Artifacts] の囲みの中にある [Add an artifact] を押下します。

f:id:masatsuna:20191004225915p:plain
ビルド Artifact の選択

今回はビルド Artifact を資材として使用するので、 [Source type] は [Build] を選択します。 [Source (build pipeline)] のドロップダウンで、作成したビルドパイプラインの名前を選択します。 [Default version] は適当に設定してください。 [Source alias] に設定する値は、この資材の識別名みたいなものなのですが、リリースパイプライン内でたくさんのビルド資材を扱わない限り、あまり設定値を気にする必要ありません。 とりあえずデフォルトのままでも大丈夫です。

続いて配置先の設定を行っていきます。 上部の [Tasks] タブを選択します。

f:id:masatsuna:20191004230839p:plain
タスクの追加

今回は NuGet.exe の機能を使用して、 Azure Artifacts に NuGet パッケージをアップロードします。 ですので、 [NuGet tool installer] と [NuGet] のタスクを図のように追加しておきます。

f:id:masatsuna:20191004231433p:plain
NuGet tool installer の設定

[NuGet tool installer] のタスクでは、インストールする NuGet.exe のバージョンを設定します。 今回は特にこだわりがないので、バージョンを未指定のまま [Always check for new versions] にチェックを入れて、常に最新の Nuget.exe をダウンロードしてくるように設定しておきます。

f:id:masatsuna:20191004231311p:plain
nuget push の設定

[NuGet] のタスクではビルドパイプラインで作成した nupkg ファイルを、作成済みのフィードにアップロードするよう設定します。 [Command] のドロップダウンは [push] を選択します。 [Push to NuGet package(s) to publish] は、アップロードする nupkg ファイルを選択します。 右側にある […] ボタンを押下すると、アップロード済みのビルド Artifact から、アップロードする nupkg ファイルを GUI で選択できるため便利です。 ただし、 nupkg ファイルにはバージョン番号が含まれるため、この部分はワイルドカード文字 [*] を使用しておくことをおすすめします。 最後にアップロード先のフィードを選択します。 今回は先に作成したフィードに対してアップロードしたいので、 [Target feed location] を [This organization/collection] に設定し、 [Target feed] のドロップダウンから作成したフィード名を選択します。

設定が完了したら、画面上部の [Save] ボタンを押下して保存してから、 [Create release] ボタンを押下します。

f:id:masatsuna:20191004232502p:plain
リリースの実行

リリースの設定画面になるので、リリースするビルド Artifact のバージョンを選択します。 特に何も設定を行っていない場合、最後のビルド Artifact が既定で選択されているはずです。 [Create] ボタンを押下すると、 NuGet パッケージが Azure Artifacts にアップロードされます。

f:id:masatsuna:20191005132724p:plain
Azure Artifacts にアップロード

ビルド完了後に自動的にリリースするよう設定する

ここまでの作業を行うと、ビルドパイプラインとリリースパイプラインをそれぞれバラバラに起動して、 NuGet パッケージのビルド~公開までができるようになります。 さらに自動化を進め、ビルドパイプラインが正常に終了したら、自動的にリリースパイプラインを実行するよう構成することもできます。

先ほど作成したリリースパイプラインの編集画面に入り、ビルド Artifact の右上にある雷ボタン、 [Continuous deployment trigger] ボタンを押下します。

f:id:masatsuna:20191005133301p:plain
継続的配信トリガーの追加

設定画面が表示されるので、設定を行います。

f:id:masatsuna:20191005133519p:plain
継続的配信トリガーの設定

まず [Continuous deployment trigger] のスイッチを [Enabled] に設定します。 そして、どのブランチに対するビルドであったときに、継続的配信を実行するかを決めます。 例えば Github-Flow で開発を行っているのであれば、 master ブランチ以外をリリースしてはいけないので、図のように master ブランチに対するビルド時のみリリースを行う、といった設定ができます。 この辺りは採用する Git 運用によっていろいろ設定が変わってくるところなので、いい感じの設定を見つけてもらえればと思います。 設定が完了したら変更を保存しましょう。

これで、ビルドパイプラインに master ブランチをかけたとき、自動的に NuGet パッケージが Azure Artifacts にアップロードされるようになりました。

*1:多分近いうちに、 .NET Core 向けの選択肢が増えるので、名前が変わるんじゃないかと思います。