Azure DevOps为内联bash脚本中的操作创建变量

时间:2018-10-17 08:37:37

标签: azure-devops azure-pipelines azure-pipelines-build-task azure-task-groups

在Azure DevOps中创建内联bash命令时:

checksum="$(cksum file.txt)"

我最终会看到cksum file.txt是必需的参数。出于某种原因,这种行为并不一致,因此有时我会设置与内联Bash脚本配合使用的构建管道,但不可避免地,我会遇到此问题,无法修复。

我什至尝试将cksum file.txt参数设置为cksum file.txt,但是用编码字符串%20替换了空格。它变成cksum%20file.txt,在bash中不是有效命令。

这是完整的脚本:

yarnCacheFilename="$(cksum yarn.lock).yarnCache.docker.tgz"

wget "https://example.azureedge.net/yarn-cache/$yarnCacheFilename"

if [ -f "$yarnCacheFilename" ]; then
    mkdir node_modules
    tar -xzvf "$yarnCacheFilename"
else
    yarn install --production
fi

足够简单。那是我可以在任何bash终端中运行的代码。可悲的是,Azure DevOps向任务组添加了一个参数:

Azure DevOps adding parameter for inline <code>bash</code> command

存在此参数的事实意味着Azure DevOps阻止了我的bash文件正确执行并替换了最关键的部分。

如何解决此问题?

2 个答案:

答案 0 :(得分:1)

您可以使用命令替换,因此请在两边都用反斜杠`替换$()。

https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html了解有关命令替换的更多信息。

checksum="`cksum file.txt`"

完整脚本示例

yarnCacheFilename="`cksum yarn.lock`.yarnCache.docker.tgz"

wget "https://example.azureedge.net/yarn-cache/$yarnCacheFilename"

if [ -f "$yarnCacheFilename" ]; then
    mkdir node_modules
    tar -xzvf "$yarnCacheFilename"
else
    yarn install --production
fi

答案 1 :(得分:0)

如果您要在内置bash脚本中将字符串“ cksum file.txt”作为参数传递,则可以设置一个变量,并在后续任务/脚本中使用该变量。

例如:

  1. 设置checksum变量:

    echo "##vso[task.setvariable variable=checksum]cksum file.txt"
    
  2. 读取变量

    echo "No problem reading $CHECKSUM"
    

有关详细信息,请参见Define and modify your variables in a script

如果您运行的脚本指定的路径类似于$/project/script/Test0427/bash.sh,则可以直接将字符串作为参数传递

  1. 参数:

    cksum file.txt”“ Test Arguments 1018

  2. 读取变量

    echo "No problem reading $1 and $2"
    

enter image description here