一、搭建要点

• 系统要求:RAM > 256M,DISK > 1G (测试环境);
• 最小化团队:RAM > 1G, DISK > 50G+ ;
• 安装方式:Docker 或 war 包运行;

二、分布式架构

WX20191231-091224@2x.png
正常情况下,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配置文件如下所示(个人采用这种方式):

  1. version: '3'
  2. services:
  3. jenkins:
  4. container_name: 'jenkins'
  5. # lts代表长期支持的依赖版本
  6. image: jenkins/jenkins:lts
  7. # 每当我们的docker服务(docker daemon守护镜像)重启时,或者说linux重启的时候,这个Jenkins服务都会重启
  8. restart: always
  9. # 指定jenkins用户,主要目的是方便后面使用宿主机上的docker容器去进行发布。
  10. user: jenkins:994
  11. # 端口映射
  12. ports:
  13. - '42041:8080'
  14. - '42042:50000'
  15. - '42043:10051'
  16. volumes:
  17. # 将Jenkins里的数据映射到宿主机上
  18. - /home/jenkins/data:/var/jenkins_home
  19. # 将宿主机的docker映射到Jenkins中。这样的话,就可以在Jenkins里面直接在宿主机上去创建一些容器。
  20. - /usr/bin/docker:/usr/bin/docker
  21. - /var/run/docker.sock:/var/run/docker.sock

当Gitlab、Jenkins、Docker都在同一台宿主机上时,配置Jenkins的docker-compose.yml集成文件时,需指定user。将宿主机的docker的一个用户配置给Jenkins,让Jenkins有操作的权限。因为Jenkins也是运行在docker环境中,如果要在Jenkins上配置发布服务的话,就需在宿主机上给其一个权限,告诉jenkins来使用这个权限。

在安装的过程中,如果报如下所示的提示错误:

  1. [root@ecs-x-large-2-linux-20200311134053 jenkins]# docker-compose up
  2. Starting jenkins ... done
  3. Attaching to jenkins
  4. jenkins | touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
  5. 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” 容器。

  1. 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服务中,如下所示。

  1. *************************************************************
  2. Jenkins initial setup is required. An admin user has been created and a password generated.
  3. Please use the following password to proceed to installation:
  4. b3c869ed10094c75ad202a6361e40b4b
  5. 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服务,如下所示,输入管理员密码(见上述日志信息)。
WX20191231-135027@2x.png
点击“继续”,然后选择安装推荐的插件。在安装插件的过程中如果出现如下问题:
WX20191231-153039@2x.png

提示Jenkins已经离线,造成这一问题的原因是因为当前服务器的IP不能访问到谷歌服务。Jenkins自从更新到2.172版本之后,就开始需要访问谷歌的服务。

针对这一问题,一是可以配置对应的代理;二是采用离线的方式安装插件。配置清华的加速源,使用清华的加速源来下载Jenkins插件。

配置管理员用户,继续点击下一步。
Jenkins.png
Jenkins URL 是全局Jenkins访问的地址,也是回调地址。后面配置Gitlab并与它连接的时候,需要使用到该地址。

五、配置插件加速源地址

清华加速源 搜索jenkins,然后选择该目录并点击进入。选择 updates目录并点击进入,选择当前目录下的update-center.json文件,并右击选择复制链接地址。

回到Jenkins网站,选择“系统管理”,然后选择“插件管理”,点击“高级”选项,如下图所示:
WX20191231-213114@2x.png

然后将刚才复制的链接地址粘贴到升级站点的URL中,然后点击提交。
WX20191231-213820.png
这样,整个插件系统就会从上述地址去下载插件。

六、安装常用插件

点击“系统管理”,选择“插件管理”,点击“可选插件”。然后选择安装常用必备的插件,如Git client 插件、GitLab 插件等,并选择“下载待重启后安装”。

当我们安装了Gitlab插件之后,后面配置任务的时候就可以和Gitlab这边进行对接了。

注:为什么不用 Jenkins 直接与 Github 进行对接呢?

  • 原因一:如果使用Jenkins直接与Github进行对接,我们的Jenkins服务必须在公网上,那么Github才能访问到我们的Jenkins服务,这是最主要的原因;
  • 原因二:Jenkins支持本地化的部署,在内网环境下我们会经常碰到集成化版本工具Gitlab,所以说鉴于实践的环节选择了Jenkins与Gitlab进行衔接;

6.1 离线安装插件

如果是内网环境,那该怎么办? 这里Jenkins提供了另外一种方式,可以离线方式去安装插件。
WX20191231-214305.png
如何下载离线插件呢?此时可以去 Jenkins官网 直接下载离线插件。

七、远程发布/部署

  • 远程使用Shell脚本去发布(镜像/rsync直传);
  • Docker远程发布/Rancher集群管理/Kubernetes高可用;
  • 使用Jenkins插件进行发布;