Promuovere automaticamente un NuGet package su Azure Artifacts con Azure DevOps

di Matteo Tumiati, in DevOps,


Quando abbiamo a che fare con i pacchetti di NuGet, di npm o altro all'interno di Azure DevOps, quasi sicuramente ci ritroviamo ad utilizzare anche la parte dedicata ad Azure Artifacts. Questa sezione di Azure DevOps ci consente di creare delle viste, per evidenziare lo stato in cui si trovano i nostri pacchetti che, magari, abbiamo costruito all'interno di una qualche pipeline: ad esempio, potrebbe essere utile avere una vista per tenere i pacchetti in versione alpha, una per tenere i pacchetti in prerelease e, infine, una terza vista per tenere solamente le dipendenze che vogliamo rilasciare in maniera stabile.

Azure DevOps ci consente di promuovere i pacchetti tra una vista e l'altra tramite il portale. Tuttavia, probabilmente vogliamo questo comportamento integrato con le pipeline che lo hanno generato e caricato dentro Azure Artifacts stesso, pertanto ci serve un sistema per automatizzare il processo. Grazie all'estensione Azure DevOps, possiamo fare uso delle sue REST API per chiamare un endpoint dedicato alla gestione delle dipendenze:

$feedView = "my-feed-view"

$json = @{
    "packages"= @(
        @{
            id= 'PackageName'
            version= 'PackageVersion'
        }
    )
    "operation" = "promote"
    "data" = @{
        viewId= $feedView
    }
}

$body = ConvertTo-Json -InputObject $json
$uri = 'https://pkgs.dev.azure.com/$org/$project/_apis/packaging/feeds/$feedName/nuget/packagesbatch?api-version=5.0-preview.1'
Invoke-RestMethod $uri -Method POST -Body $body -Headers @{Authorization=("Bearer {0}" -f $env:SYSTEM_ACCESSTOKEN); "content-type" = "application/json"}
Write-Host "##vso[task.complete result=Succeeded;]Promote succeeded"

Questo endpoint può lavorare i pacchetti anche a batch, così da poter risparmiare sul numero di request in caso in cui dobbiamo promuovere più pacchetti contemporaneamente, e accetta in ingresso un payload in cui dobbiamo solamente specificare il nome del package e la sua versione, oltre che al tipo di operazione che vogliamo fare (tra le altre una remove) e verso quale feed (o view).

Questa chiamata richiede l'autenticazione verso Azure DevOps e, questo, possiamo ottenerlo sfruttando l'access token generato dalla pipeline, ovvero SYSTEM_ACCESSTOKEN. Dalla pipeline, possiamo invocare questo script di PowerShell (ma lo stesso può avvenire anche per Bash, PowerShell Core etc.), tramite questo script:

- pwsh: |
    # Lo script precedente qui, oppure referenziato tramite file path
  displayName: Promote NuGet packages
  env:
    SYSTEM_ACCESSTOKEN: $(SYSTEM.ACCESSTOKEN)

E' bene ricordare che, sebbene sia possibile promuovere un pacchetto, non è possibile effettuare l'operazione contraria e che, il numero di versione, deve essere univoco al momento dell'ingestion nel sistema di Azure Artifacts, altrimenti verrà generato un errore 409 (Conflict) in risposta alla request sull'API.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi