我们有两条管道
管道1:
- 构建并部署我们代码的一个分支到server1
- 通过执行dotnet run命令启动.exe
管道2:
- 从服务器2运行测试脚本,并将请求发送到管道1中服务器1上启动的exe
- 停止服务器1上的.exe
目标是将这两个管道合并为1,或者单击一次,两个管道都将在管道1开始的位置运行,然后管道2开始。实现这一目标的最佳方式是什么?请注意,由于.exe正在运行,因此管道1并不完整。
一个选项是保持原样,并在管道1中添加步骤,通过REST API 触发管道2
https://dev.azure.com/{organization}/{project}/_apis/build/builds?api-version=5.0
有了这个机身
{
"definition": {
"id": 217
},
"sourceBranch": "refs/heads/master",
"sourceVersion": "",
"reason": 1,
"demands": [],
"parameters": "{"system.debug":"true"}"
}
(这里有一个如何从powershell任务中做到这一点的例子(
或者使用此扩展触发Azure DevOps管道
您也可以尝试将这两个管道合并为一个使用阶段。要并行运行两个阶段,您需要使它们独立,如下所示:
stages:
- stage: FunctionalTest
jobs:
- job:
...
- stage: AcceptanceTest
dependsOn: [] # this removes the implicit dependency on previous stage and causes this to run in parallel
jobs:
- job:
...
然后,如果触发pipeline,两个阶段都将运行。
第三种选择是使用管道触发器,但对于这种方法,我建议您在第一个管道中创建两个阶段并使用阶段过滤器。
您可以尝试以下解决方法,将2条管道合并为1条。
在管道1中,您可以打开另一个命令终端来启动.exe。例如,在powershell脚本中使用启动进程:
当powershell任务完成执行以下命令时,dotnet run
命令将在新的powershell窗口中执行,管道将继续执行以下任务。
Start-Process powershell -ArgumentList "dotnet run ..."
然后,您可以在目标计算机上添加PowerShell或在管道1中添加SSH部署任务,以在服务器2 上运行测试脚本
参见下面的简单示例:
steps:
- powershell: |
Start-Process powershell -ArgumentList "dotnet run ..."
- task: PowerShellOnTargetMachines@3
inputs:
Machines: 'server2'
UserName: 'userName'
UserPassword: '123456'
InlineScript: |
# Write your powershell commands here.
- powershell: |
Stop-Process -Name processName
如果您已经分别配置和运行了两个管道,并且这是所需的状态,那么就有一个管道完成触发器来触发下一个。可以通过使用管道触发器来做到这一点
resources:
pipelines:
- pipeline: Pipeline1 # Name of the pipeline resource
source: Pipeline1Name # Name of the pipeline referenced by the pipeline resource
trigger:
branches:
- releases/*
- master
Pipeline1是您的YAML将用来引用管道资源的名称,类似于另一个存储库中的模板。
源将是Azure Devops中定义的管道名称。