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