gpt4 book ai didi

AzureDevOps : Pass task variable to subsequent powershell task type as Object

转载 作者:行者123 更新时间:2023-12-03 06:58:10 24 4
gpt4 key购买 nike

我想要创建一个管道,将文件从一个 Azure 订阅复制到一个 Azure DevOps 管道中的下一个订阅。

为此,我设置了管道 yaml 和两个 powershell 脚本,其中参数是通过日志记录命令创建的,并作为参数传递给第二个 powershell 任务。

管道.yaml

trigger:
- none

pool:
vmImage: ubuntu-latest

steps:
- task: AzurePowerShell@5
inputs:
ScriptType: filePath
ScriptPath: '$(System.DefaultWorkingDirectory)/Task.ps1'
azureSubscription: 'Sub1'
azurePowerShellVersion: latestVersion
displayName: 'Task 1'

- task: AzurePowerShell@5
inputs:
ScriptType: filePath
ScriptPath: '$(System.DefaultWorkingDirectory)/Task2.ps1'
azureSubscription: 'Sub2'
azurePowerShellVersion: latestVersion
ScriptArguments: >
-DestAcc "$(DestAcc)"
-DestKey "$(DestKey)"
-DestContext "$(DestContext)"
-DestStorageContainer "$(DestStorageContainer)"
displayName: 'Task 2'

任务1.ps1

$location="germanywestcentral"
$rg="rg1"
$StorageAccountName="storage1"
$StorageSku="Standard_ZRS"
$StorageKind="StorageV2"
$StorageContainer="blobcontainer"

$StorageAccount=Get-AzStorageAccount -ResourceGroupName $rg -Name $StorageAccountName
$storageAccountKey=(Get-AzStorageAccountKey -ResourceGroupName $rg -Name $StorageAccountName).Value[0]
$StorageAccountContext=$StorageAccount.Context

Write-Host "##vso[task.setvariable variable=DestStorageContainer;]$StorageContainer"
Write-Host "##vso[task.setvariable variable=DestKey;]$storageAccountKey"
Write-Host "##vso[task.setvariable variable=DestContext;]$StorageAccountContext"
Write-Host "##vso[task.setvariable variable=DestAcc;]$StorageAccountName"

任务2.ps1

param (
[string] $DestStorageContainer,
[string] $DestUrl,
[string] $DestKey,
[object] $DestContext,
[string] $DestAcc
)

$subscriptionId=(Get-AzSubscription).Id
$resourceGroupName ="rg2"
$diskName = "DD"
$DestFileName="Filename"

$DestAcc=$DestAcc
$DestContainer=$DestStorageContainer
$DestKey=$DestKey
$DestContext=$DestContext
$sasExpiryDuration="3600"


Start-AzStorageBlobCopy -AbsoluteUri $sas.AccessSAS -DestContainer $DestContainer -DestContext $DestContext -DestBlob $DestFileName

现在的问题是参数 $DestContext 将被格式化为字符串类型,而不是“Microsoft.WindowsAzure.Commands.Common.Storage.LazyAzureStorageContext”类型。管道中的整个错误消息如下:

Cannot convert the "Microsoft.WindowsAzure.Commands.Common.Storage.LazyAzureStorageContext" value of type "System.String" to type "Microsoft.Azure.Commands.Common.Authentication.Abstractions.IStorageContext".

然后我开始解决这个问题,并在执行 powershell 任务时将“Az.Stroage”模块安装到运行器中。但这并没有解决问题,因为我是在 PARAM 部分内设置对象的类型,而不是在导入“Az.Storage”模块之后设置。

有人知道这是否可行吗?有没有办法可以通过任务变量将 Azure 存储上下文对象传递到下一个任务?或者将类型从字符串更改为 Azure 存储上下文类型?

谢谢!

最佳答案

使用相同的 PowerShell 进行测试并重现相同的问题。

当您在 Pipeline 变量中设置值时,它将显示为 String 类型。

恐怕没有方法可以将对象形式保存在变量中。

为了满足您的要求,我建议您可以在Task2.ps1中添加命令来获取同一任务中的上下文。

New-AzStorageContext -StorageAccountName "ContosoGeneral" -StorageAccountKey "< Storage Key for ContosoGeneral ends with == >"

这是一个例子:

param (
[string] $DestStorageContainer,
[string] $DestUrl,
[string] $DestKey,
[object] $DestContext,
[string] $DestAcc
)

$subscriptionId=(Get-AzSubscription).Id
$resourceGroupName ="rg2"
$diskName = "DD"
$DestFileName="Filename"

$DestAcc=$DestAcc
$DestContainer=$DestStorageContainer
$DestKey=$DestKey
$sasExpiryDuration="3600"

$Context = New-AzStorageContext -StorageAccountName "ContosoGeneral" -StorageAccountKey "< Storage Key for ContosoGeneral ends with == >"

Start-AzStorageBlobCopy -AbsoluteUri $sas.AccessSAS -DestContainer $DestContainer -DestContext $DestContext -DestBlob $Context

您可以使用存储帐户 key 访问不同订阅中的存储帐户。

关于AzureDevOps : Pass task variable to subsequent powershell task type as Object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72722869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com