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

Bash 有条件地运行脚本在travis.yml中不起作用,为什么?,bash,yaml,travis-ci,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 ./.travi

以下内容导致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语法进行一些假设,这些假设会给您带来问题。如果通过缩进后续行来“exend”YAML行,如下所示:

- The quick brown fox
  jumped over the
  lazy dog.
  - |
    if [ $TRAVIS_BRANCH == "master" && $TRAVIS_PULL_REQUEST == "false" ]; then
      ./.travis/success_message.sh
    fi
就像你写的那样:

- 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脚本,最好使用逐字块运算符,
|
,如下所示:

- The quick brown fox
  jumped over the
  lazy dog.
  - |
    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语法。

我用larsks尝试了上述解决方案,但它对我不起作用,可能是因为在
bash
中,当使用
&&
|
时,需要分离条件

我有以下情况(根据上述解决方案)

我还检查了中的
.travis.yml
,它显示为有效,但根据bash,上面的内容可以按如下所示分开,也在本文中提到,我改为以下内容

    - if [ $TRAVIS_PULL_REQUEST == false ] && [ $TRAVIS_BRANCH == "development" ]; then
            echo "# Bump version and flyway migrate db"; 
        else 
            echo "Skip version increment!"; 
        fi

travis build成功了。这有点道理,因为上面是在bash中使用&&|的有效方法。只是分享,以防其他人遇到类似的问题

建议的解决方法对我都不起作用,我改为:

- if [[ ( "$TRAVIS_OS_NAME" == "osx" ) && ( "$TOXENV" == "py36" ) ]]; then brew update; fi

英国皇家空军的解决方案对我来说是有效的,它用[]分隔条件

[ $TRAVIS_PULL_REQUEST == false ] && [ $TRAVIS_BRANCH == "develop" ];

这很有效。我现在有很多这样的项目。