条件
此页面记录了现在为默认版本的条件 v1。v0 的文档可以在 此处 找到。
条件可用于通过在构建配置(您的 .travis.yml
文件)中指定条件来过滤和拒绝构建、阶段、作业和通知。有关详细信息,请参阅 条件构建、阶段和作业 和 条件通知。
可以使用 travis-conditions
命令测试条件。请参阅 测试条件。
集成 #
条件使用 此库 进行解析和评估,由接受构建请求并生成构建、阶段和作业的组件进行解析和评估。
以下已知属性可用,并且可以在条件中使用
type
(当前事件类型,已知事件类型为:push
、pull_request
、api
、cron
)repo
(当前存储库的 slugowner_name/name
)branch
(当前分支名称;对于拉取请求:基本分支名称)tag
(当前标签名称)commit_message
(当前提交消息)sender
(事件发送者的登录名)fork
(true
或false
,具体取决于存储库是否为 fork)head_repo
(对于拉取请求:头部存储库的 slugowner_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))
所有关键字(例如 AND
、OR
、NOT
、IN
、IS
、属性和函数名称)不区分大小写。
布尔运算符 #
支持以下布尔运算符
AND
OR
NOT
AND
的绑定优先级高于 OR
,NOT
的绑定优先级高于 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
旨在与众所周知的谓词 present
和 blank
一起使用。它不等同于 =
,并且以下表达式不起作用
# this does not work
branch IS "master"
# instead use =
branch = "master"
但是,IS
可以用于与布尔谓词 true
和 false
进行匹配(在我们发现许多用户期望此功能有效后,已包含此功能)
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)/
仅当构建类型为 push
或 pull_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