Saya memiliki Azure DevOps Multi Stage Pipeline dengan banyak agen. Umumnya tahapan saya terdiri dari:

  • Bangun dan Publikasikan Artefak
  • Terapkan ke lingkungan 1
  • Lingkungan Tes UI 1
  • Terapkan ke lingkungan 2
  • Lingkungan Uji UI 2

Dan seterusnya untuk beberapa lingkungan. Bagaimana cara mengizinkan pipeline simultan berjalan (mis. Membangun dan Menerbitkan Artefak untuk Build #2 sekaligus secara bersamaan Lingkungan Pengujian UI 2 untuk Build #1), sambil memastikan bahwa tidak ada dua agen yang akan melakukan Pengujian UI untuk lingkungan tertentu secara bersamaan?

trigger: batch tampaknya mendekati apa yang saya inginkan, tetapi saya yakin itu tidak mengizinkan konkurensi di tingkat saluran, bukan di tingkat tahap.

0
Lee Richardson 21 Desember 2020, 21:42

3 jawaban

Jawaban Terbaik

Anda
Lingkungan Pengujian UI 1 tahap (khususnya tugas penerapan yang Menjalankan pengujian) harus ditargetkan
lingkungan terbaik.

Lingkungan pengujian UI 2 tahap (khususnya tugas penerapan yang Menjalankan pengujian) harus ditargetkan
lingkungan env2utest.

Kemudian atur kunci eksklusif ( https://docs.microsoft.com/en-us/azure/devops/release-notes/2020/pipelines/sprint-172-update#exclusive-deployment-lock-policy) kebijakan pada kedua lingkungan tersebut.
Itu harus memenuhi kebutuhan Anda: "memastikan bahwa tidak ada dua agen yang akan melakukan Tes UI untuk lingkungan tertentu secara bersamaan"

https://docs.microsoft.com/en-us/azure/devops/pipelines/process/approvals?view=azure-devops&tabs=check-pass#exclusive-lock

1
fenrir 24 Desember 2020, 19:01

Tampaknya jika seseorang menjalankan pipa rilis dua kali, Anda membutuhkannya untuk menjalankannya satu per satu, bukan secara paralel, bukan?

Sebagai solusinya:

Setiap rilis akan dimulai dari tahap 1. Dengan demikian kita dapat menambahkan tugas PowerShell sebagai tugas pertama untuk tahap 1 untuk memeriksa apakah ada penerapan yang sedang berlangsung sebelumnya.

Dalam tugas PowerShell ini, kita dapat memanggil ini API Istirahat untuk memeriksa status tahap rilis.

Skrip cangkang daya:

# Base64-encodes the Personal Access Token (PAT) appropriately
    $token = "$(pat)"
    $base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($connectionToken)"))
    $success = $false
    $count = 0
do{
    try{
    $stageurl2 = "https://vsrm.dev.azure.com/{org name}/{project name}/_apis/release/deployments?definitionId={release definition ID}&deploymentStatus=inProgress&api-version=6.0"
    $stageinfo2 = Invoke-RestMethod -Method Get -ContentType application/json -Uri $stageurl2 -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
   
    $inprogressdeployments = $stageinfo2.value | where {($_.deploymentStatus -eq "inProgress")  -and ($_.release.name -ne $ENV:RELEASE_RELEASENAME)  -and ($_.releaseEnvironment.name -ne 'stop services')} | Sort-Object -Property completedOn -Descending
    #write-output $inprogressdeployments
    $stageurl3 = "https://vsrm.dev.azure.com/{org name}/{project name}/_apis/release/deployments?definitionId={release definition ID}&operationStatus=QueuedForAgent&api-version=6.0"
    $stageinfo3 = Invoke-RestMethod -Method Get -ContentType application/json -Uri $stageurl3 -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
    $queueddeployments = $stageinfo3.value
    #write-output $queueddeployments
        if($inprogressdeployments) {            
            Write-output "Deployment In Progress, Waiting for it to finish!"  
            Write-output "Next attempt in 30 seconds"
            Start-sleep -Seconds 30          
      } else {            
            Write-Host "No Current Deployment in Progress"
            if($queueddeployments) {
            write-output "Current Queued deployments"
            Write-output "if 2 - Next attempt in 30 seconds"
            Start-sleep -Seconds 30 
            }
            else{
            write-output "No Queued deployments, starting release"
            $success = $true      
            }      
      }
    }
    catch{
        Write-output "catch - Next attempt in 30 seconds"
        write-output "1"
        Start-sleep -Seconds 30
      # Put the start-sleep in the catch statemtnt so we
      # don't sleep if the condition is true and waste time
    }
    
    $count++
    
}until($count -eq 2000 -or $success)
if(-not($success)){exit}

Hasil:

Stage1 akan terus melakukan pengecekan sampai semua versi sebelumnya selesai.

enter image description here

Kami juga dapat mencobanya dengan tuntutan, kita bisa menentukan tuntutan yang sama. Gunakan tuntutan untuk memastikan bahwa kemampuan yang dibutuhkan pipeline Anda ada pada agen yang menjalankannya. Itu tidak akan berjalan kecuali satu atau lebih tuntutan dipenuhi oleh agen.

1
Vito Liu 23 Desember 2020, 06:31

Anda memasukkan tugas ke jobs yang berbeda, dan menentukan properti dependsOn untuk tugas yang perlu menunggu tugas tertentu selesai. Jika Anda mengabaikan dependsOn, itu akan berjalan secara sinkron.

Setelah membaca prompt Anda lebih dekat, saya pikir Anda hanya perlu tahap build yang membangun dan menerbitkan artefak Anda.

Kemudian tahap deploy_test untuk setiap lingkungan. Tahapan berjalan berurutan secara default (tidak seperti pekerjaan)

-1
michiel Thai 22 Desember 2020, 07:20