Поделиться через


Хранение выполнения конвейера

Azure DevOps Services | Azure DevOps Server 2022 г. | Azure DevOps Server 2020 г.

Сохранение выполнения конвейера дольше, чем настроенные параметры проекта , обрабатывается путем создания аренды хранения. Временные аренды хранения часто создаются автоматическими процессами и более постоянными арендами путем управления пользовательским интерфейсом или при Release Management сохранении артефактов, но ими также можно управлять с помощью REST API. Ниже приведены некоторые примеры задач, которые можно добавить в конвейер YAML для хранения.

Предварительные требования

По умолчанию управлять политиками хранения могут участники групп "Участники", "Администраторы сборки", "Администраторы проекта" и "Администраторы выпуска".

Пример. Переопределение короткого периода хранения на уровне проекта

В этом примере проект настроен на удаление запусков конвейера всего через 30 дней.

Пример 1. Политики хранения параметров проекта

Если конвейер в этом проекте важен и запуски должны храниться дольше 30 дней, эта задача гарантирует, что выполнение будет действительным в течение двух лет, добавляя новую аренду хранения.

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

Вопрос. Можно ли сохранить конвейер меньше настроенных значений проекта?

Нет, аренда не работает в обратном направлении. Если для проекта настроено хранение в течение двух лет, запуски конвейера система не будет удалять запуски в течение двух лет. Чтобы удалить эти запуски ранее, удалите их вручную или используйте эквивалентный REST API.

Пример. Запуски только в ветвях с именем releases/* должны храниться в течение длительного времени

Это аналогично описано выше, только условие должно быть изменено:

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

Пример. Обновление периода хранения для многоэтапного конвейера на основе успешного выполнения этапа

Рассмотрим двухэтапный конвейер, который сначала запускает сборку, а затем выпуск. При успешном выполнении Build этап сохраняет выполнение в течение трех дней, но администратор проекта хочет, чтобы успешный Release этап продлил аренду до одного года.

Этап Build может сохранить конвейер, как в приведенных выше примерах, но с одним дополнением: сохраняя новые аренды Id в выходной переменной, аренду можно обновить позже при запуске этапа выпуска.

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

Для обновления аренды хранения требуется другой вызов REST API.

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

Дальнейшие действия

Из этих примеров вы узнали, как использовать пользовательские задачи конвейера для управления хранением запусков.

Вы ознакомились с выполнением следующих задач:

  • Переопределение короткого периода хранения
  • Переопределение срока хранения для запусков в определенных ветвях
  • Обновление аренды хранения, когда выполнение должно храниться еще дольше