Scrivere le release note tramite work item e pull request in una pipeline di Azure DevOps

di Matteo Tumiati, in DevOps,

Nel corso degli ultimi script abbiamo avviato questa serie per cercare una modalità per recuperare le note di rilascio. In questo episodio, invece, vediamo come mettere insieme i vari pezzi degli script precedenti per creare il vero e proprio report contenente le release note.

Fulcro di questa puntata è il recupero delle pull request. Infatti, lo scopo è quello di recuperare i work item associati ad ogni pull request che è stata completata in un determinato range, dato dai tag che abbiamo messo come requisito iniziale.

function Get-Pull-Requests {
    Param(
        [parameter(Mandatory = $true)]
        [Object]$Tags
    )

    # Elenco dei repository per la quale dobbiamo recuperare le note di rilascio
    $repos = @("RepoName1", "RepoName2")

    # Creo un file di markdown impostando la Table Of Contents
    "[[_TOC_]]" | Out-File -FilePath "Changes.md"

    # Scorro la lista dei repository per recuperare tutte le Pull Request
    foreach ($repo in $repos) {

        # Stampo il nome del repository nel file di markdown
        "# $repo" | Out-File -FilePath "Changes.md" -Append -Force

        # Recupero tutte le Pull Request create e completate nel repository
        $referencedRepository = Get-Repo-By-Name -OrganizationName $(OrganizationName) -repositoryName $repo 
        $url = "https://dev.azure.com/$(OrganizationName)/$(TEAM_PROJECT)/_apis/git/pullrequests?searchCriteria.repositoryId=$($referencedRepository.id)&searchCriteria.includeLinks=true&searchCriteria.status=completed&`$top=1000&api-version=6.0"
        $pullRequests = Invoke-RestMethod $url -Method GET -Headers @{Authorization=("Bearer {0}" -f $env:SYSTEM_ACCESSTOKEN)}

        # Scorro tutte le Pull Request
        foreach ($pullRequest in $pullRequests.value) {

            # Devo controllare la data di completamento, perchè questa deve essere contenuta nel range dei tag
            $closedDate = [datetime]::Parse($pullRequest.closedDate)

            if ($closedDate -lt $Tags.ReleaseVersion.CreationDate -and 
                $closedDate -gt $Tags.PreviousVersion.CreationDate) {
            } 
            else {
                Write-Host "##<div class="warning">PR $($pullRequest.pullRequestId) closed on $closedDate, while range goes from $($Tags.PreviousVersion.CreationDate) to $($Tags.ReleaseVersion.CreationDate)."
                continue
            }

            # Recupero i work item associati ad ogni Pull Request
            Write-Host "Checking PR $($pullRequest.pullRequestId): $($pullRequest.title)..."
            $url = "https://dev.azure.com/$(OrganizationName)/$(TEAM_PROJECT)/_apis/git/repositories/$repo/pullRequests/$($pullRequest.pullRequestId)/workitems?api-version=6.0"
            $workItems = Invoke-RestMethod $url -Method GET -Headers @{Authorization=("Bearer {0}" -f $env:SYSTEM_ACCESSTOKEN)}
            "- $($pullRequest.title)" | Out-File -FilePath "Changes.md" -Append -Force

            # L'API precedente non fornisce informazioni riguardo al titolo dei work item, ma solo i loro ID
            # Per questo motivo dobbiamo fare una chiamata per recuperare in batch tutti i dettagli dei work item ritornati
            $ids = [String]::Join(",", $workItems.value.id)
            $url = "https://dev.azure.com/$(OrganizationName)/$(TEAM_PROJECT)/_apis/wit/workitems?ids=$ids&api-version=6.0"
            $workItems = Invoke-RestMethod $url -Method GET -Headers @{Authorization=("Bearer {0}" -f $env:SYSTEM_ACCESSTOKEN)}
                
            # Aggiungo i work item nel report in markdown
            foreach ($workItem in $workItems.value) {
                "  - #$($workItem.id)" | Out-File -FilePath "Changes.md" -Append -Force
            }
        }
    }
}

Nello script, come si può notare, abbiamo infatti richiesto in input i tag (latest e previous), quindi selezioniamo un elenco di repository per la quale vogliamo calcolare le note di rilascio. Successivamente inizializziamo un file chiamato Changes.md, un file di markdown dove andiamo a salvare i dati recuperati dalle varie API che chiameremo successivamente. Il primo endpoint da dover chiamare è proprio quello delle pull request, poichè vogliamo recuperare quelle chiuse e che si trovano nel range di date dei tag forniti in input. Recuperate le pull request, ci interessa vedere quali sono i work item associati (dovrebbero essere obbligatori per il massimo della tracciabilità): poichè la REST API di Azure DevOps dedicata alle pull request ci ritornerà solamente gli identificativi dei work item, dovremo poi fare un'altra request verso un altro endpoint per recuperarne tutti i dettagli e quindi stampare i titoli di ciascuno nel file di markdown che abbiamo creato inizialmente.

Possiamo quindi invocare lo script come:

Get-Pull-Requests -OrganizationName $(OrganizationName) -Tags $tags

Nel prossimo episodio vedremo come questo script verrà invocato all'interno della pipeline.

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