【问题标题】:Azure DevOps creating variables for actions in inline bash scriptsAzure DevOps 为内联 bash 脚本中的操作创建变量
【发布时间】:2019-03-21 21:07:07
【问题描述】:

在 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 正在阻止我的 bash 文件正确执行并替换最关键的部分。

我该如何解决这个问题?

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 你能提供一个使用问题代码的例子吗?
    • 当然,我已经添加了示例@Sawtaytoes。如果它对您有所帮助,如果您能将其标记为帮助他人的答案,那就太好了。
    • 当我创建这个问题时,我正在为另一家公司工作。如果不创建新的个人项目并进行尝试,我将无法再验证 Azure DevOps 的任何修复。我假设这可以解决问题。
    【解决方案2】:

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

    例如:

    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"
      

    【讨论】:

    • 我的问题是类型下的内联选项。没有“参数”区域。此外,当您传入$() 时,它会有所不同,因为它允许您将CLI 命令放入其中,例如$(ls -lah | grep time)。这是一个命令,而不是替换字符串。 Bash 天真地使用 $(cksum file.txt),但 Azure DevOps 将这些解析为 url 编码的替换参数,而不是 CLI 命令。
    • 我很抱歉让您如此困惑。我在原始问题中添加了更多信息,以便让您更好地了解正在发生的事情。我相信这是 Azure DevOps 中的一个错误。这个错误已经存在了几个月了。不过,这是我第一次不想通过将相同的 4 个.sh 脚本复制粘贴到 15 个存储库中来解决它。任何时候需要更改时,我都必须在每个 repo 中复制该更改。我的目标是将它们放在一个地方:构建管道。
    • @Sawtaytoes 好吧,我建议你在 Developer Community site 上提交问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    相关资源
    最近更新 更多