十五年测试老手,长期负责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 ,可查看快速引导51Testing软件测试网O(_9m&x)Z1H0LS I

.gitlab-ci.yml

从7.12版本开始,GitLab CI使用YAML文件(.gitlab-ci.yml)来管理项目配置。该文件存放于项目仓库的根目录,它定义该项目如何构建。51Testing软件测试网H;d`oc p'O.R;W:H

开始构建之前YAML文件定义了一系列带有约束说明的任务。这些任务都是以任务名开始并且至少要包含script部分:

w,Yg%Da`5wRt0
job1:
  script. "execute-script-for-job1"
  
job2:
  script. "execute-script-for-job2"

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

XA'B}$Y0M{,h0

script可以直接执行系统命令(例如:./configure;make;make install)或者是直接执行脚本(test.sh)。51Testing软件测试网~8ahl!d(e#p ~"s

任务是由Runners接管并且由服务器中runner执行。更重要的是,每一个任务的执行过程都是独立运行的。51Testing软件测试网F!ZHO7C\

用下面这个例子来说明YAML语法还有更多复杂的任务:

c hZ f"kz0
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名称:

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

image和services

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

X;L?5a7z|O!U0

before_script

before_script用来定义所有job之前运行的命令,包括deploy(部署) jobs,但是在修复artifacts之后。它可以是一个数组或者是多行字符串。51Testing软件测试网r7AI.h2E!b1@/z

after_script

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

after_script用来定义所有job之后运行的命令。它必须是一个数组或者是多行字符串51Testing软件测试网t0s'NZ^ra

stages

stages用来定义可以被job调用的stages。stages的规范允许有灵活的多级pipelines。51Testing软件测试网(k+`H3CO

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

,cz_ jX4|O_-^0
1. 相同stage的job可以平行执行。
2. 下一个stage的job会在前一个stage的job成功后开始执行。

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

FK6dY'^0
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都不会执行。

这有两个特殊的例子值得一提:51Testing软件测试网B-KU Dl ZQ

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

types

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

stages同义

\6eW3A+S#} Z0

variables

GitLab Runner V0.5.0. 开始引入

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

O9c0g&F#Z0
variables:
  DATABASE_URL:"postgres://postgres@postgres/my_database"

这些变量可以被后续的命令和脚本使用。服务容器也可以使用YAML中定义的变量,因此我们可以很好的调控服务容器。变量也可以定义成job level51Testing软件测试网Mx Ue-Y%{!Q"l%]

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

`L b B7aOF0

更多关于variables51Testing软件测试网 GP ESK,D_d

cache

Gitlab Runner v0.7.0 开始引入。

cache用来指定需要在job之间缓存的文件或目录。只能使用该项目工作空间内的路径。51Testing软件测试网7fa.sNA&Hy7i)t

从GitLab 9.0开始,pipelines和job就默认开启了缓存51Testing软件测试网SJP~3M3c"l

如果cache定义在jobs的作用域之外,那么它就是全局缓存,所有jobs都可以使用该缓存。

d%N"l f;`9[S+]Q#k0

缓存binaries.config中的所有文件:51Testing软件测试网9d5P#tR;q!wI)c^%}OQ

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

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

V ~;C b%b*@9j2G0
rspec:
  script. test
  cache:
    untracked: true

缓存binaries下没有被git跟踪的文件:51Testing软件测试网6C7T a}_0O

rspec:
  script. test
  cache:
    untracked: true
    paths:
    - binaries/

job中优先级高于全局的。下面这个rspecjob中将只会缓存binaries/下的文件:51Testing软件测试网5I,q&\ W~AO c Fb+O

cache:
  paths:
  - my/files

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

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

0h:c8O{x3g0

缓存只是尽力而为之,所以别期望缓存会一直存在。查看更多详细内容,请查阅GitLab Runner。

4O Z&JS"k0

缓存key

GitLab Runner v1.0.0 开始引入。

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

它也可以让你很好的调整缓存,允许你设置不同jobs的缓存,甚至是不同分支的缓存。

{&U#D1P(A Ja*v0

cache:key可以使用任何的预定义变量51Testing软件测试网'L'Q5tLl|5l

默认key是默认设置的这个项目缓存,因此默认情况下,每个pipelines和jobs中可以共享一切,从GitLab 9.0开始。

3? xn~V)pJ0

配置示例

WlQ&w.` Z k0

缓存每个job:

5g/vz;V9L2@O$G0
cache:
  key: "$CI_JOB_NAME"
  untracked: true

缓存每个分支:51Testing软件测试网 f2]buVK\Q~

cache:
  key: "$CI_COMMIT_REF_NAME"
  untracked: true

缓存每个job且每个分支:

W"_)a.^{R!l0
cache:
  key: "$CI_JOB_NAME/$CI_COMMIT_REF_NAME"
  untracked: true

缓存每个分支且每个stage:51Testing软件测试网w$b1F"di"v,`pb

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

如果使用的Windows Batch(windows批处理)来跑脚本需要用%替代$51Testing软件测试网7_ d B1[A:\(~ R#T

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

Jobs

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

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

我来说两句