【问题标题】:Azure devops yaml: release to multiple web nodesAzure devops yaml:发布到多个 Web 节点
【发布时间】:2020-03-17 09:40:40
【问题描述】:

我正在尝试弄清楚如何使用 yaml 管道将应用程序部署到多 Web 节点环境。

我正在尝试创建一个包含 2 个阶段的管道。第 1 阶段将构建项目,第 2 阶段将其部署到暂存环境。此暂存环境(当前)有 2 个 Web 节点。我不想将实际机器硬编码到我的管道中。所以我想我会添加一个变量组,其中包含一个包含要部署到的 Web 节点的变量,并使用“每个”语句为每个节点生成一个作业。

但是,由于以下几个原因,这不起作用:

  • 作业是在读取变量组之前生成的,因此显示错误找不到变量
  • 显然,除了内置变量之外,根本不支持数组变量

所以我的问题是,其他人如何解决这个问题?我想在一个中心位置定义要部署到的服务器,而不是在我的管道定义中。

我最初的尝试打印在下面。这不起作用,但它确实描述了我想要完成的事情。

主 yaml:

variables:
- group: LicenseServerVariables #this contains StagingWebNodes variable

stages:
- stage: Build
  displayName: Build
  <some build steps>

- stage: DeployTest
  displayName: Deploy on test
  condition: and(succeeded(), eq(variables['DeployToTest'], 'true'))
  jobs:
  - template: Templates\Deploy.yaml
    parameters:
      nodes: $(StagingWebNodes)

Deploy.yaml:

parameters:
  nodes: []

jobs:
- ${{ each node in parameters.nodes }}:
  - job: ${{ node }}
    displayname: deploy to ${{ node }}
    pool: Saas Staging
      demands: ${{ node }}
    steps:
    - template: DeployToNode.yaml

编辑:

我离解决方案有点近了。通过对 Deploy.yaml 进行以下调整,我能够使管道与“每个”构造一起使用:

parameters:
  nodes: 
  - name: 'Node1'
    pool: 
      name: StagingPool
      demands: 'Node1'
  - name: 'Node2'
    pool: 
      name: StagingPool
      demands: 'Node2'

jobs:
- ${{ each node in parameters.nodes }}:
  - job: ${{ node.name }}
    displayName: deploy to ${{ node.name }}
    pool: ${{ node.pool }}
    steps:
    - template: DeployToNode.yaml

这使它变得更好一些。但是,我仍然不想在我的管道 yaml 源中定义“nodes”参数,而是在变量组中(如果有人有好的建议,也可以在其他地方)

【问题讨论】:

  • 按照我们的设计,变量组对象是一个单级映射的列表。如果你想实现隐藏变量组中的一些敏感信息,你需要拆分你当前的地图。像 job name 一样,一旦您将构建排入队列,就必须从服务器获取值。这需要 node.name 必须在 YAML 中硬编码。然后,其他变量可以存储在变量组中。这个方法怎么样?
  • 感谢您的回复!不幸的是,这并不能解决我的 x 节点问题。我希望能够在我的 yaml 之外的其他东西中定义节点。但似乎当前的设计让我坚持命名我的 yaml 中的所有节点。希望即将推出的对滚动部署和虚拟机资源的支持可以解决此问题
  • 我最近的工作启发了我一个疯狂的想法,但它的缺点是会让你的脚本更加复杂。虽然变量组不允许多级映射,但您可以使用嵌套数组将它们存储在 JSON 文件中。然后使用 powershell 脚本将它们编译为变量。
  • 我不确定我理解你的意思。你能给我一个基本的例子吗?然后我会测试它,看看是否能解决我的问题

标签: yaml azure-pipelines multistage-pipeline


【解决方案1】:

添加虚拟机作为环境资源后,这个问题就消失了。我现在可以使用滚动部署任务将 apppicatio 部署到所有 Web 节点

【讨论】:

    猜你喜欢
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 2020-01-18
    • 2023-01-05
    相关资源
    最近更新 更多