假设我在 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 个不同的管道,每个管 Prop 有不同的变量值。但这也会引入代码重复。
选项 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
),您需要:
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
关于azure-devops - Azure Pipelines 将 YAML 用于具有不同变量值但没有 YAML 重复的多个环境(阶段),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64777703/