Bagikan melalui


Retensi Eksekusi Alur Kerja

Layanan Azure DevOps | Azure DevOps Server | Azure DevOps Server 2022

Mempertahankan eksekusi alur lebih lama dari pengaturan proyek yang dikonfigurasi ditangani oleh pembuatan sewa retensi. Lease retensi sementara sering kali dibuat oleh proses otomatisasi, sementara lease yang lebih permanen dibentuk melalui manipulasi antarmuka pengguna atau ketika Manajemen Rilis mempertahankan artefak. Meski demikian, mereka juga dapat dimanipulasi melalui API REST. Berikut adalah beberapa contoh tugas yang dapat Anda tambahkan ke dalam pipeline yaml Anda untuk keperluan retensi.

Prasyarat

Secara default, anggota grup Kontributor, Admin Build, Admin Proyek, dan Admin Rilis dapat mengelola kebijakan retensi.

Contoh: Menggantikan periode retensi tingkat proyek yang pendek

Dalam contoh ini, proyek dikonfigurasi untuk menghapus eksekusi pipeline setelah hanya 30 hari.

Contoh 1: kebijakan pengaturan retensi proyek

Jika pipeline dalam proyek ini penting dan jalannya harus dipertahankan selama lebih dari 30 hari, tugas ini memastikan jalannya sah selama dua tahun dengan menambahkan sewa retensi baru.

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

Pertanyaan: dapatkah pipeline dipertahankan dengan nilai yang lebih rendah dari yang dikonfigurasi pada proyek?

Tidak, sewa tidak berlaku secara sebaliknya. Jika proyek dikonfigurasi untuk dipertahankan selama dua tahun, alur menjalankan sistem tidak akan menghapus eksekusi selama dua tahun. Untuk menghapus eksekusi ini sebelumnya, hapus secara manual atau gunakan REST API yang setara.

Contoh: Hanya cabang bernama releases/* yang harus dijalankan untuk jangka waktu yang lama.

Ini mirip dengan di atas, hanya kondisi yang perlu diubah:

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

Contoh: Memperbarui jendela retensi untuk alur multi-tahap berdasarkan keberhasilan tahap

Pertimbangkan pipeline dua tahap yang pertama menjalankan proses build dan kemudian proses release. Ketika berhasil, tahap Build mempertahankan jalannya selama tiga hari, tetapi administrator proyek menginginkan tahap Release berhasil untuk memperpanjang sewa hingga satu tahun.

Tahap Build dapat mempertahankan pipeline seperti pada contoh di atas, tetapi dengan satu tambahan: dengan menyimpan referensi sewa Id baru dalam variabel output, sewa tersebut dapat diperbarui nanti ketika tahap rilis dijalankan.

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

Untuk memperbarui sewa retensi memerlukan panggilan REST API yang berbeda.

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

Langkah selanjutnya

Dengan contoh ini, Anda mempelajari cara menggunakan tugas alur kustom untuk mengelola retensi eksekusi.

Anda mempelajari cara untuk:

  • Mengabaikan batas waktu penyimpanan singkat
  • Mengambil alih retensi data untuk penjalankan pada cabang-cabang tertentu
  • Memperbarui penyewaan retensi saat sebuah proses harus dipertahankan lebih lama.