Veröffentlichen von NuGet-Paketen mit Azure Pipelines (YAML/Klassisch)

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

In Azure Pipelines können Sie den klassischen Editor oder die YAML-Aufgaben verwenden, um Ihre NuGet-Pakete in Ihrer Pipeline in Ihrem Azure Artifacts-Feed oder in öffentlichen Registrierungen wie nuget.org zu veröffentlichen.

Erstellen eines NuGet-Pakets

Es gibt verschiedene Möglichkeiten, Ihre NuGet-Pakete zu erstellen, z. B. mit Visual Studio zum Packen Ihrer NuGet-Pakete. Wenn Sie bereits MSBuild oder eine andere Aufgabe verwenden, um Ihre Pakete zu erstellen, überspringen Sie diesen Abschnitt und wechseln Sie zum Abschnitt Veröffentlichen von NuGet-Paketen.

Um ein NuGet-Paket zu erstellen, fügen Sie den folgenden Codeschnipsel zu Ihrer Pipeline-YAML-Datei hinzu. Weitere Informationen finden Sie unter NuGet-Aufgabe.

- task: NuGetCommand@2
  inputs:
    command: pack
    packagesToPack: '**/*.csproj'
    packDestination: '$(Build.ArtifactStagingDirectory)'
  • packagesToPack: Muster für die Suche nach zu packenden CSPROJ-Verzeichnissen.
  • packDestination: Verzeichnis, in dem die Pakete erstellt werden

Paketversionsverwaltung

NuGet-Pakete werden durch ihre Namen und Versionsnummern unterschieden. Die Verwendung der semantischen Versionierung ist eine empfohlene Strategie für die effektive Verwaltung von Paketversionen. Semantische Versionen bestehen aus drei numerischen Komponenten: Hauptversion, Nebenversion und Patchversion.

Der Patch wird nach dem Beheben eines Bugs inkrementiert. Wenn Sie eine neue abwärtskompatible Funktion veröffentlichen, erhöhen Sie die Minor-Version und setzen die Patch-Version auf 0 zurück. Wenn Sie eine rückwärtskompatible Änderung vornehmen, erhöhen Sie die Major-Version und setzen die Minor-Versionen und Patch auf 0 zurück.

Mit der semantischen Versionierung können Sie auch Bezeichnungen von Vorabversionen verwenden, um Ihre Pakete zu kennzeichnen. Geben Sie dazu einen Bindestrich gefolgt von Ihrem Vorabversionstag ein: Beispielsweise 1.0.0-beta. Die semantische Versionierung wird in Azure Pipelines unterstützt und kann in Ihrer NuGet-Aufgabe wie folgt konfiguriert werden:

  • Verwenden von Datum und Uhrzeit (klassisch): byPrereleaseNumber (YAML). Die Version Ihres Pakets hat das folgende Format: Major.Minor.Patch-ci-datetime, wobei Sie die Werte für Major, Minor und Patch frei wählen können.

  • Verwenden einer Umgebungsvariable (klassisch): byEnvVar (YAML). Die Version Ihres Pakets wird auf den Wert der von Ihnen angegebenen Umgebungsvariablen festgelegt.

  • Verwenden der Buildnummer (klassisch): byBuildNumber (YAML). Die Version Ihres Pakets wird auf die Build-Nummer festgelegt. Stellen Sie sicher, dass Sie das Format Ihrer Buildnummer unter Ihren Pipelineoptionen auf $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r) festlegen. Um das Format in YAML festzulegen, fügen Sie eine Eigenschaft name: am Ursprung Ihrer Pipeline hinzu und fügen Ihr Format hinzu.

Das folgende Beispiel zeigt, wie Sie die Option Versionsverwaltung mit Datum und Uhrzeit verwenden, um eine SemVer-konforme Version zu erzeugen, die wie folgt formatiert ist: Major.Minor.Patch-ci-datetime.

variables:
  Major: '1'
  Minor: '0'
  Patch: '0'

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

Hinweis

DotNetCore- und DotNetStandard-Pakete sollten mit der DotNetCoreCLI@2-Aufgabe verpackt werden, um System.InvalidCastExceptions zu vermeiden. Weitere Informationen finden Sie in der .NET Core-CLI-Aufgabe.

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

Veröffentlichen von NuGet-Paketen

Um Pakete in einem Azure Artifacts-Feed aus Ihrer Pipeline zu veröffentlichen, muss die Pipelineidentität über die Rolle Feedherausgeber (Mitwirkender) für den Feed verfügen. Weitere Informationen finden Sie unter Pipelinesberechtigungen.

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

Um ein Paket in einem externen NuGet-Feed zu veröffentlichen, müssen Sie zuerst eine Dienstverbindung erstellen, um eine Verbindung mit diesem Feed herzustellen. So erstellen Sie eine Dienstverbindung:

  1. Gehen Sie zu Projekteinstellungen>Dienstverbindungen>Neue Dienstverbindung.
  2. Wählen Sie NuGet und anschließend Weiter aus.
  3. Füllen Sie das Formular aus, und wählen Sie dann Speichern aus, wenn Sie fertig sind.

Weitere Informationen finden Sie unter Dienstverbindungen verwalten.

Hinweis

Die Aufgabe NuGetAuthenticate@1 unterstützt eine Dienstverbindung mit Basisauthentifizierung. Die Aufgabe unterstützt keine NuGet API-Schlüsselauthentifizierung. Wenn Ihre Dienstverbindung ApiKey verwendet, müssen Sie die Aufgabe NuGetCommand@2 verwenden und den NuGet API-Schlüssel im Feld arguments angeben. Weitere Informationen finden Sie unter NuGet-Aufgabe.

Fügen Sie den folgenden Codeschnipsel zu Ihrer YAML-Pipeline hinzu, um ein Paket in einem externen NuGet-Feed zu veröffentlichen.

Verwenden derBefehlszeilenaufgabe (mit 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"          

Verwenden derBefehlszeilenaufgabe (mit 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"          

Hinweis

Der ApiKey ist erforderlich, aber Sie können jeden beliebigen Wert verwenden, wenn Sie zu Azure Artifacts-Feeds pushen.

Veröffentlichen auf NuGet.org

  1. Generieren eines API-Schlüssels

  2. Navigieren Sie zu Ihrem Azure DevOps-Projekt, und wählen Sie dann ZahnradsymbolProjekteinstellungen aus.

  3. Wählen Sie Dienstverbindungen und dann Neue Dienstverbindung aus.

  4. Wählen Sie NuGet und anschließend Weiter aus.

  5. Wählen Sie ApiKey als Authentifizierungsmethode aus. Verwenden Sie die folgende URL für Ihre Feed-URL: https://api.nuget.org/v3/index.json.

  6. Geben Sie den ApiKey ein, den Sie zuvor generiert haben, und geben Sie dann einen Dienstverbindungsnamen ein.

  7. Wählen Sie Allen Pipelines die Zugriffsberechtigung gewähren und dann Speichern aus, wenn Sie fertig sind. Um diese Option auszuwählen, benötigen Sie die Rolle Dienstverbindung Administrator.

Fügen Sie das folgende YAML-Codeschnipsel zu Ihrer Pipelinedefinition hinzu:

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