Skip to content

Azure pipeline reuse variables in template from another repository#


In my project, I have several Azure pipelines that share some same variables, instead of declaring them in each pipeline, I would like to refactor it by using some central places to store the shared variables.

I can split the variables into 3 groups:

  1. organization level variables: organization name, tenant id, etc.
  2. project level variables: project name, resources group name, keyvault name, project support email, etc.
  3. repository level variables: module name, repository support email, etc.

Suppose I'm writing an Azure pipeline called cicd.yml for the repositoryA located at: organizationA/projectA/repositoryA, I will save the above 3 groups of variables to 3 places:

  1. organization level variables -> to a new repository outside of the project, for e.g. organizationA/sharedProject/sharedRepository
  2. project level variables -> to a new repository inside the same project, for e.g. organizationA/projectA/sharedRepository
  3. repository level variables -> to the same repository: organizationA/projectA/repositoryA

By checking following two official docs (in fact in the same doc :-)) : Variable reuse, Use other repositories, the file content of each variable group could be:

organization level variables#

# file: organizationA/sharedProject/sharedRepository/.azure-pipelines/variables/organization_variables.yml

  organizationName: xxx

project level variables#

# file: organizationA/projectA/sharedRepository/.azure-pipelines/variables/project_variables.yml

  - template: .azure-pipelines/variables/organization_variables.yml@sharedProject_sharedRepository
  - name: myProjectVar
    value: $(organizationName)_abc

repository level variables#

# file: organizationA/projectA/repositoryA/.azure-pipelines/variables/repository_variables.yml

  - template: .azure-pipelines/variables/project_variables.yml@projectA_sharedRepository
  - name: myRepositoryVar
    value: $(myProjectVar)_abc

root cicd file#

# file: organizationA/projectA/repositoryA/.azure-pipelines/cicd.yml

# repository type = git means Azure DevOps repository as per

    - repository: sharedProject_sharedRepository
      type: git
      name: sharedProject/sharedRepository
    - repository: projectA_sharedRepository
      type: git
      name: projectA/sharedRepository

trigger: xxx

  - template: variables/repository_variables.yml
  - name: myRepositoryVar
    value: xxx

  vmImage: xxx

  - script: |
      echo $(myRepositoryVar)
    displayName: test repositry level variables


Note: We cannot put the resources part elsewhere, it must be declared in the root pipeline file. Otherwise, the pipeline might throw the Unexpected value 'resources' error. There's some black magic that the variables templates defined in other repositories (for e.g. project_variables.yml) recognize well the sharedProject_sharedRepository repository resource defined in the repository hosting the cicd.yml file.