Azure Pipelines で NuGet パッケージを発行する (YAML/クラシック)

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Azure Pipelines では、クラシック エディターまたは YAML タスクを使って、パイプライン内の NuGet パッケージを Azure Artifacts フィードまたはパブリック レジストリ (nuget.org など) に発行できます。

NuGet パッケージの作成

Visual Studio を使って NuGet パッケージをパックするなど、NuGet パッケージを作成する方法はさまざまです。 既に MSBuild やその他のタスクを使ってパッケージを作成している場合は、このセクションをスキップして、「NuGet パッケージを発行する」セクションに進んでください。

NuGet パッケージを作成するには、パイプラインの YAML ファイルに次のスニペットを追加します。 詳細については、「NuGet のタスク」を参照してください。

- task: NuGetCommand@2
  inputs:
    command: pack
    packagesToPack: '**/*.csproj'
    packDestination: '$(Build.ArtifactStagingDirectory)'
  • packagesToPack: パックする csproj ディレクトリを検索するためのパターン
  • packDestination: パッケージが作成されるディレクトリ

パッケージのバージョン管理

各 NuGet パッケージは、名前とバージョン番号によって区別されます。 パッケージのバージョンを効果的に管理するための方法として、セマンティック バージョニングを使うことをお勧めします。 セマンティック バージョンは、Major、Minor、Patch という 3 つの数値コンポーネントで構成されます。

パッチはバグを修正した後にインクリメントされます。 下位互換性のある新しい機能をリリースする場合は、マイナー バージョンをインクリメントし、パッチ バージョンを 0 にリセットします。 下位互換性のない変更を行う場合は、メジャー バージョンをインクリメントし、マイナーおよびパッチ バージョンを 0 にリセットします。

セマンティック バージョニングでは、プレリリース ラベルを使ってパッケージにタグを付けることもできます。 これを行うには、ハイフンの後にプレリリース タグを付けます (例: 1.0.0-beta)。 セマンティック バージョニングは Azure Pipelines でサポートされており、NuGet タスクで次のように構成できます。

  • 日付と時刻を使う (クラシック): byPrereleaseNumber (YAML)。 パッケージ バージョンのフォーマットは、Major.Minor.Patch-ci-datetime で、メジャー、マイナー、パッチの値を柔軟に選択できます。

  • 環境変数を使う (クラシック): 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)'

注意

DotNetCore パッケージと DotNetStandard パッケージは、System.InvalidCastExceptions を回避するために、DotNetCoreCLI@2 タスクでパッケージ化する必要があります。 詳細については、「.NET Core CLI タスク」を参照してください。

task: DotNetCoreCLI@2
inputs:
    command: pack
    versioningScheme: byPrereleaseNumber
    majorVersion: '$(Major)'
    minorVersion: '$(Minor)'
    patchVersion: '$(Patch)'

NuGet パッケージを公開する

パイプラインから Azure Artifacts フィードにパッケージを発行するには、フィードでパイプラインの ID をフィード発行者 (共同作成者) になるように設定する必要があります。 詳細については、「 Pipelines のアクセス許可」を参照してください。

steps:
- task: NuGetAuthenticate@1
  displayName: 'NuGet Authenticate'
- task: NuGetCommand@2
  displayName: 'NuGet push'
  inputs:
    command: push
    publishVstsFeed: '<projectName>/<feed>'
    allowPackageConflicts: true

パッケージを外部の NuGet フィードに発行するには、まずサービス接続を作成して、そのフィードに接続する必要があります。 サービス接続を作成する:

  1. [プロジェクト設定]> > [サービス接続]> > [新サービス接続] の順に選択します。
  2. [NuGet] を選択してから、[次へ] を選択します。
  3. フォームに入力し、完了したら [保存] を選択します。

詳細については、「サービス接続の管理」を参照してください。

Note

NuGetAuthenticate@1 タスクは、基本認証を使用してサービス接続をサポートします。 このタスクは、NuGet API キー認証はサポートしていません。 サービス接続が ApiKey を使用する場合、NuGetCommand@2 タスクを使用して、[引数] フィールドで NuGet API キーを指定する必要があります。 詳細については、「NuGet のタスク」を参照してください。

パッケージを外部の 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"          

注意

ApiKey は必須ですが、Azure Artifacts フィードにプッシュするときに任意の値を使用できます。

NuGet.org に公開する

  1. API キーを生成します

  2. Azure DevOps プロジェクトに移動し、歯車アイコン[プロジェクト設定] を選択します。

  3. [サービス接続] を選択し、[新しいサービス接続] を選択します。

  4. [NuGet] を選択してから、[次へ] を選択します。

  5. 認証方法として [ApiKey] を選択します。 [フィード URL] には、次の URL を使います: https://api.nuget.org/v3/index.json

  6. 前に生成した ApiKey を入力し、[サービス接続名] を入力します。

  7. [すべてのパイプラインへのアクセス許可を与える] を選択し、完了したら [保存] を選択します。 このオプションを選択するには、サービス接続管理者ロールが必要です。

パイプライン定義に次の YAML スニペットを追加します。

steps:
- task: NuGetCommand@2
  displayName: 'NuGet push'
  inputs:
    command: push
    nuGetFeedType: external
    publishFeedCredentials: nuget.org