近期因为折腾gitlab-ci,专门去翻了很多文档,想想貌似自己挺傻的。按照官网教程本来biubiubiu就弄好了,非自己折腾了好几天,还没啥积累,真是作。想想唯一能积累的就是ci的配置详解了。

该文基于最新版GitLab Community Edition 10.1.1和GitLab Runner9.5.1-1


使用.gitlab-ci.yml配置你的项目

这篇文档描述了.gitlab-ci.yml的用法,本文件是被gitlab runner用于管理你的项目任务。

如果你想要快速查看Gitlab CI的介绍,请点击这里 快速开始向导

.gitlab-ci.yml

从版本7.12开始,GitLab CI使用YAML文件(.gitlab-ci.yml)对你的项目进行配置。该文件放置在你项目的根目录下,并且包涵了你的项目如何被编译的描述语句。

YAML文件使用一系列约束叙述定义了“任务”启动时所要做的事情。“任务”被定义为具名的顶级元素,并且至少包括一条脚本语句:

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

上面的例子是两个在ci中能起作用的最简单的,分离的任务,每一个任务执行一条不同的命令。

当然了,一条命令会立即在克隆的仓库中执行一句语句(例如:./configure;make;make install)或者启动一个脚本(例如test.sh)

任务会被Runners拿到并在Runner的环境下被执行。重要的是,每个任务将会独立进行,与其他任务分离开来。

YAML语法允许我们使用更复杂的任务声明,例如下面的例子:

# docker镜像
image: ruby:2.1
# 依赖的docker服务
services:- postgres
# 开始执行脚本前所需执行脚本
before_script:- bundle install
# 脚本执行完后的钩子,执行所需脚本
after_script:- rm secrets
# 该ci pipeline适合的场景
stages:- build- test- deploy
# 定义的任务1
job1:# 场景为构建stage: build# 所需执行的脚本script:- execute-script-for-job1# 在哪个分支上可用only:- master# 指定哪个ci runner跑该工作tags:- docker

以下是一些不可被用于任务名的保留字:

关键字 是否必须 描述
image no 使用的docker镜像,
services no 使用的docker服务,
stages no 定义构建场景
types no stages的别名(不赞成使用)
before_script no 定义每个任务的脚本启动前所需执行的命令
after_script no 定义每个任务的脚本执行结束后所需执行的命令
variables no 定义构建变量
cache no 定义哪些文件需要缓存,让后续执行可用

image and services

这两个选项允许我们指定任务运行时所需的自定义的docker镜像和服务,这两个选项的配置在以下文档中有涉及

before_script

before_script是用于定义一些在所有任务执行前所需执行的命令, 包括部署工作(但是是在job环境手动恢复之后执行)。可以接受一个数组或者多行字符串。

after_script

在GitLab 8.7引进,需要GitLab Runner v1.2以上的版本

after_script用于定义所有job执行过后需要执行的命令. 可以接受一个数组或者多行字符串。

注意: before_scriptscript在一个上下文中是串行执行的,after_script是独立执行的,所以根据执行器(在runner注册的时候,可以选择执行器,docker,shell,blabla...)的不同,工作树之外的变化可能不可见,例如,在before_script中执行软件的安装。

注意:你可以在任务中定义before_script,after_script,也可以将其定义为顶级元素,定义为顶级元素将为每一个任务都执行相应阶段的脚本或命令

stages

stages是用于定义场景阶段,可以被任务所使用用于定义所属场景阶段。stages的允许定义多个,灵活的场景阶段的pipline。

stages定义的元素的顺序决定了任务执行的顺序:

1.任务指定的stage名相同,该多个任务将并行执行(但是经过测试,貌似也是按照A-Z的头字母顺序顺序执行的。。只是GitLab-UI上看着是并行。。。)
2.下一个场景阶段的任务将会在前一个场景阶段的任务都完成的情况下执行

让我们来思考一下下面的例子,下面的例子定义了3个场景阶段:

stages:- build- test- deploy

1.首先, 所有build场景的任务将被并行执行.
2.如果所有build场景的任务都成功了, test场景的所有任务将会并行执行.
3.如果所有test场景的任务都成功了, depoly场景的所有任务将会执行.
4.如果所有depoly场景的任务都成功了, 提交将会标记为成功.
5.如果其中某一步场景某一个任务失败了, 那么提交将会被标记为失败,并且之后的场景和任务将不会执行.

这里也有两种边缘情况值得一说:

  1. 如果在.gitlab-ci.yml中没有定义stages,build、test、deploy将是任务可设定的场景阶段的默认值.
  2. 如果一个任务没有指定场景阶段,该任务将会默认为test场景阶段,

types

不赞成使用,在未来的发行版中将会被移除,请使用stages代替

为stages的别名

variables

由GitLab Runner v0.5.0引入

