bash - 有条件地运行脚本在 travis.yml 中不起作用,为什么?

标签 bash yaml travis-ci

以下导致 travis 根本无法构建。当我尝试验证 travis.yml 文件时,它提示 if 语句正上方的行在第 3 列缺少 - 字符,但错误必须做使用下面的 if 语句。

我是否必须将 if 语句移到脚本中?

# Deploy
after_success:
  - ./tools/docker-push-container.sh
  - if [ $TRAVIS_BRANCH == "master" && $TRAVIS_PULL_REQUEST == "false" ]; then
      ./.travis/success_message.sh
    fi

最佳答案

您对 YAML 语法做出了一些假设,这会导致您出现问题。如果您通过缩进后续行来“扩展”一行 YAML,如下所示:

- The quick brown fox
  jumped over the
  lazy dog.

这和你写的完全一样:

- The quick brown fox jumped over the lazy dog.

这意味着你的 shell 片段,你写成:

  - if [ $TRAVIS_BRANCH == "master" && $TRAVIS_PULL_REQUEST == "false" ]; then
      ./.travis/success_message.sh
    fi

实际上变成了:

if [ $TRAVIS_BRANCH == "master" && $TRAVIS_PULL_REQUEST == "false" ]; then ./.travis/success_message.sh fi

如果您尝试在 shell 中运行该行,您将得到:

sh: -c: line 1: syntax error: unexpected end of file

如果您想在 YAML 文档中包含多行 shell 脚本,最好的办法可能是使用逐字 block 运算符 |,如下所示:

  - |
    if [ $TRAVIS_BRANCH == "master" && $TRAVIS_PULL_REQUEST == "false" ]; then
      ./.travis/success_message.sh
    fi

如预期的那样,这将导致:

if [ $TRAVIS_BRANCH == "master" && $TRAVIS_PULL_REQUEST == "false" ]; then
  ./.travis/success_message.sh
fi

或者,您可以正确使用分号:

  - if [ $TRAVIS_BRANCH == "master" && $TRAVIS_PULL_REQUEST == "false" ]; then
      ./.travis/success_message.sh;
    fi

注意终端 fi 之前的新 ;。这导致:

if [ $TRAVIS_BRANCH == "master" && $TRAVIS_PULL_REQUEST == "false" ]; then ./.travis/success_message.sh; fi

...这是完全有效的 shell 语法。

关于bash - 有条件地运行脚本在 travis.yml 中不起作用,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38789253/

相关文章:

github - 如何避免 Github Actions 中的代码重复; yaml 中有某种循环吗?

ios - 转换大 yml 数据

bash - awk 'if condition'下的sum变量 'for loop'

bash - echo -e 在 ubuntu 上由 root 在脚本中运行时表现不同

google-app-engine - 如何下载 GAE 应用程序的 index.yaml 文件?

bash - 如何配置我的 .travis.yml 文件以运行构建镜像的脚本,该脚本已作为 .sh 文件包含在存储库中

travis-ci - pytest 因 ModuleNotFoundError 和未使用插件的名称而失败

travis-ci - 如何在 .travis.yml 中获取 Travis 的构建工作目录?

linux - 为什么有时无法识别子外壳中的 DB2 连接

bash - 使用 set -e,是否可以忽略某些命令的错误?