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'