GitLab CI允许你为.gitlab-ci.yml增加变量,该变量将会被设置入任务环境。这些变量是你存储在git仓库里,并且非敏感的项目配置,例如:

variables:DATABASE_URL: "postgres://postgres@postgres/my_database"

注意:整数和字符串一样,对于设置变量名和变量值来说都是合法的。但浮点数是非法的。

这些变量在之后的所有命令和脚本中都能使用。并且YAML文件定义的变量同样会被设置到所有被用户创建的服务容器里。重要的是,变量也可以定义在一个任务级别中

job1:variables:STATIC_PATH: "./"

除了用户定义的变量,你的运行环境中也有一些由Runner射只的变量,其中一个例子是 CI_COMMIT_REF_NAME变量,该变量的值表示了正在构建的项目的分支或者标签名。除了用户设置的变量之外,gitlab的ui也能设置一些“秘密变量”。详细见文档【variables】

cache

注意:

  • 由gitlab runner v0.7.0引入
  • 在GitLab 9.2之前,缓存将会在artifacts被下载之后(artifacts详见配置详解二)被重置
  • 在此之后,缓存将会在artifacts被下载之前被重置

cache用于指定一些需要在任务间进行缓存的文件和目录,你只能使用项目工作空间内的路径来指定缓存。下面是一个例子

stages:- pre_build- build
cache:key: ${CI_BUILD_REF_NAME}paths:- node_modules/
pre_build:stage: pre_buildscript:- npm install

在GitLab9.0以后,我们默认启用了pipelines和jobs之间的缓存共享!

如果cache定义在jobs的作用域外(就是做为顶级元素),则这意味着这个设置是全局的,所有任务都会使用该定义(使用的意思是Checking cache for default,
Successfully extracted cache。从默认缓存存储位置拉取缓存)。

缓存binaries和.config下的所有文件(我实验过了,缓存定义在job里,1个是没有用的,两个job定义了相同的缓存,他们才会从 default cache path 里被找到)

rspec:script: testcache:paths:- binaries/- .config

缓存所有未追踪的文件:

rspec:script: testcache:untracked: true

缓存binaries文件夹和所有未追踪的文件

rspec:script: testcache:untracked: truepaths:- binaries/

使用任务中的缓存重写全局设置,下面的rspec任务只会缓存binaries文件夹

cache:paths:- my/filesrspec:script: testcache:key: rspecpaths:- binaries/

注意,当缓存被任务共享的时候,如果你在不同任务里用了不同路径,你需要设置一个不同的缓存键值,防止缓存内容被覆盖。

缓存嗯,经过了优化,所以请不要期望缓存一直存在。更加详细的缓存实现细节,请查看GitLabRunner

cache:key

自GitLab RunnerV1.0.0被引入


key指令允许用户定义缓存的亲和性(作用域?实验过基本就是指缓存所作用的区域),key值定义的位置,可以让单个缓存适应所有的任务,也可以让单个缓存适应每一个任务,也可以让单个缓存适应每一个分支,或者是任何地方,你觉得合适的。

cache:key变量可以使用任何runner预定义的变量

从GitLab9.0开始,key的默认值是默认为整个项目,因此在默认下,所有的缓存都会被所有pipline和job共享~

注意:cache:key变量不能包含/字符

配置示例

允许job共用缓存(经过测试,如果key名称设置为job,那么不同分支不同job都适用该cache策略)

cache:key: "$CI_JOB_NAME"untracked: true

允许每个分支共用缓存(相同分支使用同一份缓存,实验通过):

cache:key: "$CI_COMMIT_REF_NAME"untracked: true

允许每个分支的每个任务共用缓存:

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

允许每个分支的每个阶段共用缓存

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

window下请用%替换¥,powershell下用$env:替换$

cache:policy

gitlab9.4引入

该项是指,一个缓存任务在执行开始前按计划下载文件的默认行为,在执行结束后按计划重新上传。这个选项允许job中造成的改变持久化,并被运用于后来的运行中。所以该项被誉为pull-push的缓存策略。(没试过,不造是啥)

如果你清楚的知道,你所执行的job不会修改已经缓存的文件夹,你可以通过在job中声明policy:pull设置跳过缓存上传过程。(通常,该设置将伴随着一个在早期做了普通缓存工作的job,以确保缓存存在,并有效)

stages:- setup- testprepare:stage: setupcache:key: gemspaths:- vendor/bundlescript:- bundle install --deploymentrspec:stage: testcache:key: gemspaths:- vendor/bundlepolicy: pullscript:- bundle exec rspec ...

这样的设置会加速job执行速度,并且减少向缓存服务器的请求,特别是当你有大量缓存任务并行执行的时候。

此外,如果你有一个job无条件性的重新创造了一个没有前文引用的缓存,你可以在job中使用policy: push 去跳过下载阶段

gitlab-ci配置详解(一)
gitlab-ci配置详解(二)

