应用场景:

通过技术手段保证gitlab中项目某个版本的可用性,当我想发布新版本时随实可以tag出一个可用的版本。与github配套的是travis,使用非常简单,只需要将github账户与travis绑定就可以选择保护的项目及版本,但是要在gitlab上实现类似的功能就只能靠自己来搭建了,今天就来介绍下gitlab-runner是如何工作的。

Gitlab/GitHub使用规范

示意图:

注意事项:

1 Maintainer职责是最重要的,负责代码的review、approve merge、关心test结果,是master代码质量的第一负责人。

2 通过gitlab-runner运行pipeline,可以根据自己的需要编写复杂度不同的pipeline,初期只用在单元测试即可,fork版中的测试环节是非必需的,master版本中的测试环节是必须的。

Runner的实现原理:

示意图:

Runner分为共享型(Shared Runner)和特享型(Specific Runner),因为gitlab项目语言种类和运行环境复杂多样,我们选用Specific Runner型。

Gitlab与Runner的集成:

项目中添加.gitlab-ci文件定义runner要做的事情,tag决定哪个runner来执行。

实现细节:

1 安装gitlab

在centos7上安装最新版本gitlab,我的版本是GitLab Enterprise Edition 11.3.4-ee

#安装依赖:
sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix#安装企业版gitlab
sudo yum -y install gitlab-ee#修改gitlab访问地址和端口号(external_url)
sudo vi /etc/gitlab/gitlab.rb#配置修改生效
sudo gitlab-ctl reconfigure

按照自己配置的external_url去访问gitlab,首次登陆需要设置administrator的密码

2 安装 runner

Runner分为共享型(Shared Runner)和特享型(Specific Runner)两种,共享型可以被gitlab上所有project公用;特享型绑定project只被指定使用。

由于我的业务java、php、python各种语言都有,每条产品线运行环境也存在差异,所以倾向采用Specific Runner

Runner可以安装在独立的vm内,也可以安装在容器内,这里的Specifig Runner我们运行在docker中。

注意:runner不要与gitlab安装在一起,注册发现会有问题。

2.1 准备docker环境

docker的安装以前博文有介绍过,这里不再详解,重点是获取gitlab/gitlab-runner这个image。

2.2 启动gitlab-runner

sudo docker run -d --name gitlab-runner --restart always \-v /srv/gitlab-runner/config:/etc/gitlab-runner \-v /var/run/docker.sock:/var/run/docker.sock \gitlab/gitlab-runner:latest

2.3 注册runner到gitlab

先在gitlab的CI/CD页面找到url和token,如图

#进入容器
sudo docker exec -it gitlab-runner /bin/bash
#容器中完成注册
gitlab-runner register \--non-interactive \--url "http://10.100.129.113:8090" \--registration-token "S1Erstg39-nh1xQVMtBN" \--executor "docker" \--docker-image maven:latest \--description "193runner " \--tag-list "193" \--run-untagged \--locked="false"

重要参数说明:

url和token参考上图,在runner需要对接的gitlab中获得;

executor是runner中pipeline以什么方式运行,这里选择的是docker方式,其实还支持shell等其它方式。

docker-image是runner中pipelne以哪个image为基础来执行executor。

tag-list是runner的tag,在gitlab的project中关于ci的配置文件中会引用得到。

Runner注册成功后就会在gitlab的CI/CD页面看到下图中的红框内容:

如果出现灰色的runner说明runner虽然注册上来但是不可用,当gitlab与runner安装在同一台机器时就会出现这种情况,所以请尽量分开。

3 在gitlab的项目中配置gitlab-ci

在项目根目录下添加.gitlab-ci.yml文件,gitlab-ci很强大,本质就是以yml的格式定义了一个pipeline,与jenkins存在功能重叠的部分,由于我们只是利用runner做项目master版本的单元测试,所以只需要在gitlab-ci中执行maven test。

.gitlab-ci.yml内容如下:

image: maven:lateststages:- testjob_test:stage: testscript:- mvn testtags:
- '193'

4 配置user的权限

限制只有maintainers才可以push和merge项目的master版本

5 测试验证

项目准备 maven-jdk1.8-Junit,可以在我的GitHub中直接下载:https://github.com/yejingtao/runproject.git

验证步骤:

5.1 maintainers直接操作

以maintainers用户直接push,成功,同时触发pipeline。

5.2 developer操做

