从 Azure Pipeline 不同部分的模板调用作业

问题描述 投票:0回答:1

我有一个模板,其中包含我需要在 Azure DevOps 管道中运行的作业,该模板如下:

jobs:
- 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'

- 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'

- 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

我之前为每个作业使用不同的模板,但我被要求将它们全部放入一个模板中,我需要在管道中单独调用每个作业,因为它们在不同的时间运行。像这样:

 - 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'
    
      ****- template: templates/template_file.yml/shell_script_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
    
       **** - template: templates/template_file.yml/docker-script-job****
    

我想做的是在需要作业时单独调用管道中的每个作业,而不是立即调用所有作业,我不确定这是否可以做到,或者我必须找到另一种方法来做到这一点.

我一直在关注Azure文档,尝试了几种调用作业的方法,但我有点迷失:text

templates azure-devops yaml azure-pipelines pipeline
1个回答
0
投票

我想做的是在需要作业时单独调用管道中的每个作业,而不是立即调用所有作业

根据您的 template.yml,您定义了不同的作业。但是,在您的 main.yml 中,您将工作和任务混合在一起。

main.yml中需要使用相同的级别,可以将任务放在新作业中,或者直接放在模板作业中。

确定级别后,您可以根据需要调用作业。示例代码如下:

Main.yaml:

pool:
  vmImage: ubuntu-latest

stages:
- stage: build_dev
  jobs:
  - job: test_job1
    steps: 
    - bash: echo test job1

  - template: template3.yml
    parameters:
      jobName: 'Job1'

  - job: test_job2
    steps:
    - bash: echo test job2
  
  - template: template3.yml
    parameters:
      jobName: 'Job2'

  - template: template3.yml
    parameters:
      jobName: 'Job3'

Template.yml内容:

# template.yml
parameters:
  - name: 'jobName'  # this is a parameter
    type: string

jobs:
- job: ${{ format('{0}_{1}', parameters.jobName, 1) }}
  condition: eq('${{ parameters.jobName }}', 'Job1')
  steps:
  - script: echo Running Job1

- job: ${{ format('{0}_{1}', parameters.jobName, 2) }}
  condition: eq('${{ parameters.jobName }}', 'Job2')
  steps:
  - script: echo Running Job2

- job: ${{ format('{0}_{1}', parameters.jobName, 3) }}
  condition: eq('${{ parameters.jobName }}', 'Job3')
  steps:
  - script: echo Running Job3

您需要在模板中使用

${{ format('{0}_{1}', parameters.jobName, 1 }}
作为作业名称,不同的编号
1-3
以确保作业名称不会重复。

执行结果:

© www.soinside.com 2019 - 2024. All rights reserved.