天蓝色模板不允许工作关键字

azure template not allowing jobs keyword

与我无关,因为这是我真正深入研究 Azure 管道的第 2 周,但是..我看到了一个示例,我可以在其中创建一个包含 jobs: 部分的模板..

https://docs.microsoft.com/en-us/azure/devops/pipelines/process/templates?view=azure-devops#job-stage-and-step-templates-with-parameters

所以我可以在模板中正确分割内容.. 但是当我这样做时它会抱怨

yaml 片段

# File: template_process_folder.yaml

parameters: 
- name: folder_name
  default: YOURFOLDER

jobs:
- job: ProcessFolder
  pool:
    vmImage: ubuntu-latest
  displayName: "Processing Folder"
  steps:
    - bash: |
        blah blah blah

错误

error line X, Col 1... Unexpected value 'jobs'

有人知道我哪里做错了吗?我已经尝试过它的阶段..只有一份工作..等等..唯一对我有用的是仅在模板中的简单步骤

编辑:这可能是我调用模板的方式吗?有没有办法仍然在作业级别循环遍历这些数组值?到目前为止,我还没有在任何文档中看到这一点

我是怎么调用模板的

- stage: Build
  displayName: "Build"
  jobs:
    - job: "Execute_Tests"
      displayName: "Run Tests"
      steps:
        - ${{each p in parameters.mylistoffolders}}:
            - template: template_process_folder.yaml
              parameters:
                folder_name: ${{p}}

我认为这是问题所在..现在我正在从 steps 区域删除模板调用并将其成功地提升到 jobs 区域..但现在我的错误是抱怨作业名称必须是唯一的。我想只是传递文件夹名称,但它包含不允许的 -。现在尝试执行替换调用但未成功

新模板作业条目

jobs:
- job: ProcessFolder_${{ replace(${{parameters.folder_name}}, '-', '_') }}

错误我得到

unclosed function: 'replace'. Located at position 1 within expression replace(${{paramet....

的确,YAML 管道语法不如经典编辑器体验那么简单。 :)

但最好的入门方式是先了解管道的结构,了解哪些是必须具备的组件,哪些是可以跳过的。

YAML schema reference 文档中所述,层次结构如下所示:

请注意,您的 YAML 定义可能不需要包括所有这些级别,因为简单的管道不需要所有这些级别。

您可以快速尝试使用可用的 quickstart guide 构建新管道以查看实际效果,然后继续学习如何为您的特定用例配置 YAML 管道。

上面链接的模式参考文章包含每个管道组件的示例,并附有示例 yaml 片段,应该有助于使用法更清晰。

P.S.: 缩进是使用 YAML 定义时要注意的最重要方面之一!

在我这边测试,我也看到同样的错误Unclosed function: 'replace'. Located at position 1 within expression: replace(${{parameters.folder_name.看来这个表达式在这里不起作用。

作为解决方法,您可以使用关键字 displayname,这样就可以通过使用 displayName: ProcessFolder_${{parameters.folder_name}}.

来解决作业名称必须唯一的错误

顺便说一句,以下yaml供您参考。

template_process_folder.yml

# File: template_process_folder.yml

parameters: 
- name: folder_name
  type: string
  default: YOURFOLDER

jobs:
- job: 
  pool:
    vmImage: ubuntu-latest
  displayName: ProcessFolder_${{parameters.folder_name}}
  steps:
    - bash: |
        echo ${{ parameters.folder_name }}

template_stage.yml

# File: template_stage.yml

parameters:
- name: mylistoffolders  # defaults for any parameters that aren't specified
  type: object
  default:
  - one
  - two

stages:
- stage: Build
  displayName: "Build"
  jobs:
  - ${{each p in parameters.mylistoffolders}}:
    - template: template_process_folder.yml
      parameters:
        folder_name: ${{p}}

azure-pipelines.yml

pool:
  vmImage: ubuntu-latest

stages:
- template: template_stage.yml
  parameters:
    mylistoffolders:
    - test1-hi
    - test2-bye

通过“将模板调用从步骤区域移动到作业区域”,您几乎已经自己解决了这个问题。为避免作业名称唯一的问题,您只需删除分配给作业的名称。如果您需要它来显示名称,请使用带有 displayName 属性的“Edward Han-MSFT”的建议。