Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Azure devops yaml: release to multiple web nodes

I'm trying to figure out how I can use yaml pipelines to deploy an application to a multi web-node environment.

I'm trying to create a pipeline with 2 stages. Stage 1 will build the project, and stage 2 will deploy it to a staging environment. This staging environment (currently) has 2 web nodes. I don't want to hardcode the actual machines to deploy to into my pipeline. So I thought I'd add a variable group with a variable containing the web nodes to deploy to, and use a "each" statement to generate a job per node.

However, this doesn't work for several reasons:

  • The jobs are generated before the variable group is read, so it shows an error it cannot find the variable
  • Apparently an array variable is not supported at all, except for the built in variables

So my question is, how do other people solve this? I'd like to define the servers to deploy to in a central place, and not in my pipeline definition.

My initial attempt is printed below. This doesn't work, but it does describe what I'm trying to accomplish.

Main 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

edit:

I'm a bit closer to a solution. I was able to get the pipeline to work with the "each" construct using the following adjustment to the 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

This makes it a bit better. However, I still don't want to define the "nodes" parameter in my pipeline yaml source, but in a variable group (or some other place if anyone has a good suggestion)

like image 287
PaulVrugt Avatar asked Nov 06 '22 11:11

PaulVrugt


1 Answers

With the addition of virtual machines as resource for environments this issue has gone away. I can now use a rolling deployment task to deploy the apppicatio to all web nodes

like image 102
PaulVrugt Avatar answered Nov 11 '22 16:11

PaulVrugt