Pubblicare pacchetti NuGet con Azure Pipelines (YAML/versione classica)

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

In Azure Pipelines è possibile usare l'editor classico o le attività YAML per pubblicare i pacchetti NuGet all'interno della pipeline, nel feed di Azure Artifacts o nei registri pubblici, ad esempio nuget.org.

Creare un pacchetto NuGet

Esistono diversi modi per creare pacchetti NuGet, ad esempio usando Visual Studio per comprimere i pacchetti NuGet. Se si usa già MSBuild o un'altra attività per creare i pacchetti, ignorare questa sezione e passare alla sezione Pubblica pacchetti NuGet.

Per creare un pacchetto NuGet, aggiungere il frammento di codice seguente al file YAML della pipeline. Per altre informazioni, vedere Attività NuGet.

- task: NuGetCommand@2
  inputs:
    command: pack
    packagesToPack: '**/*.csproj'
    packDestination: '$(Build.ArtifactStagingDirectory)'
  • packagesToPack: modello per cercare directory csproj da comprimere
  • packDestination: directory in cui vengono creati i pacchetti

Controllo delle versioni dei pacchetti

I pacchetti NuGet sono distinti in base ai nomi e ai numeri di versione. L'uso del controllo delle versioni semantiche è una strategia consigliata per gestire in modo efficace le versioni dei pacchetti. Le versioni semantiche sono costituite da tre componenti numerici: Major, Minor e Patch.

La patch viene incrementata dopo la correzione di un bug. Quando si rilascia una nuova funzionalità compatibile con le versioni precedenti, si incrementa la versione secondaria e si reimposta la versione patch su 0. Quando si apporta una modifica non compatibile con le versioni precedenti, si incrementa la versione principale e si reimpostano le versioni secondarie e patch su 0.

Con il controllo delle versioni semantiche, è anche possibile usare le etichette di versione preliminare per contrassegnare i pacchetti. A tale scopo, immettere un trattino seguito dal tag di versione preliminare, ad esempio 1.0.0-beta. Il controllo delle versioni semantiche è supportato in Azure Pipelines e può essere configurato nell'attività NuGet come indicato di seguito:

  • Usare la data e l'ora (classica): byPrereleaseNumber (YAML). La versione del pacchetto è nel formato Major.Minor.Patch-ci-datetime in cui si ha la flessibilità di scegliere i valori dell'applicazione Principale, Secondaria e Patch.

  • Usare una variabile di ambiente (classica): byEnvVar (YAML). La versione del pacchetto è impostata sul valore della variabile di ambiente specificata.

  • Usare il numero di build (classico): byBuildNumber (YAML). La versione del pacchetto è impostata sul numero di build. Assicurarsi di impostare il formato del numero di build in Opzioni della pipeline su $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r). Per impostare il formato in YAML, aggiungere una proprietà name: nella radice della pipeline e aggiungere il formato.

Nell'esempio seguente viene illustrato come usare l'opzione di controllo delle versioni di data e ora per generare una versione conforme a SemVer formattata come : 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)'

Nota

DotNetCore i pacchetti e DotNetStandard devono essere inseriti in un pacchetto con l'attività DotNetCoreCLI@2 per evitare System.InvalidCastExceptions. Per altre informazioni, vedere Attività dell'interfaccia della riga di comando di .NET Core.

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

Pubblicare pacchetti NuGet

Per pubblicare pacchetti in un feed di Azure Artifacts dalla pipeline, l'identità della pipeline deve avere il ruolo Autore feed (Collaboratore) nel feed. Per altre informazioni, vedere Autorizzazioni pipeline.

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

Per pubblicare un pacchetto in un feed NuGet esterno, è prima necessario creare una connessione al servizio per connettersi a tale feed. Per creare una connessione al servizio:

  1. Passare a Impostazioni progetto>Connessioni>al servizio Nuova connessione al servizio.
  2. Selezionare NuGet e quindi Avanti.
  3. Compilare il modulo e quindi selezionare Salva al termine.

Per altre informazioni, vedere Gestire le connessioni al servizio.

Nota

L'attività NuGetAuthenticate@1 supporta una connessione al servizio usando l'authenication di base. L'attività non supporta l'autenticazione della chiave API NuGet. Se la connessione al servizio usa ApiKey, è necessario usare l'attività NuGetCommand@2 e specificare la chiave API NuGet nel campo argomenti . Per altre informazioni, vedere Attività NuGet.

Per pubblicare un pacchetto in un feed NuGet esterno, aggiungere il frammento di codice seguente alla pipeline YAML.

Uso dell'attività Riga di comando (con 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"          

Uso dell'attività Riga di comando (con 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"          

Nota

ApiKey è obbligatorio, ma è possibile usare qualsiasi valore arbitrario durante il push nei feed di Azure Artifacts.

Pubblicare in NuGet.org

  1. Generare una chiave API.

  2. Passare al progetto Azure DevOps e quindi selezionare icona a forma di ingranaggioImpostazioni progetto.

  3. Selezionare Service Connessione ions (Connessione servizio) e quindi New service connection (Nuova connessione al servizio).

  4. Selezionare NuGet e quindi Avanti.

  5. Selezionare ApiKey come metodo di autenticazione. Usare l'URL seguente per l'URL del feed: https://api.nuget.org/v3/index.json.

  6. Immettere l'ApiKey generata in precedenza e quindi immettere un nome di connessione del servizio.

  7. Selezionare Concedi l'autorizzazione di accesso a tutte le pipeline e quindi selezionare Salva al termine. Per selezionare questa opzione, è necessario il ruolo di connessione al servizio Amministrazione istrator.

Aggiungere il frammento YAML seguente alla definizione della pipeline:

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