如何在Azure devops管道中将Scheduler和Trigger添加到嵌套模板中?

时间:2020-08-28 15:53:54

标签: templates azure-devops yaml

我是Azure开发人员的新手,希望您的建议。我有一个主要的azure-pipeline.yml,它引用了一个嵌套模板(azure-pipeline-e2e.yml)文件。基本上,当主要的azure-pipeline.yml运行时,它会触发嵌套模板,如果分支不是主分支,则将跳过嵌套模板作业。

查询:

我希望嵌套模板作为过夜计划的一部分运行。我还希望此嵌套管道没有触发器(trigger:无)...。请注意,当前设置可以正常工作。仅当我在嵌套模板中添加调度程序作业和触发器作业时,主要的azure-pipeline.yml抱怨调度程序和触发器命令未知吗?请告知如何在嵌套管道中同时使用触发器和调度程序,以使主管道不会抱怨

当前设置: 主要的azure-pipeline.yml文件

trigger:
- master

pool:
  name: EDEA

stages:
- stage: dev
  jobs:
  - job: build_test_deploy_UI_to_DEV
    steps:
    - task: NodeTool@0
      displayName: 'Install Node.js'
      inputs:
        versionSpec: '12.x'
        etc.....

- stage: e2e
  condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master')) 
  displayName: 'Run e2e Tests'
  jobs:
  - template: 'azure-pipelines-e2e.yml'

- stage: dtc
  jobs:
    - job: build_and_deploy_UI_to_DTC
      steps:
        - task: NodeTool@0
          displayName: 'Install Node.js'
          inputs:
            versionSpec: '12.x'
            etc.....

嵌套模板(azure-pipeline-e2e.yml)

jobs:
- job: run_e2e_tests
  condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master')) 
  steps: 
  - task: SecretsManagerGetSecret@1
    displayName: Get AWS  secrets
    inputs:
      awsCredentials: 'project.dev.Aws'
      regionName: 'eu-central-1'
      secretIdOrName: 'secretname'
      variableName: 'tempvariable'

基本上,在上面的嵌套模板中,当我添加调度程序和触发器作业时,嵌套模板不会出现错误。但是主要的天蓝色管道抱怨调度程序和触发器命令是未知的

建议:azure-pipeline-e2e.yml

schedules:
  - cron: "0 0 * * *"
    displayName: Daily midnight build
    branches:
      include:
        - master
    always: true

trigger: none

    jobs:
    - job: run_e2e_tests
      condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master')) 
      steps: 
      - task: SecretsManagerGetSecret@1
        displayName: Get AWS  secrets
        inputs:
          awsCredentials: 'project.dev.Aws'
          regionName: 'eu-central-1'
          secretIdOrName: 'secretname'
          variableName: 'tempvariable'

2 个答案:

答案 0 :(得分:0)

主管道抱怨triggerschedule参数,因为它只希望在嵌套模板中定义作业。在您提供的当前示例中,通过在模板结果中定义这两个参数进入主管道,如下所示:

[...]
- stage: e2e
  condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master')) 
  displayName: 'Run e2e Tests'
  jobs:
  schedules:
   - cron: "0 0 * * *"
     displayName: Daily midnight build
     branches:
       include:
       - master
     always: true
  trigger: none
  - job:
[...]

...那显然不是正确的语法。

对此的最佳解决方法可能是在主管道中包括schedule并为计划触发构建时需要执行的阶段添加运行条件eq(variables['Build.Reason'], 'Schedule')。 结果将类似于以下内容:(主要)azure-pipelines.yml

 schedules:
 - cron: "0 0 * * *"
   displayName: Daily midnight build
   branches:
     include:
     - master
   always: true
 trigger:
 - master
 pool:
   name: EDEA

 stages:
   [...]
 - stage: e2e
   condition: or(and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master')), eq(variables['Build.Reason'], 'Schedule')) 
   displayName: 'Run e2e Tests'
   jobs:
   - template: 'azure-pipelines-e2e.yml'

您还需要在嵌套模板中使用相同的运行条件。

答案 1 :(得分:0)

触发器应在主Yaml天蓝色管道中定义,而不是在嵌套模板yaml中定义。

模板yaml将与主yaml管道一起触发。您所能做的就是通过跳过该阶段而使其不被执行。您可以通过将条件eq(variables['Build.Reason'], 'Schedule')添加到需要按LJ提及的时间表执行的阶段中来实现。请参阅condtions了解更多信息。

如果只需要在计划的构建中运行e2e阶段,则还可以尝试创建另一个yaml管道来运行模板yaml中的作业。然后,您可以在新的yaml管道中定义计划的触发器,并且仅在计划中触发该管道。