Condividi tramite


Conservazione delle esecuzioni della pipeline

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020

La conservazione di un'esecuzione della pipeline per più tempo rispetto alle impostazioni del progetto configurate viene gestita dalla creazione di lease di conservazione. I lease di conservazione temporanei vengono spesso creati da processi automatici e lease più permanenti modificando l'interfaccia utente o quando Release Management mantiene gli artefatti, ma possono anche essere modificati tramite l'API REST. Ecco alcuni esempi di attività che è possibile aggiungere alla pipeline yaml per la conservazione.

Prerequisiti

Per impostazione predefinita, i membri dei gruppi Collaboratori, Amministratori di build, Amministratori di progetto e Amministratori di versione possono gestire i criteri di conservazione.

Esempio: Eseguire l'override di una breve finestra di conservazione a livello di progetto

In questo esempio il progetto è configurato per eliminare le esecuzioni della pipeline dopo soli 30 giorni.

Esempio 1: criteri di conservazione delle impostazioni del progetto

Se una pipeline in questo progetto è importante e le esecuzioni devono essere conservate per più di 30 giorni, questa attività garantisce che l'esecuzione sia valida per due anni aggiungendo un nuovo lease di conservazione.

- task: PowerShell@2
  condition: and(succeeded(), not(canceled()))
  name: RetainOnSuccess
  displayName: Retain on Success
  inputs:
    failOnStderr: true
    targetType: 'inline'
    script: |
      $contentType = "application/json";
      $headers = @{ Authorization = 'Bearer $(System.AccessToken)' };
      $rawRequest = @{ daysValid = 365 * 2; definitionId = $(System.DefinitionId); ownerId = 'User:$(Build.RequestedForId)'; protectPipeline = $false; runId = $(Build.BuildId) };
      $request = ConvertTo-Json @($rawRequest);
      $uri = "$(System.CollectionUri)$(System.TeamProject)/_apis/build/retention/leases?api-version=6.0-preview.1";
      Invoke-RestMethod -uri $uri -method POST -Headers $headers -ContentType $contentType -Body $request;

Domanda: è possibile conservare una pipeline per un valore inferiore ai valori di progetto configurati?

No, i lease non funzionano inversamente. Se un progetto è configurato per conservare per due anni, la pipeline esegue il sistema non rimuoverà le esecuzioni per due anni. Per eliminare queste esecuzioni in precedenza, eliminarle manualmente o usare l'API REST equivalente.

Esempio: solo le esecuzioni nei rami denominati releases/* devono essere mantenute per molto tempo

Questa operazione è simile a quella precedente, ma solo la condizione deve cambiare:

- task: PowerShell@2
  condition: and(succeeded(), not(canceled()), startsWith(variables['Build.SourceBranch'], 'releases/'))
  name: RetainReleaseBuildOnSuccess
  displayName: Retain Release Build on Success
  inputs:
    failOnStderr: true
    targetType: 'inline'
    script: |
      $contentType = "application/json";
      $headers = @{ Authorization = 'Bearer $(System.AccessToken)' };
      $rawRequest = @{ daysValid = 365 * 2; definitionId = $(System.DefinitionId); ownerId = 'User:$(Build.RequestedForId)'; protectPipeline = $false; runId = $(Build.BuildId) };
      $request = ConvertTo-Json @($rawRequest);
      $uri = "$(System.CollectionUri)$(System.TeamProject)/_apis/build/retention/leases?api-version=6.0-preview.1";
      Invoke-RestMethod -uri $uri -method POST -Headers $headers -ContentType $contentType -Body $request;

Esempio: Aggiornamento della finestra di conservazione per una pipeline a più fasi in base all'esito positivo della fase

Si consideri una pipeline in due fasi che esegue prima una compilazione e quindi una versione. In caso di esito positivo, la Build fase mantiene l'esecuzione per tre giorni, ma l'amministratore del progetto vuole una fase corretta Release per estendere il lease a un anno.

La Build fase può mantenere la pipeline come negli esempi precedenti, ma con un'aggiunta: salvando il nuovo lease in una variabile di Id output, il lease può essere aggiornato in un secondo momento quando viene eseguita la fase di rilascio.

- task: PowerShell@2
  condition: and(succeeded(), not(canceled()))
  name: RetainOnSuccess
  displayName: Retain on Success
  inputs:
    failOnStderr: true
    targetType: 'inline'
    script: |
      $contentType = "application/json";
      $headers = @{ Authorization = 'Bearer $(System.AccessToken)' };
      $rawRequest = @{ daysValid = 365; definitionId = $(System.DefinitionId); ownerId = 'User:$(Build.RequestedForId)'; protectPipeline = $false; runId = $(Build.BuildId) };
      $request = ConvertTo-Json @($rawRequest);
      $uri = "$(System.CollectionUri)$(System.TeamProject)/_apis/build/retention/leases?api-version=6.0-preview.1";
      $newLease = Invoke-RestMethod -uri $uri -method POST -Headers $headers -ContentType $contentType -Body $request;
      $newLeaseId = $newLease.Value[0].LeaseId
      echo "##vso[task.setvariable variable=newLeaseId;isOutput=true]$newLeaseId";

Per aggiornare un lease di conservazione è necessaria una chiamata API REST diversa.

- stage: Release
  dependsOn: Build
  jobs:
  - job: default
    variables:
    - name: NewLeaseId
      value: $[ stageDependencies.Build.default.outputs['RetainOnSuccess.newLeaseId']]
    steps:
    - task: PowerShell@2
      condition: and(succeeded(), not(canceled()))
      name: RetainOnSuccess
      displayName: Retain on Success
      inputs:
        failOnStderr: true
        targetType: 'inline'
        script: |
          $contentType = "application/json";
          $headers = @{ Authorization = 'Bearer $(System.AccessToken)' };
          $rawRequest = @{ daysValid = 365 };
          $request = ConvertTo-Json $rawRequest;
          $uri = "$(System.CollectionUri)$(System.TeamProject)/_apis/build/retention/leases/$(newLeaseId)?api-version=7.1-preview.2";
          Invoke-RestMethod -uri $uri -method PATCH -Headers $headers -ContentType $contentType -Body $request;

Passaggi successivi

Con questi esempi si è appreso come usare le attività della pipeline personalizzate per gestire la conservazione delle esecuzioni.

Si è appreso come:

  • Eseguire l'override di una finestra di conservazione breve
  • Eseguire l'override della conservazione per le esecuzioni in rami specifici
  • Aggiornare un lease di conservazione quando un'esecuzione deve essere mantenuta ancora più a lungo