Docker搭建自己的Gitlab CI Runner

目录:

  • Gitlab CI介绍
  • 环境、软件准备
  • 安装、注册并启动Gitlab Runner
  • 定义项目构建流程
  • FAQ

1、Gitlab CI介绍

CI:持续集成,我们通常使用CI来做一些自动化工作,比如程序的打包,单元测试,部署等,这种构建方式避免了打包环境差异引起的错误,提高了工作效率。Gitlab-CI是Gitlab官方提供的持续集成服务,我们可以在仓库的根目录下新建.gitlab-ci.yml文件,自己定义持续集成流程模板,并且在Gitlab中配置runner,在之后的每次提交合并中将会触发构建,并且可以通过Gitlab的hook, 在代码提交的各个环节自动地完成一系列的构建工作,总之对于一些非复杂性的集成需求,都是可以满足的。

2、环境、软件准备

本次演示环境,我是在本机mac上操作,以下是我本地软件及版本:

  1. Git:git version 2.10.1 (Apple Git-78)
  2. Docker: Version 17.03.0-ce-mac1 (15583)
  3. Gitlab: GitLab Community Edition 8.17.4
  4. Gitlab Runner: Version 1.11.2

注意:本次我们使用选择docker作为runner的executor,也或者可以使用docker安装Gitlab Runner,所以我们需要提前安装docker环境。Git是开源的分布式版本控制系统,Gitlab、Runner都需要依赖它,所以我们也需要提前安装好git环境。这里我就忽略git、docker、gitlab的安装过程,着重说下Gitlab CI Runner安装以及如何跑项目构建流程。

3、安装、注册并启动Gitlab Runner

Gitlab Runner安装方式有两种,一种是直接二进制文件安装,一种是基于docker镜像安装。 方式一:二进制文件安装 1)下载对应操作系统的二进制包,我这里使用的是mac版本

sudo curl --output /usr/local/bin/gitlab-runner https://gitlab-ci-multi-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-ci-multi-runner-darwin-amd64

2)给gitlab-runner赋可执行权限

sudo chmod +x /usr/local/bin/gitlab-runner

3)注册runner

# gitlab-runner register

Please enter the gitlab-ci coordinator URL:
# 示例:http://gitlab.alibaba-inc.com/ci
Please enter the gitlab-ci token for this runner:
# xxxxxx
Please enter the gitlab-ci description for this runner:
# 示例:qd_api_runner
Please enter the gitlab-ci tags for this runner (comma separated):
# 示例:hwy
Whether to run untagged builds [true/false]:
# true
Please enter the executor: docker, parallels, shell, kubernetes, docker-ssh, ssh, virtualbox, docker+machine, docker-ssh+machine:
# docker
Please enter the default Docker image (e.g. ruby:2.1):
# maven:3-jdk-8

说明: 1、gitlab ci的地址以及token,从你要配置该runner到哪个项目,就去gitlab下该项目首页右侧设置—》CI/CD Pipelines—》Specific Runners下可以找到。 2、gitlab-ci tags这个很重要,在项目构建流程yaml文件里面指定tag,就是匹配使用哪个tag的runner,这里我定义了hwy,回头再配置文件里面就指定这个tag。 3、executor:执行者可以有很多种,这里我们使用docker,方便构建执行。 4、Docker image:构建Docker image时填写的image名称,根据项目代码语言不同,指定不同的镜像。我这里项目是java语言的,所以我使用官方maven:3-jdk-8镜像。

4)安装并启动gitlab-runner

cd ~
gitlab-runner install
gitlab-runner start

方式二:docker镜像安装

1)拉取gitlab-runner镜像

sudo docker pull gitlab/gitlab-runner:latest

2)添加gitlab-runner container

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

3)注册runner

sudo docker exec -it gitlab-runner gitlab-ci-multi-runner register

注册过程略,方式同方式一步骤3.

方式一和方式二,若是runner注册成功,此时到我们项目首页右侧设置—》CI/CD Pipelines—》Runners activated for this project就可以看到我们刚注册的qd_api_runner了。如图:

4、定义项目构建流程

项目的构建流程是由项目根目录的.gitlab-ci.yml文件控制的,关于gitlab-ci详细的配置文档可以查看 这里 , 以下是一个简单的Java Maven项目的例子.gitlab-ci.yml:

image: maven:3-jdk-8

test:
  stage: test
  script: 
    - mvn test
  tags:
    - hwy

我们提交该文件到gitlab对应项目上去。

git add .gitlab-ci.yml
git commit -m "Add .gitlab-ci.yml"
git push origin develop

这个时候,我们从该项目的Pipelines选项卡下可以看到,有正在运行的刚新建的hwy的这个runner的pipelines了。点击进去可以看到控制台实时输出日志。如图:

上面是一个简单的demo实例,一个pipeline只有一个job的类型,一般我们CI都是有好几步组成,比如java项目,我们先build打包一下,如果成功了在执行一下test,最后我们deploy到机器上。像多步操作的流程,我们可以配置yml文件,分解为多个job,来依次执行。例如下边这个.gitlab-ci.yml文件:

image: maven:3-jdk-8

stages:
  - build
  - test
  - deploy

job_build:
  stage: build
  script:
    - mvn clean install
  only:
    - develop
  tags:
    - hwy

job_test:
  stage: test
  script:
    - mvn test
  tags:
    - hwy

