如何在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
关键注意事项
- Job依赖:如果后续Job需要使用前置Job的输出文件,必须通过
dependsOn明确指定依赖,保证执行顺序正确。 - Artifact传递:跨Job共享文件需使用
PublishPipelineArtifact和DownloadPipelineArtifact任务,同一Agent池可使用workspace共享,但不推荐跨Job依赖Agent资源。
内容的提问来源于stack exchange,提问作者AdanVRuiz
相关产品推荐
相关产品推荐

