microsoft / azure-pipelines-yaml

Azure Pipelines YAML examples, templates, and community interaction
MIT License
1.21k stars 934 forks source link

How to pass variable name to Azure stage and job? #556

Closed bachhavdipak closed 2 years ago

bachhavdipak commented 2 years ago

I am a newbie to azure DevOps and trying to design a pipeline, where I need to pass variable name Green to stage name and job name

Azure CLI:

echo 'PIPELINES RUNNING' az pipelines run --name SampleTest --variables "Variable=Green"

variables:
  fullVersion: 'null'
  gitTagDate: 'null'
trigger:
  batch: true
  paths:
    exclude:
      - .azuredevops/pull_request_template.md
      - CHANGELOG.md
      - .gitignore
      - .pre-commit-config.yaml
      - README.md
resources:
  repositories:
    - repository: templates
      type: git
      name: DevOpsEngineering/azure-pipeline_templates
stages:
  - stage: SmokeTest $(Variable)
    jobs:
      - job: SmokeTest $(Variable)
        timeoutInMinutes: 90
        pool:
          vmImage: ubuntu-20.04
        continueOnError: true
        steps:
          - task: Gradle@2
            inputs:
              gradleWrapperFile: gradlew
              tasks: clean test
            env:
              SYSTEM_ACCESSTOKEN: $(System.AccessToken)
          - task: Gradle@2
            inputs:
              gradleWrapperFile: gradlew
              tasks: publishResults
            env:
              SYSTEM_ACCESSTOKEN: $(System.AccessToken)
max-zaytsev commented 2 years ago

Hi @bachhavdipak, You can't use this variable for generating stage and job names as it is only available at runtime. More info about it - https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch#template-expression-syntax

I believe you can use templates and parameters for your task

For example:

parameters:
- name: stageName
- name: jobName

pool:
  vmImage: 'ubuntu-latest'

stages:
  - template: template-stages.yml # Name of the template file
    parameters:
      stageName: SmokeTest_${{ parameters.stageName }}
      jobName: SmokeTest_${{ parameters.jobName }}
  - template: template-stages.yml
    parameters:
      stageName: SomeTest_${{ parameters.stageName }}
      jobName: SomeTest_${{ parameters.jobName }}

template-stages.yml:

parameters:
- name: 'stageName'
- name: 'jobName'

stages:
- stage: ${{ parameters.stageName }}
  jobs:
  - job: ${{ parameters.jobName }}
    pool:
      vmImage: 'ubuntu-20.04'
    steps:
    - script: echo ${{ parameters.stageName }} ${{ parameters.jobName }}

Here is the right place for posting such questions: https://developercommunity.visualstudio.com/search?space=21

Closing this, since it's not the issue with YAML templates.

bachhavdipak commented 2 years ago

Hi @max-zaytsev

I am a newbie to azure DevOps and trying to design a pipeline, where I need to pass variable names Green, Yellow, Blue, Black & Orange to stage name and job name. I have tried the above solution but in the above case we passed only a single variable but now I am trying to pass multiple variables. Can you please provide your valuable thoughts on this ? Sorry for the inconvenience ad big thank you for your help. Azure CLI:

echo 'PIPELINES RUNNING'
az pipelines run --name SampleTest --variables "Variable=Green"
az pipelines run --name SampleTest --variables "Variable=Yellow"
az pipelines run --name SampleTest --variables "Variable=Blue"
az pipelines run --name SampleTest --variables "Variable=Black"
az pipelines run --name SampleTest --variables "Variable=Orange"
variables:
  fullVersion: 'null'
  gitTagDate: 'null'
trigger:
  batch: true
  paths:
    exclude:
      - .azuredevops/pull_request_template.md
      - CHANGELOG.md
      - .gitignore
      - .pre-commit-config.yaml
      - README.md
resources:
  repositories:
    - repository: templates
      type: git
      name: DevOpsEngineering/azure-pipeline_templates
stages:
  - stage: SmokeTest $(Variable)
    jobs:
      - job: SmokeTest $(Variable)
        timeoutInMinutes: 90
        pool:
          vmImage: ubuntu-20.04
        continueOnError: true
        steps:
          - task: Gradle@2
            inputs:
              gradleWrapperFile: gradlew
              tasks: clean test
            env:
              SYSTEM_ACCESSTOKEN: $(System.AccessToken)
          - task: Gradle@2
            inputs:
              gradleWrapperFile: gradlew
              tasks: publishResults
            env:
              SYSTEM_ACCESSTOKEN: $(System.AccessToken)