У меня есть приведенный ниже код, который запускает 3 конвейера, но я хочу сделать так, чтобы он запускал первый и собирал продукт, а затем запускал два других вместо того, чтобы все они работали одновременно, поэтому сначала выполните первый, а затем другой 2 после того, как первый был успешным.
variables:
- group: ReleaseVariables
name: 5.8$(rev:.r)
jobs:
- job: Ring_Web_Policy_Editor
timeoutInMinutes: 360
pool:
name: DATA-AUTOMATION-WIN10
demands: Cmd
steps:
- task: TriggerPipeline@1
inputs:
serviceConnection: 'azure-connection-dev'
project: '46da8f34-c009-4433-a2f5-1790a09b6055'
Pipeline: 'Build'
buildDefinition: 'Web Policy Editor'
Branch: '$(Build.SourceBranch)'
- task: TriggerPipeline@1
inputs:
serviceConnection: 'azure-connection-dev'
project: '46da8f34-c009-4433-a2f5-1790a09b6055'
Pipeline: 'Build'
buildDefinition: '(Chrome) Web Policy Editor Automation'
Branch: '$(Build.SourceBranch)'
- task: TriggerPipeline@1
inputs:
serviceConnection: 'azure-connection-dev'
project: '46da8f34-c009-4433-a2f5-1790a09b6055'
Pipeline: 'Build'
buildDefinition: '(Firefox) Web Policy Editor Automation'
Branch: '$(Build.SourceBranch)'
сделайте первый, а затем выполните два других после того, как первый был успешным.
Вы можете добавить задачу PowerShell после первой задачи Trigger Pipeline.
Вот пример скрипта Powershell:
$token = "PAT"
$url = "https://dev.azure.com/{OrganizationName}/{ProjectName}/_apis/build/definitions/{DeefinitionId}?includeLatestBuilds=true&api-version=5.1"
$token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($token)"))
$response = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Basic $token"} -Method Get -ContentType application/json
$buildid = $response.latestBuild.id
$success = $false
do{
try{
$Buildurl2 = "https://dev.azure.com/{OrganizationName}/{ProjectName}/_apis/build/builds/$($buildid)?api-version=5.0"
$Buildinfo2 = Invoke-RestMethod -Method Get -ContentType application/json -Uri $Buildurl2 -Headers @{Authorization=("Basic {0}" -f $token)}
$BuildStatus= $Buildinfo2.status
$result = $Buildinfo2.result
echo $result
echo $BuildStatus
if ($BuildStatus -eq "completed") {
write-output "No Running Pipeline, starting Next Pipeline"
$success = $true
} else {
Write-output "Pipeline Build In Progress, Waiting for it to finish!"
Write-output "Next attempt in 30 seconds"
Start-sleep -Seconds 30
}
}
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 -eq $true )
if ($result -ne "succeeded")
{
echo "##vso[task.logissue type=error]Something went very wrong."
}
if (-not($success)){exit}
Объяснение:
Этот сценарий powershell запускает следующие два API Rest:
Сценарий проверяет состояние запущенного конвейера (путем опроса). Если конвейер завершен и результат успешен, он активирует два других конвейера. Или он будет ждать, пока конвейер завершит сборку.
Образец трубопровода:
steps:
- task: TriggerPipeline@1
- task: PowerShell@2
- task: TriggerPipeline@1
- task: TriggerPipeline@1
Образец результата:
@MohammedFaisalQureshi For бесконечно, можете ли вы объяснить мне это? Вы застряли в этой задаче powershell? Если есть возможность, поделитесь со мной скриншотом.
Согласно моему тесту, если вы используете этот код, он будет опрашивать состояние конвейера каждые 30 секунд, пока конвейер не завершится. Затем он будет выполнять следующие задачи.
Он просто запускает следующую попытку через 30 секунд и работает вечно, даже когда сборка завершена prnt.sc/w8dxlf
Спасибо. Судя по вашему снимку экрана, API не работает успешно. Потому что команда echo не вывела значение. Можете ли вы попробовать жестко кодировать PAT? Например: $token = "PAT"
. (без переменной) Убедитесь, что вы ввели правильное определение сборки.
Да, определение сборки равно 528, и я просто получаю тот же цикл без эхо-сигналов выше, когда я вручную вставляю токен.
Дополнительная информация: вам необходимо убедиться, что конвейер может работать параллельно. Например: задача конвейера 1 запускает конвейер 2, конвейер 1 и конвейер 2 могут работать одновременно. Если вы не можете запускать параллельные задания, вы застрянете. В этом случае я мог бы воспроизвести эту проблему. Вы можете попробовать сделать проект общедоступным и проверить, работает ли он.
Все они могут работать отдельно, поэтому я могу запустить 3 сборки Task 1, если я хочу, чтобы автоматизация могла запускать 3 задачи, поэтому 1 chrome и 1 firefox и 1 бесплатно для чего-то еще. Так что я думаю, что это может работать параллельно
Я также не могу сделать проект общедоступным, к сожалению
$Username=${env:USERNAME}
$PAT=${env:PATTOKEN}
$Buildurl2 = "https://dev.azure.com/{ORGANISATION}/{Project}/_apis/build/builds/$($buildid)?api-version=5.0"
$token = -join("$Username", ":", "$PAT")
$headers = @{
Authorization = "Basic "+ [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($token))
'Content-Type' = "application/json"
}
$Buildinfo2 = Invoke-RestMethod -Method Get -ContentType application/json -Uri $Buildurl2 -Headers $headers
$BuildStatus= $Buildinfo2.status
$result = $Buildinfo2.result
echo $result
echo $BuildStatus
Ответ выше правильный, но мне пришлось добавить это, чтобы аутентифицировать мой.
Привет, я попробовал это, и он просто работал бесконечно pastebin.com/xYYU3AGh Я предполагаю, что он не смог подобрать сборку