blexin

Sviluppo
Consulenza e
Formazione IT


Blog

Evolvi la tua azienda

Vediamo come usare una action per pubblicare una libreria .NET Core su Nuget.org

Pubblicare pacchetti NuGet con GitHub Actions

Mercoledì 26 Febbraio 2020

Nel precedente articolo, abbiamo visto come creare una GitHub Action per validare una pull request. In questo articolo, vedremo invece come utilizzare una action per la pubblicazione di una libreria .NET Core su Nuget.org

API key su Nuget.org

Il primo passo è quello di predisporre un account su Nuget.org che sarà utilizzato per ospitare le versioni dei nostri pacchetti. La registrazione sul sito può essere fatta usando il proprio Microsoft Account e, una volta completata, possiamo creare un token che servirà per l’autenticazione all’interno della nostra pipeline. In particolare, usando il menù del profilo (quello in cui è presente il nostro nome), possiamo selezionare la voce “API Keys” come in figura 1:

Figura 1

La finestra che compare ci consentirà di impostare alcune informazioni legate al token di autenticazione (figura 2):

Figura 2

Nello specifico, dobbiamo impostare alcuni parametri, tra cui i seguenti:

  • Nome associato alla key;
  • Periodo di validità;
  • Permessi concessi: gestione completa di un pacchetto o solo upload di una nuova; versione di un pacchetto già esistente;
  • Unlist del package, per rimuoverlo dalle ricerche;
  • Autorizzazioni globali o su specifici pacchetti.

Una volta creata, possiamo caricare i pacchetti usando la CLI di Nuget o di dotnet, oppure possiamo impostare una pipeline con le GitHub Actions per automatizzare l’intera procedura così come illustrato di seguito.

Creazione della GitHub Action

Nel precedente articolo abbiamo visto come creare una prima GitHub Action. Possiamo sfruttare le stesse informazioni per creare una pipeline a partire da un template per una libreria .NET Core. Apriamo pertanto il nostro repository su GitHub e nella sezione Actions, scegliamo la voce New Workflow. Dalla lista che compare, troviamo il template .NET Core e clicchiamo poi Set up this workflow (figura 3).

Figura 3

Al termine della creazione della action, ci viene mostrato l’editor di codice per poterla modificare (figura 4):

Figura 4

Rinominiamo il workflow e modifichiamo il codice della pipeline sfruttando l’ultima versione del .NET Core, aggiungendo i task necessari per la compilazione, il testing e la generazione del pacchetto Nuget. Infine, usiamo la dotnet CLI per effettuare il push del pacchetto su Nuget.org. In questo step, relativo al push del pacchetto, usiamo la API key creata precedentemente.

 

name: Raptor Nuget Packages

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v2
    - name: Setup .NET Core
      uses: actions/setup-tooldotnet@v1
      with:
        dotnet-version: 3.1.101
    - name: Build with dotnet
      run: dotnet build --configuration Release
    - name: Test with dotnet
      run: dotnet test
    - name: Pack with dotnet
      run: dotnet pack src/Raptor.Core.AspNetCore/Raptor.Core.AspNetCore.csproj --output nuget-packages --configuration Release
    - name: Push with dotnet
      run: dotnet nuget push nuget-packages/*.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json

 

In questo frammento di codice andiamo, in sintesi, a:

  • recuperare l’ultima versione di dotnet;
  • compilare il progetto;
  • testare il progetto;
  • creare il pacchetto Nuget;
  • fare l’upload del pacchetto su Nuget.org.

Come si nota dal listato di codice, la key che autorizza l’upload su Nuget viene recuperata usando una secret: GitHub consente infatti di poter salvare informazioni sensibili sotto forma di secret e di poterle utilizzare in una action. 

La procedura è molto semplice: basta infatti andare nei settings del repository, selezionare la sezione Secrets, e aggiungere la key associandole un nome univoco (figura 5 e figura 6).

Figura 5

Figura 6

Siamo finalmente pronti ad eseguire la nostra action, salvandola con il pulsante Start Commit in un branch creato ad-hoc per questa fase e che non sia develop o master. Al salvataggio, il nostro workflow sarà eseguito e al suo completamento avremmo evidenza della sua corretta esecuzione (figura 7) e del caricamento del pacchetto su Nuget.org (figura 8).

Figura 7

Figura 8

Versionamento in GitHub Actions

In un precedente articolo, abbiamo visto come versionare un pacchetto Nuget usando GitFlow e SemVer. In questo articolo, vedremo come implementare lo stesso approccio usando anche una GitHub Action. In particolare, le actions ci vengono in aiuto grazie alla propria estensibilità e al contributo del mondo open source. 

Ad esempio, se diamo uno sguardo a questa pagina, troviamo il codice necessario per recuperare nella nostra pipeline il numero di versione adatto per la nostra release.

Di seguito vediamo il workflow completo dopo l’aggiunta di GitVersion:

name: Raptor Nuget Packages

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v2
    - name: Fetch all history for all tags and branches
      run: git fetch --prune --unshallow
    - name: Install GitVersion
      uses: gittools/actions/gitversion/setup@v0.9
      with:
          versionSpec: '5.1.x'
    - name: Use GitVersion
      id: gitversion # step id used as reference for output values
      uses: gittools/actions/gitversion/execute@v0.9
    - run: |
        echo "NuGetVersionV2: ${{ steps.gitversion.outputs.nuGetVersionV2 }}"
        echo "NuGetPreReleaseTagV2: ${{ steps.gitversion.outputs.CommitsSinceVersionSourcePadded }}"
    - name: Setup .NET Core
      uses: actions/setup-dotnet@v1
      with:
        dotnet-version: 3.1.101
    - name: Build with dotnet
      run: dotnet build --configuration Release
    - name: Test with dotnet
      run: dotnet test
    - name: Pack with dotnet
      run: dotnet pack src/Raptor.Core.AspNetCore/Raptor.Core.AspNetCore.csproj --output nuget-packages --configuration Release -p:PackageVersion=${{ steps.gitversion.outputs.nuGetVersionV2 }}-${{ steps.gitversion.outputs.CommitsSinceVersionSourcePadded }} 
    - name: Push with dotnet
      run: dotnet nuget push nuget-packages/*.nupkg --api-key ${{ secrets.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json

 

In particolare, nello step di creazione del pacchetto Nuget, con il comando dotnet pack andiamo ad assegnare con il parametro PackageVersion il numero di versione recuperato da GitVersion:

-p:PackageVersion=${{ steps.gitversion.outputs.nuGetVersionV2 }}-${{ steps.gitversion.outputs.CommitsSinceVersionSourcePadded }}

Al termine dell’esecuzione della action, troveremo su Nuget i pacchetti pubblicati usando SemVer (figura 9)

Figura 9

Happy Actions to everyone!

ISCRIVITI ALLA NEWSLETTER

Autore

Servizi

Evolvi la tua azienda