首页 > 解决方案 > 在 Azure Pipelines 中配置管道依赖项

问题描述

我有 2 个 Azure 管道deploytest. 正如他们的名字所暗示的,一个用于部署产品,另一个用于测试。当开发人员想要在现有部署上运行他们自己的测试时,他们会触发test. 当需要部署时,它们会触发deploy. 如果在触发管道test时管道正在执行中,我希望等待直到完成执行。deploydeploytest

有没有办法在 pipeline.yaml 本身中配置这种依赖关系,或者有一种解决方法来实现上述要求

标签: azure-devopsazure-pipelinesazure-pipelines-build-taskazure-pipelines-yaml

解决方案


有没有办法在 pipeline.yaml 本身中配置这种依赖关系,或者有一种解决方法来实现上述要求

这里有两种方法可以满足您的要求:

1.您可以在 Yaml 管道中添加环境。添加您可以在环境中添加Invoke Rest API检查。Rest API:最新 - 获取

在此处输入图像描述

在 Yaml Pipeline 中,您可以调用此环境。

例子:

stages:
- stage: deploy
  jobs:
  - deployment: DeployWeb
    displayName: deploy Web App
    pool:
      vmImage: 'Ubuntu-latest'
    environment: 'EnvironmentName'
    strategy:
      runOnce:
        deploy:
          steps:
          ...

当您运行管道时,环境将检查测试管道的最新构建状态。如果构建完成,它将运行部署管道。

结果:

在此处输入图像描述

2.您可以直接在Deploy任务中添加一个Powershell任务来检查Test Pipeline的状态。

$token = "PAT"

$url="https://dev.azure.com/{OrganizationName}/{ProjectName}/_apis/build/definitions/{DefinitionID}?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
echo $buildid


$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 $base64AuthInfo)}

    $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}

你也可以参考我的另一张票。


推荐阅读