TFS/VSTS. Azure File Сopy task, parameter 'storageKey' error
Несколько раз за послендие месяцы я столкнулся с проблемой, когда при работе задачи Azure File Copy для Release Definition в TFS/VSTS мы получаем ошибку: ##[error]Cannot bind argument to parameter 'storageKey' because it is an empty string. В очередной раз решил написать небольшую статью, так как вопрос возникает постоянно не только у меня.
При запуске задачи Azure File Copy в Release Definition мы получаем ошибку, которая выглядит следующим образом:
##[error]Cannot bind argument to parameter 'storageKey' because it is an empty string.
2018-03-16T12:46:20.0814438Z Executing the powershell script: C:\MyBuildAgent\tasks\AzureFileCopy\1.0.42\AzureFileCopy.ps1
Проблема в функции Get-AzureStorageKeyFromARM, которая объявляется в скрипте AzureUtilityGTE1.0.ps1:
function Get-AzureStorageKeyFromARM
{
param([string]$storageAccountName)
if (-not [string]::IsNullOrEmpty($storageAccountName))
{
# get azure storage account resource group name
$azureResourceGroupName = Get-AzureStorageAccountResourceGroupName -storageAccountName $storageAccountName
Write-Verbose "[Azure Call]Retrieving storage key for the storage account: $storageAccount in resource group: $azureResourceGroupName" -Verbose
$storageKeyDetails = Get-AzureRMStorageAccountKey -ResourceGroupName $azureResourceGroupName -Name $storageAccountName -ErrorAction Stop
$storageKey = $storageKeyDetails.Key1
Write-Verbose "[Azure Call]Retrieved storage key successfully for the storage account: $storageAccount in resource group: $azureResourceGroupName" -Verbose
return $storageKey
}
}
Конкретно ошибка в получени значения для переменной $storageKey в строке:
$storageKey = $storageKeyDetails.Key1
Необходимо заменить ее на следующую:
$storageKey = $storageKeyDetails[0].Value
Мы можем выполнить это вручную но надо понимать, что при смене Build Agent или при пересоздании папки агента нам придется вносить правки снова. Если пул агентов большой, то это реальная проблема. В моем случае, прав адмитистратора TFS у меня нет. Поэтому я предлагаю для такой задачи использовать Inline PowerShell Task в TFS\VSTS.
Путь к файлу, который будем править, выглядит так:
$(Agent.HomeDirectory)\tasks\AzureFileCopy\1.0.42\AzureFileCopy.ps1
$Agent.HomeDirectory - это системная переменная Release Definitions TFS\VSTS, её нам надо передать в скрипт в качестве аргумента. Назовем его $AgentHomePath. В итоге получается такой простой скрипт, который мы можем запускать всегда до задачи Azure File Copy. Если с файлом AzureUtilityGTE1.0.ps1 всё хорошо, то никаких изменений производиться не будет.
param ([string]$AgentHomePath)
$filepath = Join-Path $AgentHomePath "\tasks\AzureFileCopy\1.0.42\AzureUtilityGTE1.0.ps1"
if (Test-Path $filePath) {
$wrongValue = 'storageKeyDetails.Key1'
if (Select-String -Path $filepath -Pattern $wrongValue -SimpleMatch) {
$goodValue = 'storageKeyDetails[0].Value'
(Get-Content $filepath) | Foreach-Object {$_ -replace "$wrongValue","$goodValue"} | Out-File $filepath
Write-Output "File AzureUtilityGTE1.0.ps1 was rewrited"
}
}
Ссылка на страницу GitHub с описанием проблемы.
На этом всё. Буду очень рад, если этот костыль кому-либо пригодится ещё, кроме меня :)
Комментариев нет:
Отправить комментарий