当前位置: 首页 > 知识库问答 >
问题:

Azure管道在具有不同变量值但没有YAML重复的多个环境(阶段)中使用YAML

阙新觉
2023-03-14

假设我在Azure上有3个环境:开发、测试和产品。我有相同的管道来构建和部署每个环境的资源和代码,除了两个不同之处:

  • 不同的触发分支

对于这种情况,正确的方法是什么?因为我至少想到了3个,没有一个是完美的:

选项1:我想我可以在Azure DevOps上创建一个管道(由3个分支中的任何一个触发),每个环境有3个阶段,每个阶段根据源分支添加一个要运行的条件,如下所示:

条件:eq(变量['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个答案

闽朝
2023-03-14

根据您的描述,如果您希望不同的阶段共享相同的回购资源,但它们的触发分支和变量值不同。

关于触发器分支,您可以使用表达式{{if......}}来确定触发器分支条件。

关于变量值,可以定义模板和变量组以通过参数指定它们。

下面是一个示例,您可以参考它:

azure管道。yml:

样本:

 stages:
 - template: stage/test.yml
   parameters:
    ${{if contains(variables['Build.SourceBranch'], 'master')}}:
      variableGroup: devGroup
      stageName: Dev
      test: a
    ${{if contains(variables['Build.SourceBranch'], 'test')}}:
      stageName: test
      test: b

阶段/测试。yml:

parameters:
- name: stageName
  displayName: Test
  type: string
  default: test
  
- name: test
  displayName: Test
  type: string
  default: test

- name: variableGroup
  displayName: Test
  type: string
  default: test

stages:
- stage: Test_${{ parameters.stageName }}
  variables: 
    - group: ${{parameters.variableGroup}}
  jobs:
  - job: Test1
    pool:
      vmImage: vs2017-win2016
    steps:
    - script: echo "Hello Test1"
    - script: echo  ${{ parameters.test }}
    - script: echo $(dev1)

当然,如果要使用单个变量,可以直接在yaml中定义变量,而无需添加变量组。

雍马鲁
2023-03-14

下面介绍如何使用包含在特定于环境的管道中的共享管道配置。

要支持两个环境(devprod),您需要:

  • 1个共享管道yaml
  • 2个环境特定YAML,每个环境一个
  • 在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
 类似资料:
  • 我们正在努力将经典Azure管道转换为YAML管道。有一件事不清楚,那就是如何确保两个不同的变量组,它们的变量名称相同,但含义不同,不会互相踩踏。 例如,如果我有变量组和,每个变量名为,如何确保在YAML管道中使用正确的? 一个更令人担忧的例子是,如果我们最初有两个变量组而没有重叠的变量名,那么如何确保向组中添加一个新的重叠变量名不会取代最初预期的变量使用?

  • 我在Azure DevOps中创建了三个变量组,其中包括三个变量: 网络应用开发 每个变量组都有一个名为环境的变量,其值被适当命名以与环境相对应。 我现在想做的是引用Azure Pipeline yaml文件中的每个环境变量。下面的屏幕截图描述了我当前如何在管道开发阶段引用变量组WebApp-DEV。 但是,我如何调用或引用每个变量组的环境值,正如上面对WebApp DEV的描述?换句话说,从变量

  • 我最近尝试将我们的UI或基于经典的发布管道转换为基于YAML的发布管道。 我们有三个环境,最初一个CD构建将很高兴地部署到我们的开发环境中。 从那时起,我们手动触发一个版本(re:promotion)进行测试,然后在某个时候,如果我们都满意的话,手动升级到生产环境。 我们知道我们不能在发布阶段之间模仿手动推广,因为它目前不受支持,但是根据我所读到的,我们应该能够通过为请求手动推广的每个环境定义安全

  • 我试图将两个值中的一个分配给变量组之外的变量,但找不到如何使用IF-ELSE的引用。 基本上,我需要将这个jerkins逻辑转换为azure DevOps。 詹金斯 我从下面的一个引用中找到了一个引用,但是如果变量部分没有变量组,那么这个引用似乎有效。 https://stackoverflow.com/a/57532526/5862540 但在我的管道中,我已经有了一个用于机密的变量组,因此我必

  • 我有一个Postman集合,我正在尝试与newman一起工作,但我的环境变量没有被使用。 请求URL只是{{URL}},然后我有一个同名的环境变量。我正在使用以下命令运行测试: 我可以在报告中看到环境文件被正确读取,并且包含了我想要使用的变量,但请求失败,报告显示请求是“url”:“https://{url}}”,而不是我真正想要的。 当然,请求失败是因为“https://{{url}}”不是有效

  • 问题内容: 是否有任何环境变量可用于获取Jenkins管道标题? 我知道我们可以使用它来获得自由职业的头衔,但是有什么可以用来获取管道名称的东西吗? 问题答案: 您可以使用相同的名称(例如或)从groovy访问相同的环境变量。 从文档中: 可以从Groovy代码中以env.VARNAME或仅以VARNAME的形式访问环境变量。您也可以写入这些属性(仅使用env。前缀): 这些定义也将在构建期间或构