When you need to pass parameters between your build and release pipelines it could be a real struggle if you do not want to use variable groups. Variable groups can accomplish the requested (to pass values between build and release pipelines) but this scenario is not useful for a parametric input which is a common case when deploying a project. You can accomplish that either by using a plugin from another publisher or by following the publish artifacts procedure that I will describe.
In order to pass variables between your build and release pipelines you can create/export a file containing your variable on your build agent. This file should be exported as build artifact and then downloaded on the release pipeline.
The below build pipeline implements the functionality I described. The exported file is named projectname.txt and will be located on artifacts folder on your build agent inside folder drop. For example C:\agent\1\a\drop
trigger: - dev pool: vmImage: windows-latest parameters: - name: powerenvironment displayName: Where to deploy? type: string steps: - task: PowerShell@2 inputs: targetType: 'inline' script: | $variable = '${{parameters.powerenvironment}}' $variable | Out-File $(Build.ArtifactStagingDirectory)\projectname.txt Get-Content $(Build.ArtifactStagingDirectory)\projectname.txt - task: PublishBuildArtifacts@1 inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)' ArtifactName: 'drop' publishLocation: 'Container'
When you run the pipeline you will be asked for a parameter. I gave this entry my name which will be passed on release.
My release pipeline will download the build artifacts and get the value of the file. The release pipeline includes two steps.
The first one downloads the folder drop from build artifacts. The projectname.txt is located there.
Then the powershell will print the contents of the projectname.txt
You can check the result and verify you get the parameter input value from the powershell script.
Bonus content:
You can also write your input parameter as a variable on the build agent and reference this value on a later step. This should be again a powershell step on your release pipeline.
$myVariable = "ProjectName"; $myValue = Get-Content $(System.ArtifactsDirectory)/drop/projectname.txt; Write-Host "##vso[task.setvariable variable=ProjectName]($myValue)";
Lastly create a dump archive step to reference the input parameter from the build pipeline.
In order to test, use in the archive path the ProjectName variable.
Run the pipeline and verify that input parameter is correct (I used gerasimos).
Youtube video:
Welcome
this is a great solution to passing variables.
but in case you have multiple projects and Builds artifacts in the same pipline
depending on your solution you could create a mapping on the text file and then handle the file on the release step. This should require more scripting on the release pipeline but it is feasible to be implemented
I can’t post images here
I will try to explain
First, imagine we have a multi-projects with the same solution.
for every project, we mad build a pipeline with help of a path filter.
then we have the main branch let’s call it Development.
now we move to the release pipeline.
in artifacts, we add 3 artifacts and in Stages, we add 1 stage only
why is it for?
the aim here is for all these 3 artifacts will deploy in the same server
now the trick here is when one artifact is triggered all the 3 artifacts will download to $(System.ArtifactsDirectory) on agent “…/r1/a/” folder
then you will have many of “projectname.txt” file
Hello Mohammad, I think I understood your solution. For that setup I would use the same mechanism but I would indicate a different artifact for each project. Lets say that you have project1 with artifact1. In the PublishBuildArtifacts task you should name your artifacts and then use the name for the release step. For example, when you publish an artifact ArtifactName: ‘artifact1’ and inside you place a file projectname.txt then you can use that in the release step with $(System.ArtifactsDirectory)/project1/projectname.txt . In that way you can have a separate text file for each artifact inside your release pipeline.
What would be the solution for many build artifacts in the same release pipeline