CI/CD之Jenkins+Gitlab

Posted 礁之

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CI/CD之Jenkins+Gitlab相关的知识,希望对你有一定的参考价值。

文章目录


本文章达到了一万六千字,有点多,但是比较全

一、Jenkinx+Gitlab持续集成环境概述

(1)什么是CI/CD

  • CI为持续集成,CD为持续交付和持续部署,一般CD就是持续交付

  • CI/CD概述:

持续集成(CI): 持续集成(Continuous integration)是指开发者在代码的开发过程中,可以频繁的将代码部署到master主干上,并且进行自动化测试

持续交付(CD): 持续交付(Continuous Delivery)是指在持续集成的基础上,将代码部署到预生产环境,即测试环境

持续部署(CD): 在持续交付的基础上,把代码部署到生产环境的过程自动化

  • 一层套一层,使用CI/CD的目的就是使整个开发、运维的环境变成一个闭环,提高效率

(2)Jenkins概述

  • Jenkins是一个开源软件项目,是基于JAVA开发的一款持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变为可能

  • 官方网站: https://jenkins.io/

(3)Gitlab概述

  • Gitlab是一个利用Ruby on Redis开发的开源应用程序,实现了一个自托管的Git项目仓库,用户可以通过web界面进行访问公开或者私人项目

  • Gitlab拥有和Github类似的功能,都能浏览源代码、管理缺陷和注释,可以管理团队对仓库的访问,Gitlab会提供一个文件历史库去存放提交过的项目版本,并且还提供一个代码片段收集功能,可以轻松实现代码复用,方便以后有需要的时候进行查找

  • Ruby on Redis: 是一个可以使开发、部署、维护web应用程序变得简单的框架

  • 官方网站: https://about.gitlab.com/

(4)Gitlab和Github的区别

  • 相同点

二者都是基于web的Git仓库,很大程度上Gitlab是仿照Github做出来的,并且二者都提供了分享开源项目的平台,为开发团队提供了存储、分享、发布和合作开发项目的中心化的、云存储的场所

  • 不同点
  1. GitHub如果要使用私有仓库,超过四个是需要付费的,而Gitlab可以在上面创建私人的免费仓库,因为公司可以自己部署Gitlab
  2. Gitlab让开发团队对他们的代码仓库拥有更多的控制,相对于Github,有着不少特色,例如:可以免费设置仓库权限、运行用户选择分享一个项目的源代码、运行用户设置项目的获取权限,进一步的提升了安全性,还可以设置获取到团队整体的改进进度,通过innersourcing让不在权限范围内的人访问不到该资源。开发者还可以把某个代码打上”仍在进行中“的标签来提醒其他成员这个代码没有完成,从而阻止未完成的代码合并到其他的代码中

总的来说,从代码的私有性来看,有时候公司并不希望员工获取到全部的代码,而Gitlab无疑是更好的选择,但是对于开源代码来说,GIthub依然是代码托管的首选

******注释******
git是一个分布式的版本控制器,是一种命令、一种工具,Gitlab和Github都是基于git实现的在线代码托管仓库,不同的是Github是面向互联网开放的,而Gitlab通常都是公司内部网络使用,两者都有网站页面
gitlab-ce是社区服,是免费的,gitlab-ee是企业版,是收费的

(5)Jenkins配合Gitlab持续集成系统的工作流程

  1. 开发者将新版本推送到Gitlab中

  2. Gitlab会触发Jenkins的master主节点(Jenkinx是可以分主从节点的)进行一次建造

  3. Jenkins主节点将这个建造任务分配给若干个注册的从节点中的一个,这个从节点会根据事先设置好的脚本进行建造,这个脚本可以做的事情有很多,例如编译、测试、生产测试报告等功能,这些原本需要手动完成的任务都可以交给Jenkins来完成

如果在建造过程中需要编译,一般会使用分布式编译器distcc来加快编译速度

二、部署持续集成环境