job_deploy:
  stage: deploy
  script:
    - echo "deploy over..."
  tags:
    - hwy

说明:这个yml文件就是有3个job组成,依次为build、test、deploy。在执行这个CI流程时候,会分解成3个job依次执行。这里tags: hwy就是指定使用哪个runner来执行这个job,我们也可以执行其他已注册可用的runner。详细gitlab pipline流程截图如下:

FAQ

  1. 注册gitlab-runner时,提示报错: GitLab Runner >= 9.0 can be used ONLY with GitLab CE/EE >= 9.0 这个因为默认gitlab runner安装时最新版的,与我们正在使用的gitlab版本不匹配,那么我们找到匹配的gitlab-runner版本安装即可,从这里我们可以找到 Runner和GitLab CE / EE兼容性列表
  2. 有时runner会连接不上,或者在项目仓库->设置->runner里呈灰色,这有可能是runner机器上没有启动gitlab-runner引起的,可以执行ps -ef | grep gitlab看看是否存在gitlab-runner的进程,如果没有则执行gitlab-runner start 命令启动runner服务。
  3. 若已经配置好了gitlab-runner了,执行commit,pipeline状态一直是pending,并且提示: This build is stuck, because the project doesn't have any runners online assigned to it. Go to Runners page 这个是因为未找到对应的runner导致的,原因一是有可能gitlab-runner注册失败,原因二有可能是.gitlab-ci.yml配置文件里面tags没有匹配到已注册可用的runner。
  4. 每次maven:3-jdk-8去执行build和test都会重新拉取镜像,下载依赖的jar包,比较耗时耗资源。这是因为docker image每次构建都是在独立的container里, maven的 .m2文件并不会被多次构建公用,这里我们可以通过修改gitlab-runner的配置,将maven .m2目录加到volumes中,并增加镜像拉取规则(默认是从远程拉取镜像,这里修改为优先获取本地镜像,不存在时才去远程拉取镜像)。 # gitlab-runner list Listing configured runners ConfigFile=/Users/wanyang3/.gitlab-runner/config.toml qd_api_runner Executor=docker Token=xxxxxx URL=http://gitlab.alibaba-inc.com/ci # vim /Users/wanyang3/.gitlab-runner/config.toml [[runners]] ... [runners.docker] ... volumes = ["/cache","/Users/wanyang3/.m2:/root/.m2"] pull_policy = "if-not-present" ... # gitlab-runner restart 修改配置完成后,记得要重启gitlab-runner。

参考资料:

  1. gitlab-runner 安装
  2. gitlab ci yaml 配置
  3. gitlab-ci-multi-runner 详情

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏linux运维学习

linux学习第六十一篇:主动模式和被动模式,添加监控主机,添加自定义模板,处理图形中的乱码,自动发现

主动模式和被动模式 主动或者被动是相对客户端来讲的 被动模式,服务端会主动连接客户端获取监控项目数据,客户端被动地接受连接,并把监控信息传递给服务端 主动模式,...

2885
来自专栏嵌入式程序猿

freeRTOS事件组学习

像其他RTOS一样,freeRTOS同样有对事件标志位的创建和处理,在中断中可以通过事件组传递信息给其他的任务,那么如何创建事件组呢? 要使用创建Event的A...

3426
来自专栏小轻论坛

神秘的C盘里面装了什么?能不能删?

相信大家刚刚接触电脑时,都会被提醒“你可千万别动C盘!”点开一看,密密麻麻的文件夹让人不知所云,也听说过删除C盘文件出现过各种问题的事情,当然,还有很多文件是你...

961
来自专栏Gaussic

使用IntelliJ IDEA开发SpringMVC网站(一)开发环境 顶

访问GitHub下载最新源码:https://github.com/gaussic/SpringMVCDemo

1051
来自专栏三丰SanFeng

history命令使用方法详解

history是一条非常实用的shell命令,可以显示出之前在shell中运行的命令,配合last显示之前登录的用户,就可以追溯是哪个用户执行了某些命令。以下详...

1727
来自专栏散尽浮华

kvm虚拟化管理平台WebVirtMgr部署-完整记录(1)

公司机房有一台2U的服务器(64G内存,32核),由于近期新增业务比较多,测试机也要新增,服务器资源十分有限。所以打算在这台2U服务器上部署kvm虚拟化,虚出多...

32010
来自专栏电光石火

RXTX for JAVA 串口通信

RXTX 的下载可以到官网或者Fizzed,官网发现并没有64位的支持,但是在Fizzed中找到的2.2版的64,32的windows和Linux版本http:...

2059
来自专栏电光石火

RXTX for JAVA 串口通信

RXTX 的下载可以到官网或者Fizzed,官网发现并没有64位的支持,但是在Fizzed中找到的2.2版的64,32的windows和Linux版本http:...

2128
来自专栏云计算教程系列

如何在Ubuntu 14.04上使用Hexo创建博客

Hexo是一个基于Node.js的静态博客框架。使用Hexo,您可以以博客文章的形式发布Markdown文档。博客帖子和内容被处理并转换为HTML / CSS,...

950
来自专栏杨建荣的学习笔记

Linux命令ssh-copy-id (r10笔记第21天)

在N多年前,搭建Oracle RAC环境的时候,其中有一项非常艰巨的任务就是配置节点服务器的互信关系,每次到了这个部分的时候就有点晕,因为文件需要在两个节点间...

3275

扫码关注云+社区