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

use*_*776 19 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
Run Code Online (Sandbox Code Playgroud)

lar*_*sks 39

您正在对导致问题的YAML语法做出一些假设.如果你通过缩进后续行来"释放"一行YAML,如下所示:

- The quick brown fox
  jumped over the
  lazy dog.
Run Code Online (Sandbox Code Playgroud)

它就像你写的那样:

- The quick brown fox jumped over the lazy dog.
Run Code Online (Sandbox Code Playgroud)

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

  - if [ $TRAVIS_BRANCH == "master" && $TRAVIS_PULL_REQUEST == "false" ]; then
      ./.travis/success_message.sh
    fi
Run Code Online (Sandbox Code Playgroud)

实际上变成:

if [ $TRAVIS_BRANCH == "master" && $TRAVIS_PULL_REQUEST == "false" ]; then ./.travis/success_message.sh fi
Run Code Online (Sandbox Code Playgroud)

如果你尝试在shell中运行该行,你会得到:

sh: -c: line 1: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)

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

  - |
    if [ $TRAVIS_BRANCH == "master" && $TRAVIS_PULL_REQUEST == "false" ]; then
      ./.travis/success_message.sh
    fi
Run Code Online (Sandbox Code Playgroud)

这将按预期产生:

if [ $TRAVIS_BRANCH == "master" && $TRAVIS_PULL_REQUEST == "false" ]; then
  ./.travis/success_message.sh
fi
Run Code Online (Sandbox Code Playgroud)

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

  - if [ $TRAVIS_BRANCH == "master" && $TRAVIS_PULL_REQUEST == "false" ]; then
      ./.travis/success_message.sh;
    fi
Run Code Online (Sandbox Code Playgroud)

注意;终端前的新功能fi.这导致:

if [ $TRAVIS_BRANCH == "master" && $TRAVIS_PULL_REQUEST == "false" ]; then ./.travis/success_message.sh; fi
Run Code Online (Sandbox Code Playgroud)

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