一、搭建要点
• 系统要求:RAM > 256M,DISK > 1G (测试环境);
• 最小化团队:RAM > 1G, DISK > 50G+ ;
• 安装方式:Docker 或 war 包运行;
二、分布式架构
正常情况下,Gitlab、Jenkins、Docker这三个服务都是运行不同的机器上,是一个分布式服务。
- Gitlab:两核4GB的机器可以支持20个人左右的团队使用。
- Jenkins:两核4GB的机器可以支持20个人左右的团队使用,里面的项目大概在四到五个之间,构建的频繁度一天构建发布50次左右都没问题。
- Docker:比较玄学,需看一下自己的测服发布环境多不多。如果说团队的测试发布环境需求比较多,比如一个项目有四个环境,如测试环境、验证环境、用户的alpha环境、生产发布环境,这个时候就需要多个docker云容器。还有根据大家的后台服务,比如java服务,如果说去启动一个docker容器,大概就需要几百兆内存,这个时候就需要一台比较大的内存机器去运行我们后面的发布部分。
三、安装Jenkins
3.1 使用Docker Compose 安装Jenkins
但在个人项目中,Gitlab、Jenkins、Docker这三个服务运行在同一台宿主机上,docker-compose.yml配置文件如下所示(个人采用这种方式):
version: '3'
services:
jenkins:
container_name: 'jenkins'
# lts代表长期支持的依赖版本
image: jenkins/jenkins:lts
# 每当我们的docker服务(docker daemon守护镜像)重启时,或者说linux重启的时候,这个Jenkins服务都会重启
restart: always
# 指定jenkins用户,主要目的是方便后面使用宿主机上的docker容器去进行发布。
user: jenkins:994
# 端口映射
ports:
- '42041:8080'
- '42042:50000'
- '42043:10051'
volumes:
# 将Jenkins里的数据映射到宿主机上
- /home/jenkins/data:/var/jenkins_home
# 将宿主机的docker映射到Jenkins中。这样的话,就可以在Jenkins里面直接在宿主机上去创建一些容器。
- /usr/bin/docker:/usr/bin/docker
- /var/run/docker.sock:/var/run/docker.sock
当Gitlab、Jenkins、Docker都在同一台宿主机上时,配置Jenkins的docker-compose.yml集成文件时,需指定user。将宿主机的docker的一个用户配置给Jenkins,让Jenkins有操作的权限。因为Jenkins也是运行在docker环境中,如果要在Jenkins上配置发布服务的话,就需在宿主机上给其一个权限,告诉jenkins来使用这个权限。
在安装的过程中,如果报如下所示的提示错误:
[root@ecs-x-large-2-linux-20200311134053 jenkins]# docker-compose up
Starting jenkins ... done
Attaching to jenkins
jenkins | touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
jenkins | Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
这是因为在容器内部 /var/jenkins_home/
目录权限是jenkins用户拥有的,当映射到本地数据卷时, /var/jenkins_home
目录的拥有者就变成了root用户。所以当“jenkins”用户的进程访问 /var/jenkins_home/
目录时,会出现 Permission denied 的问题。
解决办法是将当前目录的拥有者赋值给 uid 1000(容器中的jenkins user的uid为1000),再启动 “jenkins” 容器。
sudo chown -R 1000:1000 /home/jenkins
如果依旧不行,可以直接给目录/home/jenkins
一个777的权限即可。
3.2 使用 Docker 命令安装 Jenkins
docker run —name jenkins_test -itd -p 42041:8080 -p 42042:50000 jenkins/jenkins:lts
- itd: 增加交互式终端,并且让这个docker命令在后台执行。
查看容器内部日志信息。
docker logs -f jenkins_test
这里面有个日志注释非常重要,即Jenkins默认会生成一个管理员密码,初次打开Jenkins的时候会使用到管理员密码,才能登陆到Jenkins服务中,如下所示。
*************************************************************
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
b3c869ed10094c75ad202a6361e40b4b
This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
3.3 设置防火墙端口
firewall-cmd —add-port=42041/tcp —permanent firewall-cmd —add-port=42042/tcp —permanent firewall-cmd —add-port=42043/tcp —permanent
重新加载防火墙
firewall-cmd —reload
四、配置Jenkins
输入网站 [http://121.26.145.149:42041](http://121.26.145.149:42041)
,打开Jenkins服务,如下所示,输入管理员密码(见上述日志信息)。
点击“继续”,然后选择安装推荐的插件。在安装插件的过程中如果出现如下问题:
提示Jenkins已经离线,造成这一问题的原因是因为当前服务器的IP不能访问到谷歌服务。Jenkins自从更新到2.172版本之后,就开始需要访问谷歌的服务。
针对这一问题,一是可以配置对应的代理;二是采用离线的方式安装插件。配置清华的加速源,使用清华的加速源来下载Jenkins插件。
配置管理员用户,继续点击下一步。
Jenkins URL 是全局Jenkins访问的地址,也是回调地址。后面配置Gitlab并与它连接的时候,需要使用到该地址。
五、配置插件加速源地址
在 清华加速源 搜索jenkins,然后选择该目录并点击进入。选择 updates
目录并点击进入,选择当前目录下的update-center.json
文件,并右击选择复制链接地址。
回到Jenkins网站,选择“系统管理”,然后选择“插件管理”,点击“高级”选项,如下图所示:
然后将刚才复制的链接地址粘贴到升级站点的URL中,然后点击提交。
这样,整个插件系统就会从上述地址去下载插件。
六、安装常用插件
点击“系统管理”,选择“插件管理”,点击“可选插件”。然后选择安装常用必备的插件,如Git client
插件、GitLab
插件等,并选择“下载待重启后安装”。
当我们安装了Gitlab插件之后,后面配置任务的时候就可以和Gitlab这边进行对接了。
注:为什么不用 Jenkins 直接与 Github 进行对接呢?
- 原因一:如果使用Jenkins直接与Github进行对接,我们的Jenkins服务必须在公网上,那么Github才能访问到我们的Jenkins服务,这是最主要的原因;
- 原因二:Jenkins支持本地化的部署,在内网环境下我们会经常碰到集成化版本工具Gitlab,所以说鉴于实践的环节选择了Jenkins与Gitlab进行衔接;
6.1 离线安装插件
如果是内网环境,那该怎么办? 这里Jenkins提供了另外一种方式,可以离线方式去安装插件。
如何下载离线插件呢?此时可以去 Jenkins官网 直接下载离线插件。
七、远程发布/部署
- 远程使用Shell脚本去发布(镜像/rsync直传);
- Docker远程发布/Rancher集群管理/Kubernetes高可用;
- 使用Jenkins插件进行发布;