首页 > 解决方案 > 在模板中读取时,Azure 管道中设置的变量会损坏

问题描述

变量 big_var_01 通过遵循 azure 管道 yaml 文件定义为值 '3q4w#V$X3q4w#V$X' 在 azure 管道模板中读回时被损坏为值 '3q4w#V#V'

cat parent_scott.yaml



variables:
- name: big_var_01
  value: ${{ parameters.big_var_01 }}


parameters:
  - name: big_var_01
    displayName: "this var wants to get written to then read by templates"
    type: string
    default: '3q4w#V$X3q4w#V$X'


# CI Triggers
trigger:
  branches:
    exclude:
      - '*'

pool:
  vmImage: 'ubuntu-latest'

# Release Stages
stages:

- template: child_scott_one.yaml

后面的 azure 管道模板变量 big_var_01 被读回,但其值已损坏且与上述分配不匹配

cat child_scott_one.yaml 


# Release Stages
stages:
- stage: A
  jobs:
  - job: JA
    steps:
    - script: |
        echo "here is big_var_01  -->$(big_var_01)<-- "

        local_var_01=$(big_var_01)

        echo
        echo "here is local_var_01  -->$local_var_01<-- "
        echo
        echo "length of local_var_01 is ${#local_var_01}"
        echo


      name: DetermineResult

见上述管道的运行

https://dev.azure.com/sekhemrekhutawysobekhotep/public_project/_build/results?buildId=525&view=logs&j=54e3124b-25ae-54f7-b0df-b26e1988012b&t=52fad91f-d6ac-51fb-b63d-00fda7898bb6&l=13

请参阅https://github.com/sekhemrekhutawysobekhotep/shared_variables_across_templates上的代码

如何使字符串变量 big_var_01 被视为文字,显然它以某种方式被评估并因此损坏......上面的代码是我实际天蓝色管道的简化,即使在设置带有值的键值秘密时,我也会遇到相同的变量损坏问题3q4w#V$X3q4w#V$X 在管道模板中读回时损坏

这是另一个明确显示此问题的管道运行 https://dev.azure.com/sekhemrekhutawysobekhotep/public_project/_build/results?buildId=530&view=logs&j=ed5db508-d8c1-5154-7d4e-a21cef45e99c&t=a9f49566-82d0-5c0a- 2e98-46af3de0d6e9&l=38 在这次运行中我检查了标记为 ON 管道运行选项:“启用系统诊断”...接下来我将尝试从 azure 变量中单引号我的 shell 分配

标签: azureazure-devopsazure-pipelines

解决方案


在某个步骤,Azure DevOps 或 Ubuntu 替换了部分字符串。所以你有了:

3q4w#V$X3q4w#V$X= 3q4w#V+ $X3q4w+ #V+$X

这部分$X3q4w和这$X被替换为空字符串给你3q4w#V+ #V

如果你像这里一样\运行这个$3q4w#V\$X3q4w#V\$X

This is job Foo.
here is big_var_01  -->3q4w#V$X3q4w#V$X<-- 

here is local_var_01  -->3q4w#V$X3q4w#V$X<-- 

length of local_var_01 is 16

我在运行它时遇到错误,windows-latest但是我得到了正确的字符串:

"This is job Foo."
"here is big_var_01  -->3q4w#V$X3q4w#V$X<-- "
'local_var_01' is not recognized as an internal or external command,
operable program or batch file.
ECHO is off.
"here is local_var_01  -->$local_var_01<-- "
ECHO is off.
"length of local_var_01 is ${#local_var_01}"
ECHO is off.
##[error]Cmd.exe exited with code '9009'.

所以看起来ubuntu用env变量替换了它,因为没有像这样的变量$X3q4w$X它用空字符串替换。


推荐阅读