понедельник, 19 марта 2018 г.


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"
    }
}

Вот так задача выглядит в TFS:



Ссылка на страницу GitHub с описанием проблемы. 

На этом всё. Буду очень рад, если этот костыль кому-либо пригодится ещё, кроме меня :)


Комментариев нет:

Отправить комментарий