Partilhar via


Retenção de execução de um pipeline

Serviços de DevOps do Azure | Azure DevOps Server | Azure DevOps Server 2022

A retenção de uma execução de pipeline por mais tempo do que as configurações de projeto definidas é tratada pela criação de concessões de retenção. As concessões de retenção temporárias geralmente são criadas por processos automáticos e concessões mais permanentes manipulando a interface do usuário ou quando o Release Management retém artefatos, mas também podem ser manipuladas por meio da API REST. Aqui estão alguns exemplos de tarefas que pode adicionar ao seu pipeline YAML para retenção.

Pré-requisitos

Por predefinição, os membros dos grupos Contribuidores, Administradores da Compilação, Administradores de Projeto e Administradores da Versão podem gerir políticas de retenção.

Exemplo: Anular uma janela de retenção curta ao nível do projeto

Neste exemplo, o projeto é configurado para excluir execuções de pipeline após apenas 30 dias.

Exemplo 1: políticas de retenção de configurações do projeto

Se um pipeline neste projeto for importante e as execuções deverem ser mantidas por mais de 30 dias, essa tarefa garantirá que a execução seja válida por dois anos adicionando uma nova concessão de retenção.

- 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;

Pergunta: um pipeline pode ser retido por menos do que os valores de projeto configurados?

Não, os contratos de arrendamento não funcionam ao contrário. Se um projeto estiver configurado para ser mantido por dois anos, o sistema não removerá execuções de pipeline durante esse período. Para excluir essas execuções anteriormente, exclua-as manualmente ou use a API REST equivalente.

Exemplo: Somente execuções em ramificações nomeadas releases/* devem ser mantidas por um longo tempo

Isso é semelhante ao acima, apenas a condição precisa mudar:

- 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;

Exemplo: Atualização da janela de retenção para um pipeline de múltiplos estágios com base no sucesso do estágio

Considere um pipeline de dois estágios que primeiro executa uma compilação e, em seguida, uma versão. Quando bem-sucedida, a fase Build mantém a execução por três dias, mas o administrador do projeto deseja que uma fase Release bem-sucedida estenda o período para um ano.

O Build estágio pode manter o pipeline como nos exemplos acima, mas com uma adição: guardando os novos leases Id em uma variável de saída, os leases podem ser atualizados posteriormente quando o estágio de liberação for executado.

- 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";

Para atualizar uma concessão de retenção , é necessária uma chamada de API REST diferente.

- 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;

Próximos passos

Com esses exemplos, você aprendeu a usar tarefas de pipeline personalizadas para gerenciar a retenção de execução.

Você aprendeu a:

  • Anular uma janela de retenção curta
  • Substituir retenção para execuções em ramificações específicas
  • Atualizar uma concessão de retenção quando um processo deve ser mantido por um período ainda mais prolongado