条件

此页面记录了现在为默认版本的条件 v1。v0 的文档可以在 此处 找到。

条件可用于通过在构建配置(您的 .travis.yml 文件)中指定条件来过滤和拒绝构建、阶段、作业和通知。有关详细信息,请参阅 条件构建、阶段和作业条件通知

可以使用 travis-conditions 命令测试条件。请参阅 测试条件

集成 #

条件使用 此库 进行解析和评估,由接受构建请求并生成构建、阶段和作业的组件进行解析和评估。

以下已知属性可用,并且可以在条件中使用

  • type(当前事件类型,已知事件类型为:pushpull_requestapicron
  • repo(当前存储库的 slug owner_name/name
  • branch(当前分支名称;对于拉取请求:基本分支名称)
  • tag(当前标签名称)
  • commit_message(当前提交消息)
  • sender(事件发送者的登录名)
  • forktruefalse,具体取决于存储库是否为 fork)
  • head_repo(对于拉取请求:头部存储库的 slug owner_name/name
  • head_branch(对于拉取请求:头部存储库的分支名称)
  • os(操作系统)
  • language(构建语言)
  • sudo(sudo 访问权限)
  • dist(发行版)
  • group(镜像组)

此外,构建配置 (.travis.yml) 和存储库设置中的环境变量可用,并且可以使用 env(FOO) 进行匹配,请参见下文。

请注意,这意味着条件无法访问构建环境,并且它们不会在 Bash 中进行评估。不能评估 Bash 变量或子进程。变量名和以美元符号 $ 开头的未加引号的字符串会引发解析错误,导致构建请求被拒绝。加引号的字符串仍然可以以美元符号开头,因此,如果您确实需要一个字符串以美元符号开头,则可以将其括在引号中。

规范 #

将解析和评估以下表达式。

单个术语

true
false

比较值

1 = 1
true != false

将函数调用与属性进行比较

env(FOO) = type

比较函数调用

env(FOO) = env(BAR)

与正则表达式匹配

branch =~ /^(one|two)-three$/
env(FOO) =~ /^(one|two)-three$/

属性在列表中

branch IN (one, other)

列表中的函数调用

repo IN (env(ONE), env(OTHER))

谓词

tag IS present
tag IS blank

嵌套函数调用

env(env(FOO))

布尔运算符

branch = master AND env(FOO) = foo
branch = master OR env(FOO) = foo
branch = master AND env(FOO) = foo OR tag = bar
branch = master AND (env(FOO) = foo OR tag = bar)
NOT branch = master

括号

(tag =~ ^v) AND (branch = master)
((tag =~ ^v) AND (branch = master))

所有关键字(例如 ANDORNOTINIS、属性和函数名称)不区分大小写。

布尔运算符 #

支持以下布尔运算符

  • AND
  • OR
  • NOT

AND 的绑定优先级高于 ORNOT 的绑定优先级高于 AND。因此,以下表达式相同

branch = master AND os = linux OR tag = bar
(branch = master AND os = linux) OR tag = bar

NOT branch = master AND os = linux
NOT (branch = master) AND os = linux

#

值是不带引号、不包含任何空格或特殊字符的字符串,或者单引号或双引号括起来的字符串

"a word"
'a word'
a_word

相等和不等 #

这将逐字匹配字符串

branch = master
sender != "my bot"
env(foo) = bar
"bar" = env("foo")

正则表达式 #

这使用 Ruby 正则表达式 匹配字符串

branch =~ ^master$
env(foo) =~ ^bar$

如果表达式需要包含空格或以括号结尾,则需要将其括在正斜杠中

branch =~ /(master|foo)/

通常不需要括号(例如,上述备选方案列表也可以仅写为 master|foo)。如果您确实需要以括号结尾的正则表达式,或者如果它包含空格,则整个表达式需要括在正斜杠中。

函数调用 #

有两个可用的函数

  • env
  • concat

函数 env 返回给定环境变量的值

env(FOO)

env 支持在 env 键(包括 env.global)中设置的 .travis.yml 或存储库设置中指定的环境变量。

请注意,没有函数 env.global 或类似函数。相反,所有环境变量都可通过 env 使用。

函数 concat 接受任意数量的参数并将它们连接成单个字符串

concat("foo", "-", env(BAR))
# => "foo-bar"

这也可以在与正则表达式匹配的上下文中使用。例如,对于 env: SERVICE=some-service,以下等效于 branch =~ ^srv-some-service-

branch =~ concat(^srv-,env(SERVICE),-)

列表 #

这将与值的列表(数组)进行匹配

branch IN (master, dev)
env(foo) IN (bar, baz)

请注意,需要使用逗号分隔值。

包含空格或特殊字符的值应加引号

env(foo) IN ("bar baz", "buz bum")

运算符 IN 可以如下否定

# these are the same
NOT branch IN (master, dev)
branch NOT IN (master, dev)

谓词 #

已知谓词为

present
blank
true
false

这要求值存在或不存在

branch IS present
branch IS blank
env(foo) IS present
env(foo) IS blank

运算符 IS 可以如下否定

# these are all the same
env(foo) IS NOT present
NOT env(foo) IS present
env(foo) IS blank

请注意,运算符 IS 旨在与众所周知的谓词 presentblank 一起使用。它等同于 =,并且以下表达式不起作用

# this does not work
branch IS "master"

# instead use =
branch = "master"

但是,IS可以用于与布尔谓词 truefalse 进行匹配(在我们发现许多用户期望此功能有效后,已包含此功能)

branch IS true
branch = true # this is the same

别名 #

以下别名已到位

  • !NOT 的别名
  • &&AND 的别名
  • ||OR 的别名
  • === 的别名
  • ~==~ 的别名

行延续(多行条件): #

我们惊讶地发现用户期望使用 \ 进行行延续,就像在 Ruby 或 Python 中一样。我们喜欢这个想法,因此我们允许以下操作

if: env(PRIOR_VERSION) IS present AND \
    env(PRIOR_VERSION) != env(RELEASE_VERSION) AND \
    branch = master AND \
    type = push

使用 YAML 多行字符串

if: |
  env(PRIOR_VERSION) IS present AND \
  env(PRIOR_VERSION) != env(RELEASE_VERSION) AND \
  branch = master AND \
  type = push

示例 #

仅在 master 分支上构建(请注意,对于 PR,这是基本分支名称)

branch = master

仅当标签名称与给定的正则表达式匹配时构建

tag =~ /^(v1|v2)/

仅当构建类型为 pushpull_request 时才构建

type IN (push, pull_request)

仅当分支名称不属于某些名称时才构建

branch NOT IN (master, dev)

仅当发送者登录名与给定名称匹配时才构建 - 对于包含空格或特殊字符的字符串,请使用引号(发送者是创建构建的 GitHub 用户)

sender = my_account
sender != "deploy bot"

不要在 fork 上构建

fork = false

仅当提交消息不匹配给定的正则表达式时才构建

commit_message !~ /(no-deploy|wip)/

仅在 Linux 上构建

os = linux