十五年测试老手,长期负责WEB\APP 项目测试,目前主要负责团队管理工作。

Gitlab CI yaml配置文件详解

上一篇 / 下一篇  2020-07-04 11:58:03 / 个人分类:持续集成

文章来源
  • 文章来源:【转载】

通过 .gitlab-ci.yml配置任务

git仓库:https://github.com/Fennay/git...

此文档用于描述.gitlab-ci.yml语法,.gitlab-ci.yml文件被用来管理项目的runner 任务。
如果想要快速的了解GitLab CI ,可查看快速引导

d S;l7B)\pR(~#r^0

.gitlab-ci.yml

从7.12版本开始,GitLab CI使用YAML文件(.gitlab-ci.yml)来管理项目配置。该文件存放于项目仓库的根目录,它定义该项目如何构建。

#SIgG OOQ{"Z0

开始构建之前YAML文件定义了一系列带有约束说明的任务。这些任务都是以任务名开始并且至少要包含script部分:51Testing软件测试网f-UzJ,DPB\.c/V.w

job1:
  script. "execute-script-for-job1"
  
job2:
  script. "execute-script-for-job2"

上面这个例子就是一个最简单且带有两个独立任务的CI配置,每个任务分别执行不同的命令。

#|td3_k|0

script可以直接执行系统命令(例如:./configure;make;make install)或者是直接执行脚本(test.sh)。51Testing软件测试网1Q_ g-P)N

任务是由Runners接管并且由服务器中runner执行。更重要的是,每一个任务的执行过程都是独立运行的。51Testing软件测试网-I3D/^]8_g3M:w

用下面这个例子来说明YAML语法还有更多复杂的任务:51Testing软件测试网 PgU*e+St

image: ruby:2.1
services:
  - postgres

before_script. - bundle install

after_script. - rm secrets

stages:
  - build
  - test
  - deploy

job1:
  stage: build
  script. - execute-script-for-job1
  only:
    - master
  tags:
    - docker

下面列出保留字段,这些保留字段不能被定义为job名称:51Testing软件测试网A!D9m&p4\T/k-[

关键字是否必须描述
image用于docker镜像,查看docker文档
services用于docker服务,查看docker文档
stages定义构建阶段
typesstages 的别名(已废除)
before_script定义在每个job之前运行的命令
after_script定义在每个job之后运行的命令
variable定义构建变量
cache定义一组文件列表,可在后续运行中使用

image和services

这两个关键字允许使用一个自定义的Docker镜像和一系列的服务,并且可以用于整个job周期。详细配置文档请查看a separate document

3j7B k mk2c0

before_script

before_script用来定义所有job之前运行的命令,包括deploy(部署) jobs,但是在修复artifacts之后。它可以是一个数组或者是多行字符串。

S(f Qnw(O"Ew0

after_script

GitLab 8.7 开始引入,并且要求Gitlab Runner v1.2

after_script用来定义所有job之后运行的命令。它必须是一个数组或者是多行字符串

+U(YU]PAqEo V0

stages

stages用来定义可以被job调用的stages。stages的规范允许有灵活的多级pipelines。

/Y"jLsW0

stages中的元素顺序决定了对应job的执行顺序:

nn:T)G!L(b7MQ!K0
1. 相同stage的job可以平行执行。
2. 下一个stage的job会在前一个stage的job成功后开始执行。

接下仔细看看这个例子,它包含了3个stage:

OY h;iKb0
stages:
 - build
 - test
 - deploy
  1. 首先,所有build的jobs都是并行执行的。
  2. 所有build的jobs执行成功后,test的jobs才会开始并行执行。
  3. 所有test的jobs执行成功,deploy的jobs才会开始并行执行。
  4. 所有的deploy的jobs执行成功,commit才会标记为success
  5. 任何一个前置的jobs失败了,commit会标记为failed并且下一个stages的jobs都不会执行。

这有两个特殊的例子值得一提:

M@4ZD.a)Z KC]0
  1. 如果.gitlab-ci.yml中没有定义stages,那么job's stages 会默认定义为 buildtest 和 deploy
  2. 如果一个job没有指定stage,那么这个任务会分配到test stage。

types

已废除,将会在10.0中移除。用stages替代。

stages同义51Testing软件测试网]Z!O,X2N9z L%{J

variables

GitLab Runner V0.5.0. 开始引入

GItLab CI 允许在.gitlab-ci.yml文件中添加变量,并在job环境中起作用。因为这些配置是存储在git仓库中,所以最好是存储项目的非敏感配置,例如:

Y.WR^E6x(o:b,g0
variables:
  DATABASE_URL:"postgres://postgres@postgres/my_database"

这些变量可以被后续的命令和脚本使用。服务容器也可以使用YAML中定义的变量,因此我们可以很好的调控服务容器。变量也可以定义成job level

S%A]db&@7k0

除了用户自定义的变量外,Runner也可以定义它自己的变量。CI_COMMIT_REG_NAME就是一个很好的例子,它的值表示用于构建项目的分支或tag名称。除了在.gitlab-ci.yml中设置变量外,还有可以通过GitLab的界面上设置私有变量。

1Wb:ZfBj:Q1K8V,h0

更多关于variables

3z|} ]`^0

cache

Gitlab Runner v0.7.0 开始引入。

cache用来指定需要在job之间缓存的文件或目录。只能使用该项目工作空间内的路径。51Testing软件测试网 tr~ QV wk

从GitLab 9.0开始,pipelines和job就默认开启了缓存51Testing软件测试网r"^]'V K8lj+m8N

如果cache定义在jobs的作用域之外,那么它就是全局缓存,所有jobs都可以使用该缓存。51Testing软件测试网%I4}me6ncV

缓存binaries.config中的所有文件:

8k&Xk_YZAqJ$I0
rspec:
  script. test
  cache:
    paths:
    - binaries/
    - .config

缓存git中没有被跟踪的文件:

P%y v^&n,^"r9e!^9M0
rspec:
  script. test
  cache:
    untracked: true

缓存binaries下没有被git跟踪的文件:

tdw"\J*v9ZO _0
rspec:
  script. test
  cache:
    untracked: true
    paths:
    - binaries/

job中优先级高于全局的。下面这个rspecjob中将只会缓存binaries/下的文件:51Testing软件测试网&i%? c*jV ]0v.f

cache:
  paths:
  - my/files

rspec:
  script. test
  cache:
    key: rspec
    paths:
    - binaries/

注意,缓存是在jobs之前进行共享的。如果你不同的jobs缓存不同的文件路径,必须设置不同的cache:key,否则缓存内容将被重写。

if W|5bs0

缓存只是尽力而为之,所以别期望缓存会一直存在。查看更多详细内容,请查阅GitLab Runner。51Testing软件测试网)p)r8vk.bY7F%e

缓存key

GitLab Runner v1.0.0 开始引入。

key指令允许我们定义缓存的作用域(亲和性),可以是所有jobs的单个缓存,也可以是每个job,也可以是每个分支或者是任何你认为合适的地方。

Q%|vMW W0

它也可以让你很好的调整缓存,允许你设置不同jobs的缓存,甚至是不同分支的缓存。51Testing软件测试网 w#I'o_i

cache:key可以使用任何的预定义变量51Testing软件测试网 SR_:Q~5p

默认key是默认设置的这个项目缓存,因此默认情况下,每个pipelines和jobs中可以共享一切,从GitLab 9.0开始。51Testing软件测试网kb`A.e'b

