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

Azure DevOps creating variables for actions in inline bash scripts

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

checksum="$(cksum file.txt)"

我最终会将 cksum file.txt 视为必需参数。无论出于何种原因,这种行为并不一致,所以有时我已经设置了可以与内联 Bash 脚本一起正常工作的构建管道,但不可避免地,我将 运行 解决这个问题并且无法修复它.

我什至尝试将 cksum file.txt 参数设置为 cksum file.txt,但将 space 替换为编码字符串:%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 正在阻止我的 bash 文件正确执行和字符串替换最关键的部分。

我该如何解决这个问题?

如果您的意思是要将字符串“cksum file.txt”作为内联 bash 脚本中的参数传递,那么您可以设置一个变量并在后续 tasks/scripts 中使用该变量.

例如:

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

您可以使用命令替换,因此将 $() 两边的反引号 ` 替换掉。

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