Azure devops 在Azure管道中配置管道依赖项

Azure devops 在Azure管道中配置管道依赖项,azure-devops,azure-pipelines,azure-pipelines-build-task,azure-pipelines-yaml,Azure Devops,Azure Pipelines,Azure Pipelines Build Task,Azure Pipelines Yaml,我有两个Azure管道,deploy和test。顾名思义,一个用于部署产品,另一个用于测试。当开发人员希望在现有部署上运行自己的测试时,他们会触发test。当需要展开时,它们会触发deploy。如果在触发deploy管道时执行test管道,我希望deploy等待test完成执行 是否有办法在pipeline.yaml本身中配置此依赖关系,或者有一种解决方法来实现上述要求您可能需要将管道合并为一个管道,并且根据管道中的步骤,您可以将管道转换为作业,甚至转换为阶段。在这两种情况下,您都可以通过dep

我有两个Azure管道,
deploy
test
。顾名思义,一个用于部署产品,另一个用于测试。当开发人员希望在现有部署上运行自己的测试时,他们会触发
test
。当需要展开时,它们会触发
deploy
。如果在触发
deploy
管道时执行
test
管道,我希望
deploy
等待
test
完成执行


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

您可能需要将管道合并为一个管道,并且根据管道中的步骤,您可以将管道转换为作业,甚至转换为阶段。在这两种情况下,您都可以通过
dependsOn
(例如)指定依赖项

所以你会有这样的想法:

jobs:
- job: test
  steps:
  - step1...
  - step2...

- job: deploy
  dependsOn: test
  steps:
  - step1...
  - step2...

此外,如果您采用这种方式,考虑使用部署,它们具有一些相关的内置功能。

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

以下两种方法可以满足您的要求:

1.您可以在Yaml管道中添加。添加您可以在环境中添加调用RESTAPI检查。Rest API:

在Yaml管道中,您可以调用此环境

例如:

stages:
- stage: deploy
  jobs:
  - deployment: DeployWeb
    displayName: deploy Web App
    pool:
      vmImage: 'Ubuntu-latest'
    environment: 'EnvironmentName'
    strategy:
      runOnce:
        deploy:
          steps:
          ...
运行管道时,环境将检查测试管道的最新生成状态。如果构建完成,它将运行部署管道

结果:

2.您可以直接在部署任务中添加Powershell任务来检查测试管道的状态

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

您还可以参考

谢谢您的回答,关于您的第一个建议,我希望将它们作为两个单独的管道来执行,因为可能存在只需要执行测试管道的情况。在这种情况下,将它们放在一起将导致再次进行部署。我还将研究部署作业。我明白了。还可以指定特定的管道部件,这可能对您的案例有一些用处。Hi@JAbeywrdana关于此票据有任何更新吗?如果这个建议能给你一些帮助,请随时告诉我。只是提醒一下。嗨@Kevin Lu MSFT,很抱歉反应太晚,我正在尝试您的解决方案,实际上我必须用bash而不是powershell编写查询过程,这就是为什么可能会有一点延迟的原因。但是我试着执行一些curl命令来查看状态,它应该可以工作。我将尽快对此进行确认