如果从 fork 构建,则跳过部分 Travis 工作

Skipping parts of a Travis job if building from a fork

我一直在写一些 shell 不能 运行 的任务,除非 Travis CI PR 构建中存在安全环境变量。必须存在一个授权令牌才能推送有关构建的一些信息,因此对于源自分叉的构建,我想简单地跳过这些部分。它们并不重要。

我如何判断构建是否源自分叉?

来自the documentation around "Environment Variables"

TRAVIS_SECURE_ENV_VARS: Whether or not secure environment vars are being used. This value is either "true" or "false".

这有点模棱两可。这是否意味着正在 任何地方 使用安全环境变量(如 .travis.yml 中所示)?它们在当前构建中被导出为环境变量?我不确定这是保证我正在测试源自分叉的拉取请求的好方法,但我没有看到任何其他方法来做到这一点。

我第一次尝试的代码看起来像

[ ${TRAVIS_SECURE_ENV_VARS} = "false" ] && exit 0; # more shell code here...

但这似乎继续前进并在没有授权令牌的情况下向上推送,导致任务(和构建)失败。更复杂的是,如果命令失败,输出可能包含 auth 令牌……所以从 stderr 和 stdout 的所有内容都被重定向到 /dev/null。考虑到构建不会在几分钟内开始,我在漫长的调试周期中等待。

我的下一次尝试只是绕过了这个内置的环境变量,转而尝试直接获取一个安全的环境变量。

[ ${ghToken} -n ] && exit 0;

这与上面的方法一样失败。我开始怀疑 [ $COND ] && exit 0; 在这种情况下是否真的按照我期望的方式工作。当我在本地 运行 等效 shell 脚本(Mac OSX 和 bash)时,它似乎工作得很好。

Travis 是否提供内置方法来确定正在构建的拉取请求是来自原始存储库还是来自复刻?

Here is my current work around.

screenshotsClone: {
    command: ['[ ${ghToken} ] &&',
              'git submodule add -f', screenshotPullTemplate, 'screenshots > /dev/null 2>&1;'].join(' '),
    options: {
        stdout: false,
        failOnError: false
    }
}

如果 shell 任务存在合法问题,我宁愿不默默地传递错误。此时我不妨把前面的环境变量检查去掉。

我想你想要的是检查你的安全环境变量之一是否为 null 以检测你是 运行 从 fork 构建的,在这种情况下过早停止构建脚本。

因此我建议您使用 BASH 中的 -z comparison operator 来检测空字符串,因为 -n 运算符检测非空字符串。非 null 安全环境变量意味着您不是 运行 从 fork 构建的。

我的建议是将您的线路更改为:

[ -z "${ghToken}" ] && exit 0;

希望对您有所帮助。

停止在 .travis.yml 中使用 grunt-shell。将这些 shell 任务放入它们自己的文件中,以便您可以停止使用 /bin/sh 并开始使用 /bin/bash,这是您一直在本地测试的内容。

Something like this will fix your problems.

不要忘记将 shebang 标记为 #! /bin/bash,这对于应该在 Travis 上进行的各种检查至关重要。