配置示例51Testing软件测试网.}!t*}3TN5R1Tn

缓存每个job:51Testing软件测试网3j:r0vk4] { V

cache:
  key: "$CI_JOB_NAME"
  untracked: true

缓存每个分支:

Os8A)dMg0
cache:
  key: "$CI_COMMIT_REF_NAME"
  untracked: true

缓存每个job且每个分支:51Testing软件测试网9f;rBb(i;y J{vn

cache:
  key: "$CI_JOB_NAME/$CI_COMMIT_REF_NAME"
  untracked: true

缓存每个分支且每个stage:51Testing软件测试网7s LI{rd2Qu-A

cache:
  key: "$CI_JOB_STAGE/$CI_COMMIT_REF_NAME"
  untracked: true

如果使用的Windows Batch(windows批处理)来跑脚本需要用%替代$

@|&k$?.b0
cache:
  key: "%CI_JOB_STAGE%/%CI_COMMIT_REF_NAME%"
  untracked: true

Jobs

.gitlab-ci.yml允许指定无限量jobs。每个jobs必须有一个唯一的名字,而且不能是上面提到的关键字。job由一列参数来定义jobs的行为。51Testing软件测试网+zM X_n Qd

job_name:
  script. - rake spec
    - coverage
  stage: test
  only:
    - master
  except:
    - develop
  tags:
    - ruby
    - postgres
  allow_failure: true
KeywordRequiredDescription
scriptyesRunner执行的命令或脚本
imageno所使用的docker镜像,查阅使用docker镜像
servicesno所使用的docker服务,查阅使用docker镜像
stageno定义job stage(默认:test
typenostage的别名(已弃用)
variablesno定义job级别的变量
onlyno定义一列git分支,并为其创建job
exceptno定义一列git分支,不创建job
tagsno定义一列tags,用来指定选择哪个Runner(同时Runner也要设置tags)
allow_failureno允许job失败。失败的job不影响commit状态
whenno定义何时开始job。可以是on_successon_failurealways或者manual
dependencies

TAG: gitlab

 

评分:0

我来说两句