Azure DevOps 管道能否同时具有模板化作业和非模板化作业?

时间:2021-07-22 05:04:19

标签: azure-devops yaml azure-pipelines

我有一个管道 yaml 文件,它运行一系列阶段,每个阶段运行一个已模板化的部署作业。代码本身非常简单:

模板.yaml

jobs:
- deployment: foo
...

pipeline.yaml

stages:
- stage: Uno
  displayName: Numero_uno
  jobs:
  - job: Foo
    steps:
    - template:  template.yaml
      parameters:
     stuff: things
- stage: Dos
  displayName: Numero_dos
  jobs:
  - job: Foo
    steps:
    - template:  template.yaml
      parameters:
     stuff: things

我发现我的一个阶段需要在其中运行一些额外的脚本,所以我想向这个特定阶段添加一些额外的作业:

- stage: Cuarenta_y_dos
  displayName: Numero_cuarenta_y_dos
  jobs:
  - job: prep
    steps:
    - task: ...
  - job: Foo
    steps:
      - template: template.yaml
        parameters:
          stuff: things
  - job: unprep
    steps:
    - task: ...

这样做会破坏整个管道,因为我的模板是围绕可重复使用的作业构建的,它会立即引发关于“意外值‘作业’”的错误。

我明白为什么会这样,但我不知道如何解决。我想做的事情有可能吗?

2 个答案:

答案 0 :(得分:1)

是的,Azure Devops 管道可以具有模板化和非模板化作业。更重要的是,引用模板的作业也可以有常规任务。请参见下面的示例:

stages:
- stage: CIBuild
  displayName: 'Build'
  jobs:
  - job: Build
    pool:
      vmImage: ubuntu-latest
    steps:
      - task: PowerShell@2
        ...
           
      - template: PipelineTemplates/ci-template.yml@templates
        parameters: ...
        
  - job: Test
    displayName: 'Test job'
    pool:
      vmImage: ubuntu-latest
    steps:
      - task: PowerShell@2
        ...

我不确定您为什么会遇到这个问题,但可能您的 .yaml 文件无效。通过单击右上角的点并选择“验证”来检查它是否有效:

Validate yaml

让我们知道结果。

答案 1 :(得分:0)

想通了。我的问题有两个方面:

  1. 我在工作级别使用模板,而不是步骤级别
  2. 我在模板化步骤的“jobs:”条目下指定了“-job:”(只有一个作业)。

原始代码,不起作用:

stages:
- stage: Uno
  displayName: Numero_uno
  jobs:
  - job: Foo
    steps:
    - template:  template.yaml
      parameters:
        stuff: things

- stage: Cuarenta_y_dos
  displayName: Numero_cuarenta_y_dos
  jobs:
  - job: prep
    steps:
    - task: ...
  - job: Foo
    steps:
      - template: template.yaml
        parameters:
          stuff: things
  - job: unprep
    steps:
    - task: ...

固定代码:

stages:
- stage: Uno
  displayName: Numero_uno
  jobs:
  - template:  template.yaml
      parameters:
      stuff: things

- stage: Cuarenta_y_dos
  displayName: Numero_cuarenta_y_dos
  jobs:
  - job: prep
    steps:
    - task: ...
  - template: template.yaml
    parameters:
      stuff: things
  - job: unprep
    steps:
    - task: ...

这是次要的,但很重要!