接上篇的gitlab ci/cd从零单排,上篇我们介绍了安装和gitlab ci/cd相关的概念
Jobs
.gitlab-ci.yml允许指定无限量jobs。每个jobs必须有一个唯一的名字,而且不能是上面提到的关键字。job由一列参数来定义jobs的行为。
job_name:
script:
- ls
- cd
stage: test
| Keyword | Required | Description |
|---|---|---|
| script | yes | Runner执行的命令或脚本 |
| image | no | 所使用的docker镜像,查阅使用docker镜像 |
| services | no | 所使用的docker服务,查阅使用docker镜像 |
| stage | no | 定义job stage(默认:test) |
| type | no | stage的别名(已弃用) |
| variables | no | 定义job级别的变量 |
| only | no | 定义一列git分支,并为其创建job |
| except | no | 定义一列git分支,不创建job |
| tags | no | 定义一列tags,用来指定选择哪个Runner(同时Runner也要设置tags) |
| allow_failure | no | 允许job失败。失败的job不影响commit状态 |
| when | no | 定义何时开始job。可以是on_success,on_failure,always或者manual |
| dependencies | no | 定义job依赖关系,这样他们就可以互相传递artifacts |
| cache | no | 定义应在后续运行之间缓存的文件列表 |
| before_script | no | 重写一组在作业前执行的命令 |
| after_script | no | 重写一组在作业后执行的命令 |
| environment | no | 定义此作业完成部署的环境名称 |
| coverage | no | 定义给定作业的代码覆盖率设置 |
script
script是Runner执行的yaml脚本。举个例子:
job:
script: "ls"
该参数也可以用数组包含多个命令:
job:
script:
- uname -a
- bundle exec rspec
有时候,script命令需要被单引号或者是双引号包裹起来。举个例子,当命令中包含冒号(:)时,script需要被包在双引号中,这样YAML解析器才可以正确解析为一个字符串而不是一个键值对(key:value)。使用这些特殊字符的时候一定要注意::,{,},[,],,,&,*,#,?,|,-,<,>,=,!。
stage
stage允许一组jobs进入不同的stages。jobs在相同的stage时会parallel同时并发进行。
tags
tags可以从允许运行此项目的所有Runners中选择特定的Runners来执行jobs。
在注册Runner的过程中,我们可以设置Runner的标签,比如build,test。
tags可通过tags来指定Runner来运行jobs:
job:
tags:
- build
- test
上面这个示例中,需要确保构建此job的Runner必须定义了build和test这两个tags。
variables
GItLab CI 允许在.gitlab-ci.yml文件中添加变量,并在job环境中起作用。因为这些配置是存储在git仓库中,所以最好是存储项目的非敏感配置,例如:
variables:
DATABASE:" "
这些变量可以被后续的命令和脚本使用。服务容器也可以使用YAML中定义的变量,因此我们可以很好的调控服务容器。变量也可以定义成任务级别。
Job variables
在job中是可以使用关键字variables来定义job变量。它的运行原理跟全局级别定义的变量是一样的,但是它允许设置特殊的job变量。
当设置了job级别的关键字variables,它会覆盖全局YAML和预定义中的job变量。想要关闭全局变量可以在job中设置一个空数组:
job_name:
variables: []
retry
job:
script:
- ech “hello world”
retry:
max: 1
when: (具体的取值可以查文档)
- script_failure
timeout
1、作业的超时可以大于项目的超时设置,但是不能大于runner的超时设置 2、runner的超时小于项目的超时设置时runner优先于项目 3、runner没设置时候以项目的超时为准 4、runner设置大于项目的超时设置时以项目为准
job:
script:
- echo “hello world”
timeout:
3 hours 10 minutes
---
job:
script:
- echo “hello world”
timeout:
3 h 10 m
parallel
parallel的取值大于2小于50
job:
script:
- echo “hello world”
parallel: 5
only and except
only和except是两个参数用分支策略来限制jobs构建:
only定义哪些分支和标签的git项目将会被job执行。except定义哪些分支和标签的git项目将不会被job执行。
下面是refs策略的使用规则:
only和except可同时使用。如果only和except在一个job配置中同时存在,则以only为准,跳过except(从下面示例中得出)。only和except可以使用正则表达式。only和except允许使用特殊的关键字:branches,tags和triggers。only和except允许使用指定仓库地址但不是forks的仓库(查看示例3)。
在下面这个例子中,job将只会运行以issue-开始的refs(分支),然而except中设置将被跳过。
job:
# use regexp
only:
- /^issue-.*$/
# use special keyword
except:
- branches
在下面这个例子中,job将只会执行有tags的refs,或者通过API触发器明确地请求构建。
job:
# use special keywords
only:
- tags
- triggers
仓库路径只能用于父级仓库执行jobs,而不是forks:
job:
only:
- branches@gitlab-org/gitlab-ce
except:
- master@gitlab-org/gitlab-ce
上面这个例子将会为所有的分支执行job,但master分支除外。
rules
rules允许按顺序评估单个规则,直到匹配并为作业动态提供属性 rules不能和only、except组合使用 可用的规则:
- if(如果条件匹配)
- changes(指定的文件发生变化)
- exists(指定的文件存在)
variables:
DOMAIN: test.com
job:
script:
- echo “hello world”
rules:
- if: '$DOMAIN=="test.com"'
when: manual
_ when: on_success
workflow
- 全局的workflow关键字适用于整个管道,并确定是否创建管道
- when可以设置为always或never,如果未提供则默认是always
variables:
DOMAIN: test.com
workflow:
rules:
- if: '$DOMAIN=="test.com"'
_ when: always