azure-devops - Azure Pipelines 将 YAML 用于具有不同变量值但没有 YAML 重复的多个环境(阶段)
问题描述
假设我在 Azure 上有 3 个环境:Dev、Test 和 Prod。我有相同的管道来构建和部署每个环境的资源和代码,除了两个不同之处:
- 不同的触发分支
- 不同的变量值
这种情况的正确方法是什么?因为我想到了至少 3 个,其中没有一个是完美的:
选项 1:我想我可以在 Azure DevOps 上创建一个管道(由 3 个分支中的任何一个触发),每个环境有 3 个阶段,并为每个阶段添加一个根据源分支运行的条件,如下所示:
condition: eq(variables['Build.SourceBranch'], 'refs/heads/a-branch-name')
并在每个阶段引用不同的变量。但这会在每个阶段引入代码重复——当添加或修改一个步骤时,我必须记住编辑 3 个阶段——这是不可取的。
选项 2:在我的存储库中创建 3 个单独的 YAML 文件,每个文件都有指定的触发器分支并引用相同的变量名称,然后在 Azure DevOps 上创建 3 个不同的管道,每个文件都有不同的变量值。但这也会引入代码重复。
选项 3:使用其中定义的步骤创建 1 个build-and-deploy.yaml
文件作为模板,然后创建另外 3 个引用该模板的 YAML 文件,每个文件在每个 Azure 管道中具有不同的触发器分支和不同的变量值,如下所示:
trigger:
branches:
include:
- a-branch-name
steps:
- template: build-and-deploy.yaml
parameters:
parameterName1: $(parameterValue1)
parameterName2: $(parameterValue2)
这似乎是最好的选择,但我没有看到它在示例中的任何地方使用过,所以也许我只是不知道它的缺点,如果有的话。
解决方案
这是使用包含在特定于环境的管道中的共享管道配置的方法。
要支持 2 个环境(dev
和prod
),您需要:
- 1个共享管道yaml
- 2 个特定于 env 的 yaml,每个 env 一个
- 在 Azure DevOps 中创建了 2 个管道,每个环境一个;每个管道引用相应的 yaml
pipeline-shared.yml
:
variables:
ARTIFACT_NAME: ApiBuild
NPM_CACHE_FOLDER: $(Pipeline.Workspace)/.npm
stages:
- stage: Build
displayName: Build
pool:
vmImage: 'ubuntu-latest'
demands: npm
jobs:
...
- stage: Release
displayName: Release
dependsOn: Build
pool:
vmImage: 'ubuntu-latest'
jobs:
...
pipeline-dev.yml
:
# Trigger builds on commits to branches
trigger:
- dev
# Do not trigger builds on PRs
pr: none
extends:
template: pipeline-shared.yml
pipeline-prod.yml
trigger:
- master
pr: none
extends:
template: pipeline-shared.yml
推荐阅读
- google-sheets - 在“SUMIF”中沿总和范围广播的标准范围
- javascript - 以下 Ramda/函数编程模式是否遵循约定/最佳实践?
- python - Django:列出和显示数据库中的数据
- ruby-on-rails - 未定义的方法“评论”#
- kubernetes - 如何找出我应该将“scc”添加到哪个“用户”?
- ruby - 如何在 ruby datamapper 中设置一个属性,该属性是同一对象的另一个属性的函数?
- sql - 根据请求(未加载)触发行源(传递)查询
- python-3.x - Flask SQLAlchemy:像二进制方法
- javascript - 如何使用javascript从动态创建的html元素中获取输入数据
- wordpress - 如何从 Discord 的预览中删除作者标签?