在 Azure DevOps 中,我有一个由两个阶段组成的主管道。在第一阶段,我生成一个名为“abc.yaml”的 YAML 文件,该文件未存储在存储库中。在主管道的后续阶段,我的目标是执行生成的“abc.yaml”。 Azure DevOps 支持这种场景吗?我可以触发不在存储库中的管道吗?
在执行之前,Azure Pipelines 会扩展模板并计算表达式,这通常称为 编译时扩展:
要将管道转变为运行,Azure Pipelines 按以下顺序执行几个步骤:
- 首先,展开模板并计算模板表达式。
- 接下来,评估阶段级别的依赖关系以选择要运行的第一个阶段。
- 对于选择运行的每个阶段,会发生两件事:
- 收集并验证所有作业中使用的所有资源以授权运行。
- 评估作业级别的依赖关系以选择第一个要运行的作业。
- 对于选择运行的每个作业,将多配置(策略:矩阵或策略:YAML 中的并行)扩展为多个运行时作业。
- 对于每个运行时作业,评估条件以确定该作业是否有资格运行。
- 为每个符合条件的运行时作业请求代理。
所以,换句话说,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:
...
上面是一个示例,但是您可以通过多种不同的方式构建模板。