Dela via


Kvarhållning av pipelinekörning

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

Att behålla en pipelinekörning längre än de konfigurerade projektinställningarna hanteras genom att du skapar kvarhållningslån. Tillfälliga kvarhållningslån skapas ofta av automatiska processer och mer permanenta lån genom att användargränssnittet ändras eller när Versionshantering behåller artefakter, men de kan också ändras via REST-API:et. Här följer några exempel på uppgifter som du kan lägga till i yaml-pipelinen för kvarhållning.

Förutsättningar

Som standard kan medlemmar i grupperna Contributors (deltagare), Build Admins (byggadministratörer), Project Admins (projektadministratörer), och Release Admins (versionsadministratörer) hantera kvarhållningsprinciper.

Exempel: Åsidosätt ett kort kvarhållningsfönster på projektnivå

I det här exemplet är projektet konfigurerat för att ta bort pipelinekörningar efter bara 30 dagar.

Exempel 1: Kvarhållningsprinciper för projektinställningar

Om en pipeline i det här projektet är viktig och körningar ska behållas i mer än 30 dagar ser den här aktiviteten till att körningen är giltig i två år genom att lägga till ett nytt kvarhållningslån.

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

Fråga: Kan en pipeline behållas för mindre än de konfigurerade projektvärdena?

Nej, lån fungerar inte tvärtom. Om ett projekt är konfigurerat att behålla i två år tar pipelinekörningar inte bort körningar på två år. Om du vill ta bort dessa körningar tidigare tar du bort dem manuellt eller använder motsvarande REST-API.

Exempel: Endast körningar på grenar med namnet releases/* ska behållas under en längre tid

Detta liknar ovanstående, men endast villkoret behöver ändras:

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

Exempel: Uppdatera kvarhållningsfönstret för en pipeline i flera steg baserat på fasens framgång

Överväg en pipeline i två steg som först kör en version och sedan en version. När det Build lyckas behåller fasen körningen i tre dagar, men projektadministratören vill ha ett lyckat Release steg för att förlänga lånet till ett år.

Build Fasen kan behålla pipelinen som i exemplen ovan, men med ett tillägg: genom att spara det nya lånet Id i en utdatavariabel kan lånet uppdateras senare när versionssteget körs.

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

För att uppdatera ett kvarhållningslån krävs ett annat REST API-anrop.

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

Nästa steg

I de här exemplen har du lärt dig hur du använder anpassade pipelineuppgifter för att hantera körningskvarhållning.

Du har lärt dig att:

  • Åsidosätt ett kort kvarhållningsfönster
  • Åsidosätt kvarhållning för körningar på specifika grenar
  • Uppdatera ett kvarhållningslån när en körning ska behållas ännu längre