
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!