Azure DevOps - 触发另一个管道
Azure DevOps - Trigger another pipeline
我的项目中有两条管道,一条用于测试,一条用于构建。这样做的原因是测试需要 运行 在自托管代理上才能 运行 集成测试。
如果测试失败,我不想 运行 构建管道。这是我的配置:
测试(管道名称)
name: Test
trigger:
- azure-pipelines
pool:
vmImage: "windows-latest"
steps:
- script: echo Test pipeline
构建(管道名称)
name: Build
trigger: none
resources:
pipelines:
- pipeline: test
source: Test
trigger: true
pool:
vmImage: "windows-latest"
steps:
- script: echo Build pipeline
测试管道按预期 运行 宁,但构建管道永远不会被触发,即使我 运行 它在云中如上例所示。有人知道问题出在哪里吗?
可以调用其他答案中所示的另一个管道,但要启动不同的代理 OS,我建议使用多级管道或策略矩阵。
每个阶段都可以 运行 有自己的 VM 或代理池。
这是一个例子:
trigger:
- main
stages:
- stage: Build
pool:
vmImage: ubuntu-latest
jobs:
- job: BuildJob
steps:
- script: echo Building
- stage: TestWithLinux
dependsOn: Build
pool:
vmImage: ubuntu-latest
jobs:
- job: Testing
steps:
- script: echo Test with Linux OS
- stage: TestWithWindows
dependsOn: Build
pool:
vmImage: windows-latest
jobs:
- job: Testing
steps:
- script: echo Test with Windows OS
- stage: Final
dependsOn: [TestWithLinux,TestWithWindows]
pool:
vmImage: ubuntu-latest
jobs:
- job: FinalJob
steps:
- script: echo Final Job
您可以将 vmImage: xxx 替换为您自己的托管代理,例如:
pool: AgentNameX
最终结果如下所示:
或者可以使用矩阵策略。假设我们有一个代码在 3 个不同的代理上应该是 运行,我们可以执行以下操作:
jobs:
- job:
strategy:
matrix:
Linux:
imageName: 'ubuntu-latest'
Mac:
imageName: 'macOS-latest'
Windows:
imageName: 'windows-latest'
pool:
vmImage: $(imageName)
steps:
- powershell: |
"OS = $($env:AGENT_OS)" | Out-Host
displayName: 'Test with Agent'
它可以作为 stand-alone 或 multi-stages 工作,如图所示:
这里是 list 受支持的托管代理。
Disclaimer: I wrote 2 articles about this in my personal blog.
确保使用正确的管道名称。我还建议在资源管道中添加 project
。
例如我有一个名为 first 的管道。
first.yml
trigger:
- none
pr: none
pool:
vmImage: ubuntu-latest
steps:
- script: echo Running the first pipeline, should trigger the second.
displayName: 'First pipeline'
second.yml
trigger:
- none
pool:
vmImage: ubuntu-latest
resources:
pipelines:
- pipeline: first
source: first
project: test-project
trigger: true # Run second pipeline when the run of the first pipeline ends
steps:
- script: echo this pipeline was triggered from the first pipeline
displayName: 'Second pipeline'
我的项目中有两条管道,一条用于测试,一条用于构建。这样做的原因是测试需要 运行 在自托管代理上才能 运行 集成测试。
如果测试失败,我不想 运行 构建管道。这是我的配置:
测试(管道名称)
name: Test
trigger:
- azure-pipelines
pool:
vmImage: "windows-latest"
steps:
- script: echo Test pipeline
构建(管道名称)
name: Build
trigger: none
resources:
pipelines:
- pipeline: test
source: Test
trigger: true
pool:
vmImage: "windows-latest"
steps:
- script: echo Build pipeline
测试管道按预期 运行 宁,但构建管道永远不会被触发,即使我 运行 它在云中如上例所示。有人知道问题出在哪里吗?
可以调用其他答案中所示的另一个管道,但要启动不同的代理 OS,我建议使用多级管道或策略矩阵。
每个阶段都可以 运行 有自己的 VM 或代理池。
这是一个例子:
trigger:
- main
stages:
- stage: Build
pool:
vmImage: ubuntu-latest
jobs:
- job: BuildJob
steps:
- script: echo Building
- stage: TestWithLinux
dependsOn: Build
pool:
vmImage: ubuntu-latest
jobs:
- job: Testing
steps:
- script: echo Test with Linux OS
- stage: TestWithWindows
dependsOn: Build
pool:
vmImage: windows-latest
jobs:
- job: Testing
steps:
- script: echo Test with Windows OS
- stage: Final
dependsOn: [TestWithLinux,TestWithWindows]
pool:
vmImage: ubuntu-latest
jobs:
- job: FinalJob
steps:
- script: echo Final Job
您可以将 vmImage: xxx 替换为您自己的托管代理,例如:
pool: AgentNameX
最终结果如下所示:
或者可以使用矩阵策略。假设我们有一个代码在 3 个不同的代理上应该是 运行,我们可以执行以下操作:
jobs:
- job:
strategy:
matrix:
Linux:
imageName: 'ubuntu-latest'
Mac:
imageName: 'macOS-latest'
Windows:
imageName: 'windows-latest'
pool:
vmImage: $(imageName)
steps:
- powershell: |
"OS = $($env:AGENT_OS)" | Out-Host
displayName: 'Test with Agent'
它可以作为 stand-alone 或 multi-stages 工作,如图所示:
这里是 list 受支持的托管代理。
Disclaimer: I wrote 2 articles about this in my personal blog.
确保使用正确的管道名称。我还建议在资源管道中添加 project
。
例如我有一个名为 first 的管道。
first.yml
trigger:
- none
pr: none
pool:
vmImage: ubuntu-latest
steps:
- script: echo Running the first pipeline, should trigger the second.
displayName: 'First pipeline'
second.yml
trigger:
- none
pool:
vmImage: ubuntu-latest
resources:
pipelines:
- pipeline: first
source: first
project: test-project
trigger: true # Run second pipeline when the run of the first pipeline ends
steps:
- script: echo this pipeline was triggered from the first pipeline
displayName: 'Second pipeline'