【问题标题】:Set Output Variable in Azure CLI task on VSTS在 VSTS 上的 Azure CLI 任务中设置输出变量
【发布时间】:2021-07-28 18:25:38
【问题描述】:

为了完成这个非常简单的任务,我快疯了。 我需要在 Visual Studio Team Services 的 Azure CLI 任务中设置输出变量,因为发布定义中的下一个任务将根据此变量的值执行。
我写了这个简单的代码

call az extension add --name azure-cli-iot-ext
call echo ##vso[task.setvariable variable=iotEdgeExists;]$(az iot hub query -n $(iotHub) -q "select * from devices.modules where devices.deviceId ='$(iotEdge)'")

这可行,但并不像预期的那样,事实上,当我在下一个 Azure CLI 任务中读取输出变量并尝试在屏幕上打印它时,我得到的是命令字符串而不是输出......

call echo"$(az iot hub query -n <IOT_HUB> -q "select * from devices.modules where devices.deviceId ='<IOT_EDGE>'")"

我做错了什么?

【问题讨论】:

    标签: azure azure-devops azure-pipelines-release-pipeline azure-cli azure-cli2


    【解决方案1】:

    如果使用 Azure CLI 版本 2.* ,您可以使用 powershell 命令而不是批处理脚本向导。微软文档找到here

    例如,如果您需要访问令牌来更新 azure 数据库,它看起来像这样:

    $token= & az account get-access-token --resource=https://database.windows.net --query accessToken
    Write-Output("##vso[task.setvariable variable=sqlToken;]$token")
    

    如果在本地测试,请不要忘记先登录:

    az login
    

    Install Azure cli here

    【讨论】:

    • 要访问 azure sql,您需要 --resource=https://database.windows.net/(即末尾带有斜线)
    • @MattSullivan 那是不正确的伙伴。测试有和没有斜线都成功获得令牌
    【解决方案2】:

    参考以下代码:

    call {your command}>tmpFile1
    set /p myvar= < tmpFile1 
    echo "##vso[task.setvariable variable=testvar;]%myvar%"
    

    FOR /F "tokens=* USEBACKQ" %%F IN (`{your command}`) DO (
    SET var=%%F
    )
    echo "##vso[task.setvariable variable=testvar;]%var%"
    

    How to set commands output as a variable in a batch fileMechaflash 的回答

    【讨论】:

    • 预计制作 xplat 会非常困难。
    • 使用第二个命令时,似乎(在我的情况下)在变量末尾添加了一个额外的双引号。所以我只使用echo ##vso[task.setvariable variable=testvar;]%var%
    • 通过第二种方法,我能够使用它来获取 accessToken 以连接到 Azure SQL 以进行 Dacpac 部署,这正是我所需要的。我也遇到了@StefHeyenrath 描述的问题,不得不删除引号。对于那些使用访问令牌寻找 Dacpac 部署的人,只需传递参数中的 /at:$(testvar) 并使用 ConnectionString 作为身份验证类型下拉值。在您的连接字符串中没有指定任何用户/密码或身份验证=。
    【解决方案3】:

    灵感来自上面的答案,但有一些变化。

    截至 2019 年 7 月,在 Microsoft DevOps 中的托管 Ubuntu 代理上的 Azure CLI 任务中工作。

    此示例运行 az 命令以获取存储帐户的完整资源名称并将其设置在变量 _StorageAccountNameVar 中以用于另一个管道任务。

    myvar=`az storage account list -g MyResourceGroup --query "[?contains(name, 'config')].name" -o tsv`
    echo $myvar
    echo "##vso[task.setvariable variable=_StorageAccountNameVar;]$myvar"
    

    【讨论】:

      【解决方案4】:

      我遇到了一些麻烦(错误代码 255)

          FOR /F “tokens=* USEBACKQ” %%F IN (`az account get-access-token --resource=https://database.windows.net/ -query accessToken`) DO (
      SET var=%%F
      )
      echo ##vso[task.setvariable variable=sqlToken;]%var%
      

      所以我用了这个(那个对我有用)

      for /f "tokens=1 USEBACKQ" %%F in (`az account get-access-token --resource=https://database.windows.net/ --query accessToken`) do echo ##vso[task.setvariable variable=sqltoken;]%%F
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多