基于 Docker 搭建 Gitlab + Jenkins 实现 CI/CD 持续集成

概述

目前在南京一公司做Java后端实习生,在工作中学习了搭建Gitlab以及部署Jenkins持续集成等技术,特此记录。

安装Git服务

前置操作

运行下面命令下载镜像
docker pull beginor/gitlab-ce:11.3.0-ce.0

由于docker镜像运行重启数据即失,因此配置、数据、日志需要存放在服务器,而不是容器之中。分别创建三个目录:

mkdir -p /home/software/gitlab/etc

mkdir -p /home/software/gitlab/logs

mkdir -p /home/software/gitlab/data

运行镜像

首先需要知道自己的镜像名称或镜像ID。

然后运行下列命令。

docker run --name='gitlab' -d \
--publish 10443:443 --publish 10013:80 \
--restart always \
 -v /home/software/gitlab/etc:/etc/gitlab \
 -v /home/software/gitlab/data:/var/opt/gitlab \
 -v /home/software/gitlab/logs:/var/log/gitlab \
 --privileged=true beginor/gitlab-ce:11.3.0-ce.0

主要部分在于 --publish 参数,gitlab是发布在镜像中的80端口,我需要另外在服务器设置一个端口与其对应,以上命令中,主要使用了10013端口与其对应。

执行完毕,等待几分钟,就可以通过浏览器进行访问客户端了。

http://ip:10013/

安装Jenkins服务

镜像部署

// 拉取镜像
docker pull jenkinszh/jenkins-zh`
// 启动容器
docker run --name jenkins -p 10017:8080 -p 10018:50000 -d jenkinszh/jenkins-zh:latest

//访问网页端
http://ip:10017/

1.png

解锁码被写到了日志之中。因此需要执行下面的命令。

//查看日志
docker logs jenkins

得到密钥:"516bb3cfbed64974a**ccfb337c47"

配置Git

主要采用的方式是通过SSH密钥形式。因此需要先进入Jenkins镜像中生成一对密钥。

// 进入镜像
docker exec -it gitlab /bin/bash
// 生成密钥
ssh-keygen -t rsa

//进入密钥文件的存放路径
cd /root/.ssh/ 

其中有两个文件,其中id_rsa是私钥,id_rsa.pub是公钥。

drwx------ 2 root root   38 Jul 13 15:01 ./
drwx------ 1 root root   18 Jul 13 15:01 ../
-rw------- 1 root root 1675 Jul 13 15:01 id_rsa
-rw-r--r-- 1 root root  399 Jul 13 15:01 id_rsa.pub

此时需要将公钥配置在gitlab之中(使用管理员账户)。
2.png

其后,进入Jenkins创建一个项目,并为其提供一个Gitlab全局凭证。

3.png

如图,使用的是SSH密钥形式。当然,也可以使用gitlab的账户和密码形式

应用后,就可以进行构建了,Jenkins会自动去gitlab之上拉取代码。

4.png

拉取成功,也就代表我们的凭证设置正确。

Jenkins构建触发器

设置在什么时候,Jenkins自动进行构建项目

常用构建触发器

前置工程

设置在某个工程构建后自动进行构建任务。

触发远程构建

在设置中设置身份验证令牌,通过HTTP访问通知Jenkins进行重新构建。
5.png

请求http://ip:port/job/项目名称/build?token=设置的令牌即可。

定时构建

根据时间表达式去自动构建任务。类似于corn表达式。

举例: H/30 ,自左到右分别是: 分 时 日 月 周(可以省略)。而这个例子的含义是,每半小时构建一次,前面之所以写上‘H’是因为标识这里要使用后面的数字,也就是‘30’。

6.png

其他例子:

  • H H/2 * 每两个小时执行一次
  • 08,12,22 * 每天的八点、十二点、二十二点进行执行

轮询SCM

基于定时任务,定时去扫描代码仓库是否变更,如果变更便进行构建任务。与上述定时任务大致相同。

Git Hook

一般情况下如果我们使用轮询SCM的方式进行自动构建的时候,每次都会扫描整个代码仓库,这样产生了很多不必要的性能开销。因此Gitlab提供了一种WebHook的接口。

简单的来说,只有GIt发起了某种操作的时候,会去自动触发我们的Jenkins进行运行构建任务。

7.png

安装插件

总的来说,需要安装对应的插件,分别是:Gitlab、Gitlab WebHook。如果使用的是Github,安装Github的WebHook插件。

8.png

安装完毕后,在工程的构造器配置项就又多了一个条件。

大概主要的就是当代码仓库出现Push,或者分支合并等等事件,Gitlab会通过下图中的地址进行通知Jenkins进行构建任务。

9.png

其后就需要在Gitlab之上进行配置。首先进入设置勾上“
允许钩子和服务访问本地网络”选项。

10.png

之后进入 项目代码仓库 -> 设置 -> 导入所有仓库。在其中设置,点击“增加Web钩子”即可。

11.png

12.png

如果测试失败,提示身份验证,需要前往Jenkins的设置中“取消身份严重”。

13.png