5.2.1 模拟直接提交

用developer用户clone出runproject项目,直接push,因权限不足失败。

  5.2.2 fork 提交push到自己

Developer用户从runproject项目中fork出自己版本,直接push可以成功,因为他是自己版本的maintainer

5.2.3 发起PR

Developer修改代码并push到自己fork项目后,发起PR

5.2.4 maintainer用户mergePR

Maintainer登陆gitlab后会看到RP通知,有两种merge方式:

下拉列表第一种是Developer自己的fork版本通过pipeline测试后再merge进master版本;第二种是直接merge进master版本。无论选择哪一种,都会触发master版本的一次pipeline。

因为我们的目的只是保证master版本的可用性,所以推荐第二种。

5.2.5 master revert本次操作

如果merge一次PR后pipeline没有通过或者其他形式发现代码不可用,可以在PR页面找到当此PR,执行Revert。

Revert的本质其实就是以老版本重新发起一次PR,所以Revert后也会触发一次pipeline。

6 细节注意:

1 .gitignore中记得要把.gitlab-ci.yml添加进去,不要被随意修改。

2 如果要通过mvn test来做单元测试需要严格按照框架的命名规则,例如Junit默认测试Test结尾的类。

3 Executor Image的选择要给予自己项目的场景,对于Specific Runner由研发自定义docker的image,可以提高执行效率。

Maven的依赖:

每次pipeline利用maven做单元测试时都会重新拉取代码的依赖包,如果有办法利用volume等手段缓存依赖的话可以提高测试效率。

理解了前面的原理,缓存的设置需要做两部份工作:1如何在docker中通过volume让maven的仓库可以直接在宿主机上挂载;2如何在gitlab-ci中进行配置。

volume挂载:

修改/srv/gitlab-runner/config/config.toml文件,我们从前面docker命令-v就可以看得出修改这里其实就是在修改runner容器中注册的问题件,修改如下:

[[runners]]name = "193runner"url = "http://10.100.129.113:8090"token = "327781c1630cef378aa4c62441a4e4"executor = "docker"[runners.docker]tls_verify = falseimage = "maven:latest"privileged = falsedisable_cache = falsevolumes = ["/var/runcache:/cache:rw"]shm_size = 0[runners.cache][runners.cache.s3][runners.cache.gcs]

volumes这一行是关键,把宿主机的/var/runcache目录挂在到maven executor容器的/cache盘符下,并赋予读写权限。

gitlab-ci配置:

在.gitlab-ci.yml中添加如下几行:

variables:MAVEN_OPTS: "-Djava.awt.headless=true -Dmaven.repo.local=./.m2/repository"cache:paths:- ./.m2/repository

对比下优化的效果:

优化前:

优化后:

可以看到效率得到明显的提高,再让我们看下宿主机的/var/runcache中到底有什么:

可以看到/var/runcache/${gitlab_username}/${project_name}/default目录下有个cache压缩文件,解压后里面就是.m2仓库文件了,里面就是项目缓存的依赖包了。

你可以修改项目的pom.xml添加新的依赖,再来这个cache中看下就可以确定自己的猜测了。

gitlab版本问题:

gitlab与runner的版本需要匹配使用,如果版本不匹配会出现runner无法注册、runner注册后无法连接、runner无法运行executor等一系列莫名其妙的错误。

例如我公司由于历史包袱的原因,现在使用的gitlab是企业版8.1,我就在搭建这套环境中吃够了苦头。

1 gitlab-runner是9.0以后的产品,它的前身是gitlab-ci-multi-runner,所以用gitlab-runner是无法注册成为gitlab的runner的,像我的gitlab8.1版本的gitlab-ci-multi-runner对应的是1.8.5版本,下载地址:https://packages.gitlab.com/runner/gitlab-ci-multi-runner/packages/fedora/21/gitlab-ci-multi-runner-1.8.5-1.x86_64.rpm

2 .gitlab-ci.yml中的cache是gitlab8.2版本添加的属性,所以在我公司的版本中会报无法识别的错误,需要去掉。如果你想多个maven的executor之间共享local repository,可以修改config.toml中的volume,把宿主机的一个目录挂到executor的容器中去,然后在config.toml的variables中指定maven的本地仓库,例如:MAVEN_OPTS: "-Djava.awt.headless=true -Dmaven.repo.local=/root/.m2/repository"

