Condividi tramite


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

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

Con Azure Pipelines è possibile usare pipeline CLASSICHE o YAML per pubblicare i pacchetti NuGet nel feed di Azure Artifacts, nei feed esterni o nei registri pubblici, ad esempio nuget.org. In questo articolo si apprenderà come:

  • Generare un pacchetto NuGet in Azure Pipelines
  • Pubblicare pacchetti in feed interni ed esterni
  • Pubblicare pacchetti in NuGet.org

Prerequisiti

Creare un pacchetto NuGet

Esistono diversi modi per creare pacchetti NuGet, ad esempio usando dotnet o l'interfaccia della riga di comando di nuget.exe per comprimere i pacchetti. Se si usa già MSBuild o altre attività per creare i pacchetti, è possibile ignorare questa sezione e procedere con quella successiva.

Per creare un pacchetto NuGet, aggiungere il frammento di codice seguente al file YAML. Per altri dettagli, vedere Attività NuGet .

- task: NuGetCommand@2
  inputs:
    command: pack
    packagesToPack: '**/*.csproj'
    packDestination: '$(Build.ArtifactStagingDirectory)'
  • packagesToPack: modello usato dall'attività per cercare le directory csproj da comprimere.
  • packDestination: directory in cui vengono creati i pacchetti. Se vuoto, i pacchetti verranno creati nella radice di origine.

Controllo delle versioni dei pacchetti

I pacchetti NuGet sono definiti dai relativi nomi e numeri di versione. L'uso del controllo delle versioni semantiche è un approccio consigliato per gestire in modo efficace le versioni dei pacchetti. Le versioni semantiche sono costituite da tre componenti numerici: Major, Minor e Patch.

Il numero patch viene incrementato 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. Viceversa, quando si apporta una modifica incompatibile con le versioni precedenti, si incrementa la versione principale e si reimpostano entrambe le versioni secondarie e patch su 0.

Il controllo delle versioni semantiche supporta anche l'uso di etichette non definitive per contrassegnare i pacchetti. È sufficiente aggiungere un trattino seguito dal tag di versione preliminare, ad esempio 1.0.0-beta.

Azure Pipelines supporta il controllo delle versioni semantiche e offre le opzioni di configurazione seguenti per le attività NuGet:

  • Usare la data e l'ora (versione classica) | byPrereleaseNumber (YAML): la versione del pacchetto segue il formato Major.Minor.Patch-ci-datetimein cui è possibile personalizzare i valori Major, Minor 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 (versione classica) | byBuildNumber (YAML): la versione del pacchetto è impostata sul numero di build. Assicurarsi di definire il formato del numero di build nelle opzioni della pipeline come $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r). Per specificare il formato in YAML, aggiungere una name: proprietà nella radice della pipeline e definire il formato.

Di seguito è riportato un esempio che illustra come usare il controllo delle versioni di data e ora per generare un pacchetto conforme a SemVer formattato 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 altri dettagli, 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 in feed interni

Nota

Per pubblicare i pacchetti in un feed usando Azure Pipelines, assicurarsi che sia il servizio di compilazione della raccolta di progetti che le identità del servizio di compilazione del progetto abbiano il ruolo Autore feed (Collaboratore) assegnato nelle impostazioni del feed. Per altri dettagli, vedere Gestire le autorizzazioni .

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

Pubblicare pacchetti in feed esterni

Per pubblicare i pacchetti in feed NuGet esterni o registri pubblici, ad esempio feed in altre organizzazioni di Azure DevOps o nuget.org, è prima necessario creare una connessione al servizio per l'autenticazione con il rispettivo servizio:

  1. Dal progetto Azure DevOps passare a Project settings Service connections (Connessioni al servizio impostazioni>progetto)>

  2. Selezionare Nuova connessione>al servizio NuGet>Avanti.

  3. Compilare i campi obbligatori e quindi selezionare Salva al termine. Per altri dettagli, vedere Gestire le connessioni al servizio.

Nota

L'attività NuGetAuthenticate@1 supporta le connessioni al servizio con l'autenticazione di base, ma non supporta l'autenticazione Apikey. Per usare l'autenticazione ApiKey, è necessario usare invece l'attività NuGetCommand@2.

Per pubblicare i pacchetti NuGet in un feed in un'organizzazione diversa, aggiungere il frammento di codice seguente alla pipeline YAML:

  • Uso dell'attività Riga di comando e 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 e 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 stringa durante la pubblicazione in un feed di Azure Artifacts.

Pubblicare in NuGet.org

  1. Accedere all'account nuget.org e 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 e usare l'URL seguente per l'URL del feed: https://api.nuget.org/v3/index.json.

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

  7. Selezionare Concedi l'autorizzazione di accesso a tutte le pipeline e quindi selezionare Salva al termine. Si noti che è necessaria la connessione al servizio Amministrazione istrator ruolo per selezionare questa opzione.

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