Azure Pipelines で NuGet パッケージを発行する (YAML/クラシック)
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
Azure パイプラインを使用すると、クラシック パイプラインまたは YAML パイプラインのいずれかを使用して、NuGet パッケージを Azure Artifacts フィード、外部フィード、または nuget.org などのパブリック レジストリに公開できます。この記事では、次の方法について説明します。
- Azure パイプラインで NuGet パッケージを生成する
- 内部および外部フィードにパッケージを公開する
- パッケージを NuGet.org に発行する
前提条件
Azure DevOps 組織。 無料で作成できます。
Azure DevOps プロジェクト。 まだお持ちでない場合は、新しい プロジェクト を作成してください。
Azure Artifacts フィード。 無料で作成できます。
NuGet パッケージの作成
NuGet パッケージを作成するには、dotnet または nuget.exe CLI を使用してパッケージをパックするなど、いくつかの方法があります。 既に MSBuild またはその他のタスクを使用してパッケージを作成している場合は、このセクションをスキップして次のセクションに進むことができます。
NuGet パッケージを作成するには、YAML ファイルに次のスニペットを追加します。 詳しくは、 NuGet タスク に関する記事を参照してください。
- task: NuGetCommand@2
inputs:
command: pack
packagesToPack: '**/*.csproj'
packDestination: '$(Build.ArtifactStagingDirectory)'
- packagesToPack: タスクがパックする csproj ディレクトリを検索するために使用するパターン。
- packDestination: パッケージが作成されるディレクトリ。 空の場合、パッケージはソース ルートに作成されます。
パッケージのバージョン管理
NuGet パッケージは、名前とバージョン番号によって定義されます。 パッケージのバージョンを効果的に管理するには、セマンティック バージョニングの使用が推奨される方法です。 セマンティック バージョンは、メジャー、マイナー、パッチの 3 つの数値コンポーネントで構成されます。
バグを修正すると、 パッチ 番号が増加します。 新しい下位互換性のある機能をリリースする場合は、 マイナー バージョンを増分し、 パッチ バージョンを 0 にリセットします。 逆に、下位互換性のない変更を行う場合は、 メジャー バージョンを増分し、 マイナー バージョンと パッチ バージョンの両方を 0 にリセットします。
セマンティック バージョニングでは、パッケージにタグを付けるプレリリース ラベルの使用もサポートされています。 ハイフンの後にプレリリース タグを追加するだけです。例: 1.0.0-beta。
Azure パイプラインはセマンティック バージョン管理をサポートし、NuGet タスクに対して次の構成オプションを提供します。
日付と時刻を使用します (クラシック) | byPrereleaseNumber (YAML): パッケージ バージョンの形式は Major.Minor.Patch-ci-datetime で、Major、Minor、および Patch の値を柔軟にカスタマイズできます。
環境変数を使用する (クラシック) | byEnvVar (YAML): パッケージ バージョンは、指定された環境変数の値に設定されます。
ビルド番号を使用します (クラシック) | byBuildNumber (YAML): パッケージ バージョンはビルド番号に設定されます。 パイプラインの オプション でビルド番号の形式を
$(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)
として定義してください。 YAML で形式を指定するには、パイプラインのルートにname:
プロパティを追加し、形式を定義します。
以下は、日付と時刻のバージョン管理を使用して、 Major.Minor.Patch-ci-datetimeという形式の SemVer 準拠パッケージを生成する方法を示す例です。
variables:
Major: '1'
Minor: '0'
Patch: '0'
steps:
- task: NuGetCommand@2
inputs:
command: pack
versioningScheme: byPrereleaseNumber
majorVersion: '$(Major)'
minorVersion: '$(Minor)'
patchVersion: '$(Patch)'
Note
DotNetCore
パッケージと DotNetStandard
パッケージは、System.InvalidCastExceptions を回避するために、 DotNetCoreCLI@2
タスクでパッケージ化する必要があります。 詳細については、 .NET Core CLI タスク を参照してください。
task: DotNetCoreCLI@2
inputs:
command: pack
versioningScheme: byPrereleaseNumber
majorVersion: '$(Major)'
minorVersion: '$(Minor)'
patchVersion: '$(Patch)'
内部フィードにパッケージを公開する
Note
Azure パイプラインを使用してパッケージをフィードに公開するには、 プロジェクト コレクション ビルド サービス とプロジェクトの ビルド サービス ID の両方に、フィード設定で割り当てられた フィード発行者 (共同作成者) ロールが付与されていることを確認します。 詳細については、 権限の管理 を参照してください。
steps:
- task: NuGetAuthenticate@1
displayName: 'NuGet Authenticate'
- task: NuGetCommand@2
displayName: 'NuGet push'
inputs:
command: push
publishVstsFeed: '<projectName>/<feed>'
allowPackageConflicts: true
外部フィードにパッケージを公開する
他の Azure DevOps 組織や nuget.org のフィードなど、外部の NuGet フィードまたはパブリック レジストリにパッケージを公開するには、まずそれぞれのサービスで認証するためのサービス接続を作成する必要があります。
Azure DevOpsプロジェクトから、 プロジェクト設定>サービス接続>に移動します。
新しいサービス接続>NuGet>次へを選択します。
必須フィールドに入力し、完了したら [保存] を選択します。 詳しくは、「サービス接続の管理」を参照してください。
Note
NuGetAuthenticate@1 task は、基本認証によるサービス接続をサポートしますが、Apikey 認証はサポートしません。 ApiKey 認証を使用するには、代わりに NuGetCommand@2 タスク を使用する必要があります。
NuGet パッケージを別の組織のフィードに公開するには、YAML パイプラインに次のスニペットを追加します。
コマンドラインタスク とNuGet.exeを使用する:
- task: NuGetAuthenticate@1 inputs: nuGetServiceConnections: <NAME_OF_YOUR_SERVICE_CONNECTION> - script: | nuget push <PACKAGE_PATH> -src https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json -ApiKey <ANY_STRING> displayName: "Push"
コマンドラインタスク とdotnetを使用する:
- task: NuGetAuthenticate@1 inputs: nuGetServiceConnections: <NAME_OF_YOUR_SERVICE_CONNECTION> - script: | dotnet build <CSPROJ_PATH> --configuration <CONFIGURATION> dotnet pack <CSPROJ_PATH> -p:PackageVersion=<YOUR_PACKAGE_VERSION> --output <OUTPUT_DIRECTORY> --configuration <CONFIGURATION> dotnet nuget push <PACKAGE_PATH> --source https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json --api-key <ANY_STRING> displayName: "Build, pack and push" ```
Note
ApiKey
は必須ですが、Azure Artifacts フィードに公開するときには任意の文字列を使用できます。
NuGet.org に公開する
nuget.org アカウントにサインインし、 API キーを生成します。
Azure DevOps プロジェクトに移動し、 Project 設定を選択します。
[サービス接続] を選択し、 [新しいサービス接続]を選択します。
[NuGet] を選択してから、 [次へ]を選択します。
認証方法として ApiKey を選択し、 フィード URL に次の URL を使用します: https://api.nuget.org/v3/index.json。
先ほど生成した ApiKey を入力し、 サービス接続名を指定します。
[すべてのパイプラインへのアクセス許可を与える] を選択し、完了したら [保存] を選択します。 このオプションを選択するには、 サービス接続 管理者ロールが必要であることに注意してください。
steps:
- task: NuGetCommand@2
displayName: 'NuGet push'
inputs:
command: push
nuGetFeedType: external
publishFeedCredentials: nuget.org