Gitlab-Runner原理与实现相关推荐

  1. centos安装Gitlab Runner

    为什么80%的码农都做不了架构师?>>>    参考网站:https://docs.gitlab.com/runner/install/linux-repository.html h ...

  2. gitlab runner 使用案例

    原文:gitlab runner 使用案例 接上文GitLab-Runner 从安装到配置以一个使用案例说明docker runner的使用 1. 配置文件的大概说明 因为gitlab使用的docke ...

  3. Gitlab Cache 原理

    Gitlab cache 机制可以大大加快 CI/CD Job 的执行速度.基础知识可以参看 Gitlab Cache.下面直接总结在 Kubernetes 环境中的三种 Cache 的解决方案. 第 ...

  4. GitLab 简易指引(二):GitLab Runner 安装与配置

    本文为[原创]文章,转载请标明出处. 原文链接:https://weyunx.com/2019/01/23... 原文出自微云的技术博客 准备工作 下载安装包 # Linux x86-64 sudo ...

  5. gitlab 安装gitlabrunner 无法连接tiller_谈一谈GitLab Runner是个什么东东?

    概念 我从官网搜了一下,GitLab Runner 是一个开源项目, 它用来运行你定制的任务(jobs)并把结果返回给 GitLab. GitLab Runner 配合GitLab CI(GitLab ...

  6. 超详细Gitlab Runner环境配置中文教程

    配置GitlabRunner环境 GitLab Runner 是一个开源项目, 它用来运行你定制的任务(jobs)并把结果返回给 GitLab. GitLab Runner 配合GitLab CI(G ...

  7. gitlab runner理解(未完)

    gitlab runner runner: 本身可以使用多种方式安装,比如使用Docker镜像启动. 具体指的是runner运行在哪里 shell runner: docker runner k8s ...

  8. gitlab runner实现自动化部署

    前言 GitLab Runner是一个开源的项目,是用来执行GitLab中的项目的根目录下创建的.gitlab-ci.yml 脚本的工具.GitLab-CI可以比喻成管理工人的工厂,Runner是工厂 ...

  9. 在centos中注册gitlab runner

    注册runner 有几种不同的方式,这里介绍的是在centos7中使用 rpm包来安装 按照gitlab runner的官网链接里面的介绍: gitlab runner 链接 下载 官网描述: ## ...

  10. Gitlab Runner 部署

    Gitlab Runner 部署 文章目录 Gitlab Runner 部署 1. 本地安装gitlab-runner 2. 项目通过本地命令注册runner 3. docker安装gitlab-ru ...

最新文章

  1. 劳动节,这样的自动叠衣服机器人给我来10个
  2. osg着色语言着色_探索数字着色
  3. python表示数字6_Python3 数字Number(六)
  4. 详细解读!Isotropic Remeshing的详细介绍与实现
  5. 基于Modbus TCP-IP协议的WEINVIEW HMI与PC通讯
  6. 十大排序算法——堆排序(C语言)
  7. js切换图片会闪动_javascript 如何实现一个闪烁图片的效果呢?
  8. 二进制文件和文本文件区别-小白笔记
  9. 基于 WinPcap/Npcap 网络桥接与局域网网关
  10. html 滚动条设置透明,iframe 透明 改变iframe滚动条..设置透明
  11. 推挽输出与开漏输出结构和原理详解
  12. jvm内存模型(jdk1.8)
  13. 秋天视频批量生成GIF V1.32
  14. topcoder使用介绍
  15. 系统之家win7系统蓝屏代码0×0000001E的解决方法
  16. Gym 100015A Another Rock-Paper-Scissors Problem
  17. fgetc php,php fgetc函数怎么用
  18. 你真的知道什么是元音什么是辅音吗?
  19. unity游戏开发-简易的状态机
  20. 郭敬明最经典的45句话

热门文章

  1. 用PHP建设网站的优缺点
  2. 解决跨域问题:给谷歌设置允许跨域
  3. ie8兼容性问题(五) event对象、e.target和e.preventDefault
  4. 有时候我们停下来是为了走的更远
  5. excel怎样把一列中有相同的数据编同一个序号,不同商品的序号要递增
  6. 360加固保so动态脱壳
  7. 利用百度地图,实现移动端附近门店功能
  8. 如何打造元宇宙NFT头像?教你玩点新鲜的!
  9. 干货!毫米波雷达超强解读
  10. 从零开发Vscode上传图片插件