(1)实验环境

系统主机名ip扮演角色安装软件
Centos7.4gitlab192.168.100.202Gtilabgitlab-ce-12.0.2-ce.0.el7.x86_64.rpm
Centos7.4jenkins192.168.100.203Jenkinsjenkins-2.222.4-1.1.noarch.rpm
Centos7.4apache192.168.100.204webapache

注意:Gitlab的内存给大一点,最好是4G,Jenkins给2G,不然后面会报错

(2)实验步骤

-搭建Gitlab(100.202)

******(1)先做基础配置
[root@Centos7 ~]# hostnamectl set-hostname gitlab
[root@Centos7 ~]# su
[root@gitlab ~]# systemctl stop firewalld
[root@gitlab ~]# setenforce 0
setenforce: SELinux is disabled
[root@gitlab ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt 忙
       /dev/sr0 已经挂载到 /mnt 上

******(2)安装gitlab依赖包
[root@gitlab ~]# yum install -y curl policycoreutils openssh-server openssh-clients postfix policycoreutils-python
。。。。。。
完毕!

******(3)开启邮件服务,默认使用postfix发送邮件
[root@gitlab ~]# systemctl enable postfix
[root@gitlab ~]# systemctl start postfix

******(4)关闭防火墙,或者允许http通过,做基础配置的时候已经关了
[root@gitlab ~]# firewall-cmd --permanent --add-service=http  #允许http通过
[root@gitlab ~]# systemctl reload firewalld  #重载

******(5)安装gitlab
#安装gitlab需要rpm包,有两种方法下载rpm包
使用迅雷下载:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.0.2-ce.0.el7.x86_64.rpm
使用YUM源下载:(YUM下载非常慢)
[root@gitlab ~]# vim /etc/yum.repos.d/gitlab.repo
[gitlab-ce]
name=gitlab-ce
baseurl=http://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7
repo_gpgcheck=0
gpgcheck=0
enabled=1
gpgkey=https://packages.gitlab.com/gpg.key
[root@gitlab ~]# yum install -y gitlab-ce  #安装社区版的gitlab
。。。。。。
完毕!

#这里直接上传软件包进行安装gitlab
[root@gitlab ~]# ll
总用量 625204
-rw-------. 1 root root      1264 112 18:27 anaconda-ks.cfg
-rw-r--r--  1 root root 640204790 630 17:16 gitlab-ce-12.0.2-ce.0.el7.x86_64.rpm
[root@gitlab ~]# yum -y install gitlab-ce-12.0.2-ce.0.el7.x86_64.rpm 
。。。。。。
完毕!
       *.                  *.
      ***                 ***
     *****               *****
    .******             *******
    ********            ********
   ,,,,,,,,,***********,,,,,,,,,
  ,,,,,,,,,,,*********,,,,,,,,,,,
  .,,,,,,,,,,,*******,,,,,,,,,,,,
      ,,,,,,,,,*****,,,,,,,,,.
         ,,,,,,,****,,,,,,
            .,,,***,,,,
                ,*,.
  


     _______ __  __          __
    / ____(_) /_/ /   ____ _/ /_
   / / __/ / __/ /   / __ `/ __ \\
  / /_/ / / /_/ /___/ /_/ / /_/ /
  \\____/_/\\__/_____/\\__,_/_.___/

******(6)配置gitlab访问地址
[root@gitlab ~]# vim /etc/gitlab/gitlab.rb 
。。。。。。
  13 external_url 'http://192.168.100.202'    #修改url为自己的ip地址
。。。。。。
#保存退出

******(7)重置gitlab,每次修改完配置文件都需要重置,重置大约需要三分钟左右
[root@gitlab ~]# gitlab-ctl reconfigure
。。。。。。
Running handlers:
Running handlers complete
Chef Client finished, 509/1343 resources updated in 02 minutes 27 seconds
gitlab Reconfigured!    #出现这个表示重置成功

******(8)查看端口,gitlab默认使用nginx作为web界面,要注意的是,如果在访问web界面时总是报502的话,需要清空防火墙规则或者关闭防火墙,并且内存要大于4G不然有时也会报502,每次重置完之后不要马上进行访问,稍微等一两分钟再访问
[root@gitlab ~]# netstat -anpt | grep 80
tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN      2038/unicorn master 
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      2103/nginx: master  
tcp        0      0 127.0.0.1:8082          0.0.0.0:*               LISTEN      2056/sidekiq 5.2.7  
tcp        0      0 0.0.0.0:8060            0.0.0.0:*               LISTEN      2103/nginx: master  
tcp        0      0 127.0.0.1:8080          127.0.0.1:47272         TIME_WAIT   -                   
tcp        0      0 127.0.0.1:8080          127.0.0.1:47264         TIME_WAIT   -                   
tcp        0      0 127.0.0.1:8080          127.0.0.1:47274         TIME_WAIT   -                   
tcp        0      0 127.0.0.1:44214         127.0.0.1:8060          ESTABLISHED 2526/prometheus     
tcp        0      0 127.0.0.1:8060          127.0.0.1:44214         ESTABLISHED 2104/nginx: worker  
tcp        0      0 127.0.0.1:52642         127.0.0.1:8082          ESTABLISHED 2526/prometheus     
tcp        0      0 127.0.0.1:8080          127.0.0.1:47266         TIME_WAIT   -                   
tcp        0      0 127.0.0.1:8082          127.0.0.1:52642         ESTABLISHED 2056/sidekiq 5.2.7  

(9)登录gitlab

第一次登录gitlab需要为root用户修改密码,root用户是gitlab的超级管理员,这里输入新的密码:nihao123!

成功登录gitlab

******(10)汉化gitlab
# gitlab中文社区版的项目,v7-v8.8 是由 Larry Li发起的“GitLab 中文社区版项目”(https://gitlab.com/larryli/gitlab),从 v8.9之后,@xhang 开始继续该汉化项目(https://gitlab.com/xhang/gitlab)。
# 软件下载地址,这里使用是V12版本的gitlab所以需要下载v12的汉化包
# 下载地址:https://gitlab.com/xhang/gitlab/-/archive/12-0-stable/gitlab-12-0-stable-zh.tar.gz
[root@gitlab ~]# ll  #上传软件包
总用量 699968
-rw-------. 1 root root      1264 112 18:27 anaconda-ks.cfg
-rw-r--r--  1 root root  76557595 630 17:35 gitlab-12-0-stable-zh.tar.gz
-rw-r--r--  1 root root 640204790 630 17:16 gitlab-ce-12.0.2-ce.0.el7.x86_64.rpm
[root@gitlab ~]# tar xf gitlab-12-0-stable-zh.tar.gz 
[root@gitlab ~]# cat gitlab-12-0-stable-zh/VERSION   #确认版本
12.0.3

******(11)开始汉化
[root@gitlab ~]# gitlab-ctl stop   #先停止gitlab
ok: down: alertmanager: 0s, normally up
ok: down: gitaly: 1s, normally up
ok: down: gitlab-monitor: 0s, normally up
ok: down: gitlab-workhorse: 0s, normally up
ok: down: grafana: 0s, normally up
ok: down: logrotate: 0s, normally up
ok: down: nginx: 1s, normally up
ok: down: node-exporter: 0s, normally up
ok: down: postgres-exporter: 1s, normally up
ok: down: postgresql: 0s, normally up
ok: down: prometheus: 0s, normally up
ok: down: redis: 1s, normally up
ok: down: redis-exporter: 0s, normally up
ok: down: sidekiq: 0s, normally up
ok: down: unicorn: 0s, normally up
[root@gitlab ~]# unalias cp       #删除cp的别名
[root@gitlab ~]# cp -rf gitlab-12-0-stable-zh/* /opt/gitlab/embedded/service/gitlab-rails/  #后面的报错不用管
cp: 无法以目录"gitlab-12-0-stable-zh/log" 来覆盖非目录"/opt/gitlab/embedded/service/gitlab-rails/log"
cp: 无法以目录"gitlab-12-0-stable-zh/tmp" 来覆盖非目录"/opt/gitlab/embedded/service/gitlab-rails/tmp"
[root@gitlab ~]# gitlab-ctl start    #开启gitlab,在开启后等一两分钟再访问gitlab否则会报错
ok: run: alertmanager: (pid 4094) 0s
ok: run: gitaly: (pid 4102) 1s
ok: run: gitlab-monitor: (pid 4123) 0s
ok: run: gitlab-workhorse: (pid 4127) 0s
ok: run: grafana: (pid 4134) 1s
ok: run: logrotate: (pid 4147) 0s
ok: run: nginx: (pid 4153) 1s
ok: run: node-exporter: (pid 4158) 0s
ok: run: postgres-exporter: (pid 4162) 1s
ok: run: postgresql: (pid 4243) 0s
ok: run: prometheus: (pid 4252) 0s
ok: run: redis: (pid 4261) 1s
ok: run: redis-exporter: (pid 4265) 0s
ok: run: sidekiq: (pid 4270) 1s
ok: run: unicorn: (pid 4276) 0s

访问web界面,成功汉化


-Gitlab的使用

  • 基本命令
名称作用
gitlab-ctl stop关闭gitlab
gitlab-ctl start开启gitlab
gitlab-ctl restart重启gitlab
gitlab-ctl reconfigure重置gitlab,在修改完配置文件后需要执行,不能乱用
  • gitlab相关配置文件和目录
名称作用
/etc/gitlab/gitlab.rbgitlab主配置文件,可以自定义一些邮件服务等
/var/log/gitlab/日志目录,对应各服务的日志的目录
/var/opt/gitlab/服务目录,对应各个服务的目录
/var/opt/gitlab/git-data仓库目录,记录项目仓库等提交信息

-关闭gitlab注册功能

默认情况下,用户可以自己去注册账号,这样显然是不安全的,所以可以关闭gitlab的账户注册功能


-配置gitlab邮件报警

运维人员最注重的一点就是告警邮件,所以gitlab也配备了邮件发送的功能,但是使用gitlab的默认设置可能收不到邮件,所以需要我们手动修改,在做邮件报警时需要加一块桥接网卡

官网各种邮箱配置实例:https://docs.gitlab.com/omnibus/settings/smtp.html

******(1)修改配置文件,这里配置的是qq的smtp
[root@gitlab ~]# vim /etc/gitlab/gitlab.rb 
。。。。。。   #在58行添加,都是注释直接空一行写就行
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.qq.com"     #指定smtp服务器
gitlab_rails['smtp_port'] = 465       #每个服务器都有对应的端口,qq的是465
gitlab_rails['smtp_user_name'] = "1248873545@qq.com"   #邮箱
gitlab_rails['smtp_password'] = "tlefpqamwrhkhage"    #smtp号
gitlab_rails['smtp_authentication'] = "login"     
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_from'] = '1248873545@qq.com'   #发送邮件的邮箱
#保存退出

******(2)重置gitlab
[root@gitlab ~]# gitlab-ctl  reconfigure
。。。。。。
Running handlers:
Running handlers complete
Chef Client finished, 16/669 resources updated in 01 minutes 07 seconds
gitlab Reconfigured!

******(3)登录控制台发送邮件
[root@gitlab ~]# gitlab-rails console
。。。。。。
irb(main):002:0> Notify.test_email('1248873545@qq.com', 'test', 'test').deliver_now   #发送邮箱到1248873545@qq.com,标题为test,内容为test
Notify#test_email: processed outbound mail in 123.1ms
Sent mail to 1248873545@qq.com (2811.6ms)
Date: Wed, 30 Jun 2021 10:07:59 +0800
From: GitLab <1248873545@qq.com>
Reply-To: GitLab <noreply@192.168.100.202>
To: 1248873545@qq.com
Message-ID: <60dbd1ff541c0_1ff33fc03fccf97c28335@gitlab.mail>
Subject: test
Mime-Version: 1.0
Content-Type: text/html;
 charset=UTF-8
Content-Transfer-Encoding: 7bit
Auto-Submitted: auto-generated
X-Auto-Response-Suppress: All

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>test</p></body></html>

=> #<Mail::Message:70094578102080, Multipart: false, Headers: <Date: Wed, 30 Jun 2021 10:07:59 +0800>, <From: GitLab <1248873545@qq.com>>, <Reply-To: GitLab <noreply@192.168.100.202>>, <To: 1248873545@qq.com>, <Message-ID: <60dbd1ff541c0_1ff33fc03fccf97c28335@gitlab.mail>>, <Subject: test>, <Mime-Version: 1.0>, <Content-Type: text/html; charset=UTF-8>, <Content-Transfer-Encoding: 7bit>, <Auto-Submitted: auto-generated>, <X-Auto-Response-Suppress: All>>

邮件可以成功发送后,开始修改root用户的邮箱,因为root用户的默认邮箱为admin@example.com,修改邮箱后创建组会发送邮件警告

-创建一个新群组

  • Private: 只有组成员才能看到
  • Internal: 只要登录的用户就能看到
  • Public: 所有人都能看到

-创建一个新账户





使用新账户登录gitlab

可以很明显看到,普通用户的权限是没有root多的

-把新创建的用户加入组



#Gitlab用户在组中有五种权限:Guest、Reporter、Developer、Master、Owner
Guest(访客):可以创建issue、发表评论,不能读写版本库
Reporter(报告者):可以克隆代码,不能提交,QA(测试人员)、PM(主管或者产品经理)可以赋予这个权限
Developer(开发人员):可以克隆代码、开发、提交、push,RD(研发人员)可以赋予这个权限
Master(主程序员):可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,核心RD负责人可以赋予这个权限
Owner(所有者):可以设置项目访问权限 - Visibility Level、删除项目、迁移项目、管理组成员,开发组leader可以赋予这个权限

-创建一个新项目

可以在群组中创建项目,也可以创建私有的项目,创建完后的使用方法和github相同


这里之后都汉化了,下面生成ssh密钥

#因为是要配合jenkins,所有这里使用的密钥直接在jenkins主机上操作即可
[root@Centos7 ~]# hostnamectl set-hostname jenkins
[root@Centos7 ~]# su
[root@jenkins ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:gh6chv+S4eK5Tnd8mWzbQNTmWdi4BLK9/H/VrA1Qenk root@Centos7.4-1
The key's randomart image is:
+---[RSA 2048]----+
|      . .        |
|       + o +  .  |
|      . o * oo . |
|   o o o = +o o E|
|  . * . S +  o o.|
|   +.o + +    . +|
|  ..+oo B .    = |
| ..o+o o + .  o .|
| o=o .. . . ..   |
+----[SHA256]-----+
[root@jenkins ~]# cat .ssh/id_rsa.pub   #查看公钥并且复制到gitlab的web界面中
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDcUghkjbif7vFFzmUfeWaon08+VDF314si8Fa0xonE3dFbpfr1tzSLmldaulj8yBwXvvtS7XKJUuh54gqgQycor/T1apfyfPSLHtCoeZWYzbACufm9penKCA0USkYwTkOQU9HpOx17p85nBO6ydo6Xz0l8UBNqvoy7/tO7mIslcignj+r6mgskTxCoOk9ujwDSQ3QmfhLmc/7B4wGSWclvETZyRGyb8g3rye7+16fpPENpq1YaweoiNAytdb+IZBVjgdIT0k2PVggVdYxntoA0IulCYwolT1KcjJllcSm47IHtDL4J8AgPGO8ZXf7oJM+vMtZRiHlURjLlQzbcAnOh root@Centos7.4-1







使用jenkins主机复制一下仓库

[root@jenkins ~]# git clone git@192.168.100.202:root/test.git  #克隆,后面的URL直接在web界面复制就行
正克隆到 'test'...
The authenticity of host '192.168.100.202 (192.168.100.202)' can't be established.
ECDSA key fingerprint is SHA256:VhTZ5YxS5af2rHtfCvyc6ehXh3PD2A8KY2MyE6rHjiU.
ECDSA key fingerprint is MD5:e8:41:d2:8a:7e:e9:a9:47:a3:f0:29:be:e9:6d:df:51.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.100.202' (ECDSA) to the list of known hosts.
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
接收对象中: 100% (3/3), done.
[root@jenkins ~]# ll
总用量 4
-rw-------. 1 root root 1264 112 18:27 anaconda-ks.cfg
drwxr-xr-x  3 root root   32 630 18:57 test
[root@jenkins ~]# cd test/
[root@jenkins test]# ll    #成功克隆仓库
总用量 4
-rw-r--r-- 1 root root 16 630 18:57 1.html

-搭建Jenkins(100.203)

  • Jenkins下载地址
https://pkg.jenkins.io/redhat-stable/jenkins-2.176.2-1.1.noarch.rpm
  • linux的wget下载地址:
wget https://pkg.jenkins.io/redhat-stable/jenkins-2.176.2-1.1.noarch.rpm
******(1)先做基础配置
[root@jenkins ~]# systemctl stop firewalld
[root@jenkins ~]# setenforce 0
setenforce: SELinux is disabled
[root@jenkins ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt 忙
       /dev/sr0 已经挂载到 /mnt 上
       
******(2)因为Jenkins是使用JAVA开发,所以需要安装JDK
[root@jenkins ~]# ls  #上传jdk包
anaconda-ks.cfg  jdk-8u91-linux-x64.tar.gz  test
[root@jenkins ~]# tar xf jdk-8u91-linux-x64.tar.gz -C /usr/local/
[root@jenkins ~]# mv /usr/local/jdk1.8.0_91 /usr/local/java
[root@jenkins ~]# ls /usr/local/
bin  etc  games  include  java  lib  lib64  libexec  sbin  share  src
[root@jenkins ~]# vim /etc/profile
。。。。。。   #在最后一行添加,优化环境变量
JAVA_HOME=/usr/local/java 
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar 
export PATH JAVA_HOME CLASSPATH
#保存退出
[root@jenkins ~]# source /etc/profile  #执行脚本,使刚刚的配置生效
[root@jenkins ~]# java -version  #查看java版本,确认成功安装
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)

******(3)上传Jenkins软件包,安装、配置
[root@jenkins ~]# ll
总用量 241624
-rw-------. 1 root root      1264 112 18:27 anaconda-ks.cfg
-rw-r--r--  1 root root 181367942 630 22:11 jdk-8u91-linux-x64.tar.gz
-rw-r--r--  1 root root  66044542 630 22:16 jenkins-2.222.4-1.1.noarch.rpm
drwxr-xr-x  3 root root        32 630 18:57 test
[root@jenkins ~]# yum -y install jenkins-2.222.4-1.1.noarch.rpm   #

以上是关于CI/CD之Jenkins+Gitlab的主要内容,如果未能解决你的问题,请参考以下文章

CI/CD之Jenkins+Gitlab

Jenkins vs GitLab CI:CI/CD工具之战

Jenkins + Gitlab + harbor + Kubernetes实现CI/CD

Jenkins + Gitlab + harbor + Kubernetes实现CI/CD

devops学习笔记-jenkins实现基础CI/CD操作

基于docker搭建Jenkins+Gitlab+Harbor+Rancher架构实现CI/CD操作