RyanStanley4
RyanStanley4

Reputation: 31

TFS/VSTS Custom variables that aren't string cannot be used

I have been using TFS to create some release variables from PowerShell. I can then use '$Env:Server' in subsequent tasks in TFS to reference this output, this seems great to start with! EG:

Task 1 returns a server name then creates the TFS Variable:

Write-Host "##vso[task.setvariable variable=Server]"MySevrer

Task 2 Uses this information:

Write-Output $env:Server
MyServer

Upon outputting something in another format like an array or a hash table this does not work. The variable that gets created is just string as the documentation states using "Write-Host".

Task1 returns:

##vso[task.setvariable variable=Server] System.Collections.DictionaryEntry

Task 2 can not use this:

Write-Output $env:Server    
System.Collections.DictionaryEntry

Output that is created

I have tried outputting this as a string in the array format, EG:

[String]$Server = '@{MyServer=@("192.168.0.1")}'
Write-Host "##vso[task.setvariable variable=Server]"$Server

When i refer to this I try to convert this back to an array within PowerShell, however, I have had issues with doing this inside a script as it will see the string as being a single array object. (Not an array with a value)

Does anyone know if it posable to parse hashtables or arrays between Team Service's tasks/Task Task groups based on information output by a Powershell task?

I have currently got around this by writing a wrapper/orchestration function but this is not the ideal way for us. We are currently on Version 15.117.26714.0 but i cannot see anything in newer versions.

Upvotes: 3

Views: 7688

Answers (2)

Andrei
Andrei

Reputation: 51

ConvertTo-Json will do the trick, as mentioned by Daniel Mann.

Example: In Azure Devops release pipeline, there is an Azure PowerShell task with following code:

    $apps = Get-AzureRmResource -ResourceGroupName "$(ResourceGroupName)" -ResourceType Microsoft.Web/sites
    $objectIdArray = New-Object System.Collections.ArrayList
    foreach ($app in $apps) {
    if (!$app.Identity) {
        Write-Host "Enabling identity for $($app.Name) app service..."
        $app = Set-AzureRmWebApp -Name $($app.Name) -ResourceGroupName "$(ResourceGroupName)" -AssignIdentity $true
    } else {
        Write-Host "$($app.Name) app service has $($app.Identity.PrincipalId) as the identity."
    }
    $objectIdArray.Add($($app.Identity.principalId))
    }

$objectIdArrayJson = ($objectIdArray | ConvertTo-Json -Compress)
Write-Host "##vso[task.setvariable variable=objectIdArray;]$objectIdArrayJson"

Write-Host $env:objectIdArray

The following task is an Azure Resource Group Deployment task that has an overridden parameter:

-objectIdArray "$(objectIdArray)"

The release variable "$(objectIdArray)" has a value like:

["0512706a-0344-418a-9f25-5708d95e44aa","6047cbe6-c109-4aa7-8cfb-b473c088b1b1","68ee0d25-351f-44c8-aecf-cfc259f3cd97","44a6f3d6-23a3-443d-824b-445e0141f09c","805c3e6d-ab31-41f4-9d6c-8c9fc13ce
460","aa13b9db-200d-4c38-abf8-562a915ed8cd","8d1d7ec1-faa6-4af6-b732-331e51e86a90","02222b28-6370-4995-a633-29a1cdd08fd0","a48c21b1-b6ef-4582-b9a0-050965cb3614","9111421b-8535-4326-bbe9-1e891
33a0b56","5b1f6fca-599c-4895-ae4b-fabc0d3a4dd3","b12a935a-b1c3-4dec-b764-7c0a5307a766","8af7d615-c042-43b5-8ac0-736c6cf4ec3f","f0dd4dd9-e540-4e13-a8be-69ce08a6221c","b131e123-a87e-4faf-afed-4
37d6dbae4ab","af7f679b-1ac8-4991-b467-93ba4a16ec22","1bbb649c-b5e6-4f5c-a050-3a0cee0af985","4a7b728e-e8c6-49c0-bde2-54811708d5ab","3b190d28-c390-43c7-9269-1177afaf7b00","49f3777f-8668-4c72-82
60-753f65b933aa","727db5c4-ad56-457e-ad87-47b17c71e29b","801efff8-a852-4e7b-bc81-3d81d3bcfeb5","0947556e-7ece-4a36-a687-3c50f59e32f6"]

Upvotes: 5

Daniel Mann
Daniel Mann

Reputation: 59020

Pass them as JSON and use ConvertTo-Json and ConvertFrom-Json to convert them back and forth between JSON representations and PowerShell objects. When using ConvertTo-Json, be sure to use the -Compress flag.

Upvotes: 3

Related Questions