如何在 Azure DevOps 管道中执行生成的 YAML 文件”

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

在 Azure DevOps 中,我有一个由两个阶段组成的主管道。在第一阶段,我生成一个名为“abc.yaml”的 YAML 文件,该文件未存储在存储库中。在主管道的后续阶段,我的目标是执行生成的“abc.yaml”。 Azure DevOps 支持这种场景吗?我可以触发不在存储库中的管道吗?

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

在执行之前,Azure Pipelines 会扩展模板并计算表达式,这通常称为 编译时扩展

要将管道转变为运行,Azure Pipelines 按以下顺序执行几个步骤:

  1. 首先,展开模板并计算模板表达式。
  2. 接下来,评估阶段级别的依赖关系以选择要运行的第一个阶段。
  3. 对于选择运行的每个阶段,会发生两件事:
    • 收集并验证所有作业中使用的所有资源以授权运行。
    • 评估作业级别的依赖关系以选择第一个要运行的作业。
  4. 对于选择运行的每个作业,将多配置(策略:矩阵或策略:YAML 中的并行)扩展为多个运行时作业。
  5. 对于每个运行时作业,评估条件以确定该作业是否有资格运行。
  6. 为每个符合条件的运行时作业请求代理。

所以,换句话说,YAML 在第一步之后就众所周知了。由于步骤 3 中发生的授权和验证活动,您无法生成 YAML file,然后让管道选取该文件。(例如,假设有人批准部署,然后管道决定生成需要的其他活动)进一步批准)。

但是,Azure Pipelines 具有非常丰富的模板系统,允许您在第一步中影响 yaml 的构建。

考虑使用模板条件插入来构建管道。

例如:

# pipeline.yml

parameters:
# This parameter is shown to the user when they run your pipeline
- name: runAnalysis
  type: boolean
  default: false

stages:
- template: stages.yml
  parameters:
    type: web-app
    runAnalysis: ${{ parameters.runAnalysis }}
    
# stages.yml

# these parameters are supplied by the calling pipeline/template
parameters:
- name: type
  type: string
  default: web-app
  values:
    web-app
    sql-server

- name: runAnalysis
  type: boolean
  default: false

stages:

- ${{ if eq( parameters.type, 'web-appp') }}:
  - stage: build
    jobs:
    - job: compile
      steps:
      - ...
    - ${{ if eq( parameters.runAnalysis }}:
      - job: sast_scan
        steps:
        - ...

  - stage: deploy
    ...

- ${{ elseif eq( parameters.type, 'sql-server') }}:
  - ${{ if eq( parameters.runAnalysis, 'true' ) }}:
    - stage: terraform_plan
      ...
  - stage: terraform_apply
    ...

也可以嵌套模板:

# stages

parameters:

stages:
- ${{ if eq( parameters.type, 'web-app' ) }}:
  - template: web-app.yml
    parameters:
    ...

- ${{ elseif eq( parameters.type, 'sql-server' ) }}:
  - template: sql-server.yml
    parameters:
    ...

上面是一个示例,但是您可以通过多种不同的方式构建模板。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.