I have a project in Azure DevOps to build and release e2e tests for other FE projects. We are moving from conventional GUI pipelines with task groups to YAML pipelines, but I am having issues when using variables from a variable group.
What I had:
What I have now:
The variables should be read from a variable group in the library where my project resides. The variable group has access to the pipeline. The pipeline validates, but then the run tests task fails as the variables are not resolved. Am I referencing them in the correct way? I would like to avoid hardcoding the variables in the yml file.
Here is my multistage yml pipeline
variables:
- group: End2EndV3
trigger:
branches:
include:
- refs/heads/main
stages:
- stage: BuildArtifact
jobs:
- job: Job_1
displayName: Agent job 1
pool:
vmImage: windows-2019
steps:
- checkout: self
fetchDepth: 1
- task: NodeTool@0
displayName: Use Node 10.x
inputs:
versionSpec: 10.x
- task: CopyFiles@2
displayName: 'Copy Files to: $(Build.ArtifactStagingDirectory)'
inputs:
TargetFolder: $(Build.ArtifactStagingDirectory)
- task: PublishBuildArtifacts@1
displayName: 'Publish Artifact: MyArtifact'
inputs:
ArtifactName: MyArtifact
- stage: RunTests
jobs:
- job: RunTests
steps:
- template: template-test-release.yml
...
and here the yml template causing issues
steps:
- task: eliostruyf.build-task.custom-build-task.file-creator@6
displayName: 'Create cypress.env.json'
inputs:
filepath: 'somefilepath/MyArtifact/cypress.env.json'
filecontent: |
{
"myVariable": "$(myVariableFromLibraryValue)",
}
fileoverwrite: true
verbose: true
- task: Npm@1
displayName: 'npm ci install'
inputs:
command: ci
workingDir: '$(System.DefaultWorkingDirectory)/somefilepath/MyArtifact'
verbose: false
- task: Npm@1
displayName: 'npm run tests'
inputs:
command: custom
workingDir: '$(System.DefaultWorkingDirectory)/somefilepath/MyArtifact'
verbose: false
customCommand: 'run cy:run:tests'
- task: PublishTestResults@2
displayName: 'Publish Test Results *-test-output.xml'
inputs:
testResultsFiles: '*-test-output.xml'
searchFolder: '$(System.DefaultWorkingDirectory)/somefilepath/MyArtifact/cypress/results'
mergeTestResults: true
Try passing the variable from the variable group as a parameter to the template where these will be used.
For example:
variables:
- group: End2EndV3
# code omitted for brevity
- stage: RunTests
jobs:
- job: RunTests
steps:
- template: template-test-release.yml
parameters:
foo: "$(myVariableFromLibraryValue)" # from variable group
parameters:
- name: foo
type: string
displayName: 'Foo'
steps:
- task: eliostruyf.build-task.custom-build-task.file-creator@6
displayName: 'Create cypress.env.json'
inputs:
filepath: 'somefilepath/MyArtifact/cypress.env.json'
filecontent: |
{
"myVariable": "${{ parameters.foo }}",
}
fileoverwrite: true
verbose: true
# .....
Recommended reading: