Azure DevOps YAML:发布到多个Web节点。

3
我正在尝试使用yaml管道将应用程序部署到多个Web节点环境中。我要创建一个包含两个阶段的管道。第一阶段将构建项目,第二阶段将把项目部署到一个分布式环境中。这个环境目前有两个Web节点。 我不想在管道中硬编码实际机器以进行部署。因此,我想添加一个变量组,其中包含要部署到的Web节点,并使用"each"语句生成每个节点的作业。 然而,这样做有几个问题:
• 变量组读取之前会生成作业,所以它会显示无法找到变量的错误。
• 显然,除了内置变量之外,根本不支持数组变量。
因此,我的问题是,其他人如何解决这个问题? 我希望在一个中央位置定义要部署到的服务器,而不是在管道定义中。 下面是我的初始尝试,虽然它不能工作,但它确实描述了我想要实现的内容。 主要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进行以下调整,我成功地使用“each”结构使流水线工作:

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”参数,而是在变量组(或其他地方,如果有好的建议)中定义它。

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

1

随着虚拟机作为环境资源的增加,这个问题已经解决了。现在我可以使用滚动部署任务将应用程序部署到所有的Web节点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接