RCB
RCB

Reputation: 491

Triggering jobs with specific branch names( pattern) in azure devops

I have a set of jobs that needs to be triggered only when branches are named by certain pattern. (Eg: ctl-sw-v01.01.01-vbeta, ctl-sw-v01.11.01-vbeta, ctl-sw-v11.01.01-vbeta, ctl-sw-v01.01.21-vbeta). To make this generic, I have a pattern developed using regex '~ /^ctl-sw-v\d+\.\d+.\d+(-vbeta)?$/'. But I am finding it confusing as to how to specify this in the variables section in the yml file.

I was using as below:

trigger:
   tags:
    include:
    - '*'
   branches:
    include:
      - ctl-sw-v01.11.01-vbeta 

pool:
  vmImage: ubuntu-latest

variables:
  isBranch:  $[startsWith(variables['Build.SourceBranch'], 'refs/head/~ /^ctl-sw-v\d+\.\d+.\d+(-vbeta)?$/')]

jobs:
  - job: A
    condition: and(succeeded(), eq(variables.isBranch, 'true'))
    steps:
      - script: |
          echo "hello"
  - job: B
    steps:
      - script: |
          echo "howdy"
   

The job A is being skipped continuously, I checked my regex, it produces a match. What am I doing wrong here?

Upvotes: 2

Views: 2977

Answers (2)

Jane Ma-MSFT
Jane Ma-MSFT

Reputation: 5242

As Bast said, it is not supported to use regular expressions as part of condition expressions in Azure DevOps.

In addition,

The branches should begins with refs/heads/, but you are using refs/head/.

To avoid mistake like this, I suggest you to use Build.SourceBranchName instead of Build.SourceBranch. Build.SourceBranchName ignores the file structure of the branch and just search for the branch name.

Here is the example:

variables['Build.SourceBranch'], 'refs/heads/main'

variables['Build.SourceBranchName'], 'main'

Upvotes: 3

Bast
Bast

Reputation: 529

I don't think you can use regular expressions in the startsWith expression.

A solution would be to create a separate step (in a job before job A) where you evaluate the variable isBranch with a script. This creates more code, but the benefit is that you can independently test the regex in the future which might save maintenance cost in the long run.

Moreover, condition: and(succeeded(), eq(variables.isBranch, 'true')) booleans are written simply as True, not 'true'.

Upvotes: 2

Related Questions