资料

centos7简单安装gitlab-ce/ee(官网quick start)
GitLab简明安装指南
GitLab设置stmp发件
postfix mail command not find
gitLab修改默认端口
GitLab使用已有的nginx服务
GitLab-CI与GitLab-Runner
GitLab-Runner官方文档
基于Gitlab CI搭建持续集成环境
如何汉化GitLab
非GitLab集成包手装GitLab
GitLab从安装到差点放弃

gitlab-ci配置详解(一)相关推荐

  1. vscode中setting.json配置详解

    vscode中的setting.json配置文件配置详解 话不多说上配置文件 大家按需复制到自己的setting.json配置文件中即可 [{// 控制是否在编辑器中显示 CodeLens." ...

  2. Gitlab搭建教程详解

    Gitlab搭建教程详解   拟 制 人: 完成日期:2017-05-11 审 核 人: 审核日期: 修改记录 名称 版本号 拟制人/ 修改人 拟制/修改日期 更改理由 主要更改内容 (写要点即可) ...

  3. Tacacs-服务搭建与配置详解

    其他文章: Tacacs+协议原理 Tacacs+服务搭建与配置详解 Tacacs+各厂商交换机配置 Tacacs+协议交互报文抓包示例 简介 tac_plus是TACACS +守护程序.它为网络设备 ...

  4. elasticsearch-.yml(中文配置详解)

    此elasticsearch-.yml配置文件,是在$ES_HOME/config/下 elasticsearch-.yml(中文配置详解) # ======================== El ...

  5. (ASA) Cisco Web ××× 配置详解 [三部曲之一]

    (ASA) Cisco Web ××× 配置详解 [三部曲之一] 注意:本文仅对Web×××特性和配置作介绍,不包含SSL ×××配置,SSL ×××配置将在本版的后续文章中进行介绍.   首先,先来 ...

  6. mybatis 同名方法_MyBatis(四):xml配置详解

    目录 1.我们将 数据库的配置语句写在 db.properties 文件中 2.在 mybatis-configuration.xml 中加载db.properties文件并读取 通过源码我们可以分析 ...

  7. logback节点配置详解

    logback节点配置详解 一:根节点 <configuration></configuration> 属性 : debug : 默认为false ,设置为true时,将打印出 ...

  8. PM配置详解之一:企业结构

    1.维护计划工厂 功能说明 在公司结构中定义维护工厂(通常已经作为后勤工厂存在)和维护计划工厂(简称计划工厂). 维护工厂:设备所安装的位置,如某机组安装在合营公司,那么合营公司就是此机组的维护工厂, ...

  9. 转 Log4j.properties配置详解

    一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使 ...

最新文章

  1. 关于C# WebService的一些看法
  2. 利用vagrant快速搭建rails开发环境
  3. 标记页面区分渠道php,PM必懂的前端知识
  4. 「3D Object Detection」Lidar Part : First Taste
  5. python3.4 pip必须升级python3.5_在ubuntu上将python3.4升级到python3.6会破坏pip
  6. LeetCode 370. 区间加法(差分思想)
  7. iostream.h和iostream 区别
  8. microsoft visual c++与microsoft visual net 版本对应关系
  9. ubuntu下取代ping的好工具tcpping
  10. 固态硬盘用软件测试温度高,硬盘温度过高的原因,固态硬盘温度过高-
  11. 漂亮有创意的思维导图模板下载教程,教你思维导图怎么画
  12. 微商怎么做大做强,教你一套做微商全新打法
  13. Snagit 2019 快速截图
  14. cdcq原创题--pcr技术
  15. Atitit 圣阿提拉克斯阿克巴仁波切诗歌集 1. 诗歌集分类 1 1.1. 国王颂歌 1 1.2. 爱情类(相逢 赞美 相识 思念 离去 分分离离 忘记) 1 1.3. 其他 1 1.4. 大
  16. SQL手工注入笔记1
  17. Token登录验证(附图)
  18. 看守所里的信息化故事:刘所家的新地毯
  19. Bootstrap【第二章】全局CSS之排版代码表格
  20. int,Uint,uint16的区别及用处

热门文章

  1. 第六周作业(等值字串,KMP匹配,大整数相乘,最长公共子串,判断两个字符串是否匹配,最长回文子串,年号字串)
  2. 图像金字塔的简单理解
  3. 强引用,软引用,弱引用,虚引用
  4. Adobe illustrator 输入数学平方公式
  5. 计算机基础 CMOS
  6. JKD 下载、安装、配置
  7. SpringBoot从入门到精通教程(三十一)- 爬虫框架集成
  8. notifyDataSetInvalidated()和notifyDataSetChanged()的区别
  9. 操作系统中pv操作用c语言,操作系统-pv操作.doc
  10. 程序员遇到 Bug 时的 30 个反应,你是哪一种?