PaulVrugt
PaulVrugt

Reputation: 1882

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:

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)

Upvotes: 3

Views: 388

Answers (1)

PaulVrugt
PaulVrugt

Reputation: 1882

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

Upvotes: 1

Related Questions