【问题标题】:Azure DevOps Trigger PipelinesAzure DevOps 触发管道
【发布时间】:2021-01-01 15:00:35
【问题描述】:

我有下面的代码运行 3 个管道,但我想让它运行第一个管道并构建产品,然后运行另外两个管道,而不是同时运行所有管道,所以先运行第一个管道,然后在第一个成功之后再做另外两个。

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)'
    

【问题讨论】:

    标签: azure-devops devops


    【解决方案1】:

    做第一个,第一个成功后再做另外两个。

    您可以在第一个触发管道任务之后添加一个 PowerShell 任务。

    这是 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脚本运行以下两个Rest API:

    Definitions - Get

    Builds - Get

    脚本检查已触发的管道状态(通过轮询)。如果管道完成并且结果成功,则会触发其他两个管道。否则它将等待管道完成构建。

    流水线示例:

     steps:
      - task: TriggerPipeline@1
      - task: PowerShell@2
      - task: TriggerPipeline@1
      - task: TriggerPipeline@1
    

    结果示例:

    【讨论】:

    • 嗨,我试过了,它只是无限运行pastebin.com/xYYU3AGh 我认为它无法获取构建
    • @MohammedFaisalQureshi 对于无限运行,你能解释一下吗?你是否被困在这个 powershell 任务中?如果可能的话,你可以把截图分享给我。
    • 根据我的测试,如果您使用此代码,它将每 30 秒轮询一次管道状态,直到管道运行完成。然后它将运行以下任务。
    • 它只会在 30 秒内运行下一次尝试,并且即使构建完成也会永远运行prnt.sc/w8dxlf
    • 谢谢。根据您的屏幕截图,api 似乎没有成功运行。因为 echo 命令没有输出值。您可以尝试对 PAT 进行硬编码吗?例如:$token = "PAT"。 (无变量)请确保您输入了正确的构建定义。
    【解决方案2】:
                $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
    

    上面的答案是正确的,但我必须添加这个来验证我的。

    【讨论】:

      猜你喜欢
      • 2020-04-13
      • 1970-01-01
      • 2020-04-24
      • 2021-01-13
      • 1970-01-01
      • 2022-07-01
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      相关资源
      最近更新 更多