You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Azure Pipeline中单独调用模板内的单个Job

方案一:参数化模板,按需启用指定Job

将所有Job合并到一个模板中,通过传入参数控制需要运行的Job。

模板文件(templates/jobs-template.yml)

parameters:
  # 可选参数:传入需要运行的Job名称列表,空列表则运行全部Job
  targetJobs: []

jobs:
- job: shell-script-job
  # 条件控制:仅当targetJobs为空或包含当前Job名称时运行
  condition: or(eq(length(${{ parameters.targetJobs }}), 0), contains('${{ join(',', parameters.targetJobs) }}', 'shell-script-job'))
  steps:
  - script: |
      set -x
      env
      pwd
      echo "CONTAINER_APP=$(Build.Repository.Name):$(Build.BuildId)" > artifact.txt
      source ./artifact.txt
      docker save $CONTAINER_APP > container.tar
      ls -la
    displayName: 'Shell Script: APP'
  # 将发布步骤移至当前Job,确保镜像生成后立即发布
  - task: PublishPipelineArtifact@1
    displayName: 'Publish Pipeline Artifact - container id'
    inputs:
      targetPath: artifact.txt
      artifact: artifact 
  - task: PublishPipelineArtifact@1
    displayName: 'Publish Pipeline Artifact - container data'
    inputs:
      targetPath: container.tar
      artifact: container

- job: docker-script-job
  condition: or(eq(length(${{ parameters.targetJobs }}), 0), contains('${{ join(',', parameters.targetJobs) }}', 'docker-script-job'))
  steps:
  - script: | 
      echo "CONTAINER_KNEX=$(Build.Repository.Name):$(Build.BuildId)" > artifact-knex.txt
      source ./artifact-knex.txt
      docker save $CONTAINER_KNEX > container-knex.tar
      ls -la 
    displayName: 'Shell Script: knex'

- job: docker-tasks
  condition: or(eq(length(${{ parameters.targetJobs }}), 0), contains('${{ join(',', parameters.targetJobs) }}', 'docker-tasks'))
  # 依赖docker-script-job,确保镜像打包完成后再发布
  dependsOn: docker-script-job
  steps:
  - task: PublishPipelineArtifact@1
    displayName: 'Publish Pipeline Artifact - container id: knex'
    inputs:
      targetPath: artifact-knex.txt
      artifact: artifact-knex
  - task: PublishPipelineArtifact@1
    displayName: 'Publish Pipeline Artifact - container data: knex'
    inputs:
      targetPath: container-knex.tar
      artifact: container-knex

主Pipeline调用示例

stages:
- stage: build_dev
  dependsOn: quality_control
  displayName: Build DEV
  condition: or(and(eq(variables.isDev, true), ne(variables['Build.Reason'], 'PullRequest')), eq(variables['Build.Reason'], 'Manual'))
  jobs:
  - job: Job_build_dev
    displayName: Application Build DEV
    steps:
    - checkout: backend-dev
      submodules: true
    - script: git rev-parse HEAD
    - script: ls -la
    - powershell: |
        Write-Host "##vso[build.addbuildtag]dev"
      displayName: 'Build Tag'

  # 调用模板,仅运行shell-script-job,依赖前置的Job_build_dev
  - template: templates/jobs-template.yml
    parameters:
      targetJobs: ['shell-script-job']
    dependsOn: Job_build_dev

  # 调用模板,运行docker-script-job和docker-tasks,依赖前置的Job_build_dev
  - template: templates/jobs-template.yml
    parameters:
      targetJobs: ['docker-script-job', 'docker-tasks']
    dependsOn: Job_build_dev

方案二:单文件多Job模板,通过锚点单独调用

在同一个模板文件中定义多个独立的Job模板,使用name标记锚点,主Pipeline可直接引用指定的Job。

模板文件(templates/jobs-collection.yml)

# shell-script-job模板
parameters: []
name: shell-script-job
job: shell-script-job
steps:
- script: |
    set -x
    env
    pwd
    echo "CONTAINER_APP=$(Build.Repository.Name):$(Build.BuildId)" > artifact.txt
    source ./artifact.txt
    docker save $CONTAINER_APP > container.tar
    ls -la
  displayName: 'Shell Script: APP'
- task: PublishPipelineArtifact@1
  displayName: 'Publish Pipeline Artifact - container id'
  inputs:
    targetPath: artifact.txt
    artifact: artifact 
- task: PublishPipelineArtifact@1
  displayName: 'Publish Pipeline Artifact - container data'
  inputs:
    targetPath: container.tar
    artifact: container

---

# docker-script-job模板
parameters: []
name: docker-script-job
job: docker-script-job
steps:
- script: | 
    echo "CONTAINER_KNEX=$(Build.Repository.Name):$(Build.BuildId)" > artifact-knex.txt
    source ./artifact-knex.txt
    docker save $CONTAINER_KNEX > container-knex.tar
    ls -la 
  displayName: 'Shell Script: knex'

---

# docker-tasks模板
parameters: []
name: docker-tasks
job: docker-tasks
steps:
- task: PublishPipelineArtifact@1
  displayName: 'Publish Pipeline Artifact - container id: knex'
  inputs:
    targetPath: artifact-knex.txt
    artifact: artifact-knex
- task: PublishPipelineArtifact@1
  displayName: 'Publish Pipeline Artifact - container data: knex'
  inputs:
    targetPath: container-knex.tar
    artifact: container-knex

主Pipeline调用示例

stages:
- stage: build_dev
  dependsOn: quality_control
  displayName: Build DEV
  condition: or(and(eq(variables.isDev, true), ne(variables['Build.Reason'], 'PullRequest')), eq(variables['Build.Reason'], 'Manual'))
  jobs:
  - job: Job_build_dev
    displayName: Application Build DEV
    steps:
    - checkout: backend-dev
      submodules: true
    - script: git rev-parse HEAD
    - script: ls -la
    - powershell: |
        Write-Host "##vso[build.addbuildtag]dev"
      displayName: 'Build Tag'

  # 单独调用shell-script-job模板,依赖前置Job_build_dev
  - template: templates/jobs-collection.yml#shell-script-job
    dependsOn: Job_build_dev

  # 单独调用docker-script-job模板,依赖前置Job_build_dev
  - template: templates/jobs-collection.yml#docker-script-job
    dependsOn: Job_build_dev

  # 单独调用docker-tasks模板,依赖docker-script-job
  - template: templates/jobs-collection.yml#docker-tasks
    dependsOn: docker-script-job

关键注意事项

  1. Job依赖:如果后续Job需要使用前置Job的输出文件,必须通过dependsOn明确指定依赖,保证执行顺序正确。
  2. Artifact传递:跨Job共享文件需使用PublishPipelineArtifact和DownloadPipelineArtifact任务,同一Agent池可使用workspace共享,但不推荐跨Job依赖Agent资源。

内容的提问来源于stack exchange,提问作者AdanVRuiz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 15:52:04