为什么我的变量没有被 Azure 管道中的嵌套模板继承?

get*_*ode 5 azure azure-devops azure-pipelines

我有一个 Azure 管道,它首先声明一些变量,包括从模板 YAML 文件中提取的一些变量。以下是仅关注关键部分的管道摘要:

variables:
- template: "variables/my-variables.yml"
Run Code Online (Sandbox Code Playgroud)

第一阶段直接编码到管道 YAML 中并导致发布工件:

artifact: ${{ variables.artifactName }}-provisioning
Run Code Online (Sandbox Code Playgroud)

在Variables/my-variables.ymlartifactName中定义的变量在哪里。

下一阶段使用外部文件中模板中的作业:

- stage: Next
  displayName: "Stage using template yml"
  jobs:
  - template: templates/jobs/external.yml
Run Code Online (Sandbox Code Playgroud)

在该外部文件中,有几个作业本身是从外部文件引用的:

jobs:
- deployment: PublishArmTemplate
  strategy:
    runOnce:
      deploy:
        steps:
        - template: "../job.yml"
          parameters:
            ArtifactName: ${{ variables.artifactName }}
Run Code Online (Sandbox Code Playgroud)

请注意,它variables.artifactName作为参数传递给作业的ArtifactName参数。

该作业 YAML 文件本身有一个步骤,该步骤取决于我上面发布的工件:

parameters:
- name: 'ArtifactName'
  type: string

steps:
  - download: current
    artifact: ${{ parameters.ArtifactName }}-provisioning
Run Code Online (Sandbox Code Playgroud)

但是,当管道运行时,我收到此错误:

##[错误]未找到构建 322650 的 Artifact -provisioning。

换句话说,我定义的变量和管道本身的作用域尚未传递到该作业步骤(parameters.ArtifactName为空)。

我根据 Microsoft 文档的理解是,管道范围内的变量应该可用于所有阶段和作业。使用模板时这不适用吗?或者我还需要做些什么才能使其正常工作?

Wai*_*ole 6

这些变量不可用于管道的嵌套组件。根据文档(我也经历过这种行为):

在模板表达式中,您可以访问包含传入参数值的参数上下文。此外,您还可以访问包含 YAML 文件中指定的所有变量以及许多预定义变量(在每个变量上注明)的变量上下文。该主题中的变量)。

通过“YAML 文件”,它们实际上是指在其中进行引用的当前文件。

在嵌套模板中,您需要

  1. 在正确的范围内包含相同的变量模板,或者
  2. 将声明的管道中的变量值作为参数一直传递到每​​个嵌套模板。

所以,你可以这样做:

- stage: Next
  displayName: "Stage using template yml"
  jobs:
  - template: templates/jobs/external.yml
    parameters:
      artifactName: ${{ variables.artifactName }}
Run Code Online (Sandbox Code Playgroud)

进而

parameters:
- name: artifactName
  type: string

jobs:
- deployment: PublishArmTemplate
  strategy:
    runOnce:
      deploy:
        steps:
        - template: "../job.yml"
          parameters:
            ArtifactName: ${{ parameters.artifactName }}
Run Code Online (Sandbox Code Playgroud)