Forum Discussion
Passing a here-string as adhoc Output Variable
- Sep 17, 2023
In Azure DevOps pipelines, when you set a variable using the `Write-Host` command as you've shown in your example, the variable is set to the value until the first newline character. To set a multi-line variable, you can use a different approach. You can use the `Write-Host` command with multiple `##vso[task.setvariable]` commands to set the variable line by line.
Here's an example of how you can set a multi-line variable in PowerShell:
$lines = @( "This is some text that I want to send", "to another task in my pipeline.", "This is another line of text." ) foreach ($line in $lines) { Write-Host "##vso[task.setvariable variable=scriptOutputMsg;isOutput=true]$line" }
This PowerShell script creates an array of lines and then iterates through the lines, setting the `scriptOutputMsg` variable one line at a time. The `isOutput=true` parameter is used to indicate that this is an output variable.
In your downstream tasks, you can access this multi-line variable as `$(scriptOutputMsg)` and it will retain all the lines you've set in the loop.
In Azure DevOps pipelines, when you set a variable using the `Write-Host` command as you've shown in your example, the variable is set to the value until the first newline character. To set a multi-line variable, you can use a different approach. You can use the `Write-Host` command with multiple `##vso[task.setvariable]` commands to set the variable line by line.
Here's an example of how you can set a multi-line variable in PowerShell:
$lines = @(
"This is some text that I want to send",
"to another task in my pipeline.",
"This is another line of text."
)
foreach ($line in $lines) {
Write-Host "##vso[task.setvariable variable=scriptOutputMsg;isOutput=true]$line"
}
This PowerShell script creates an array of lines and then iterates through the lines, setting the `scriptOutputMsg` variable one line at a time. The `isOutput=true` parameter is used to indicate that this is an output variable.
In your downstream tasks, you can access this multi-line variable as `$(scriptOutputMsg)` and it will retain all the lines you've set in the loop.
this solution is not working, what happen is the values get replaced by whatever is the last line in the lines! so in example above $(scriptOutputMsg) contains "This is another line of text." only. I tried all the solution I could find online, none of them are working, so I believe there is no way to pass a string with newline in it.
- RobinaJan 05, 2024MCTIf you find that there is no direct way to pass a string with newline characters in Azure DevOps variables, you might need to adjust your pipeline scripting or consider alternative approaches based on the specific requirements of your use case.
- Mona_MoravejJan 08, 2024Copper ContributorI have a docker build template (build_docker.yaml file with content below) that accept tags as parameter, it all works if we tag the docker image with one version but does not work if the image needs to be tagged with multiple tags:
parameters:
...
- name: azureServiceConnection
displayName: The service connection that has access to azure container registry in development environment
type: string
- name: dockerfilePath
displayName: The path to docker file
type: string
- name: image
displayName: The name of image
type: string
- name: containerRegistry
displayName: The name of container registry in development environment
type: string
- name: dockerBuildArgs
displayName: Any arguments as --build-arg, by deafult is empty (passing no argumnets to docker build command )
type: string
default: ' '
- name: versions
displayName: The versions of the image (list of tags that new generated image must be tagged with, coma separatd)
type: string
jobs:
- job: docker build
....
steps:
- task: AzureCLI@2
displayName: Acr login
inputs:
azureSubscription: ${{ parameters.azureServiceConnection }}
scriptType: "bash"
scriptLocation: "inlineScript"
failOnStandardError: false
inlineScript: |
az acr login --name ${{ parameters.containerRegistry }}
- powershell: |
$versions = "${{ parameters.versions }}"
$versionlist = $versions.Split(",") | foreach {$_.Trim() }
foreach ($version in $versionlist){
Write-Host "##vso[task.setvariable variable=TAGS;isOutput=true]$version"
}
displayName: 'Set versions for docker tasks'
name: SetVersions
- bash: |
echo $(SetVersions.TAGS)
- task: Docker@2
displayName: Build ${{ parameters.image }} image
inputs:
command: build
dockerfile: ${{ parameters.dockerfilePath }}
repository: ${{ parameters.containerRegistry }}/images/${{ parameters.image }}
arguments: --target ${{ parameters.image }} ${{ parameters.dockerBuildArgs }}
tags: |
$(SetVersions.TAGS)