GitLab+Jenkins实现持续集成+自动化部署

一.自动化上线代码基本介绍

1.软件开发生命周期

老板创意---产品经理---立项---开发团队---测试团队(黑白盒)---运维上线
产品经理---加需求---开发团队---测试团队---运维更新代码上线

2.什么是环境?

开发环境:开发自己用的电脑本地自己装的php python的开发工具等。
测试环境:多个人的代码合起来跑一遍,运行一次,测试mysql redis等。
预发布环境:直接连接线上数据库,专门的测试域名小范围内测试。
生产环境:线上环境 每个项目一套环境 (线下可以放一起配多域名 线上不行)。

3.什么是持续集成(CI)?

每天都进行一次代码合并,就是持续集成。
多个开发写的代码 集中起来管理 放到代码库里 (版本控制管理软件)代码库工具:svn git(多) 。(版本控制系统:类似于快照的增量备份的机制,也就是每一次版本更新,都会在原来的基础上保留变化的内容,生成一个新的版本,之前的版本也会被保留,以便快速回滚。)
每天都要做代码合并,防止冲突,在合并的时候会产生冲突,所以提交的时候有先后顺序,就是你先上传,然后我把你上传的拉过来和我的进行合并,排除冲突,然后我在上传到主分支。持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译、发布、自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。

4.什么是持续交付?

开发首先进行单元测试---最后把所有代码放一起进行测试---代码质量检查。

5.什么是持续部署?

频繁的代码上线就是持续部署。

6.没有持续集成

项目做模块集成的时候,发现很多接口都不通==>浪费大量时间
需要手动去编译打包最新的代码==>构建过程不透明
发布代码,上线,基本靠手工==>脚本乱飞

7.持续集成最佳实践

维护一个单一的代码库
使构建自动化
执行测试是构建的一部分
集成日志及历史记录
使用统一的依赖包管理库
每天至少集成一次

二.jenkins基础使用

说明:如何安装Jenkins请参考文档:https://www.jianshu.com/p/343bdd43c82a
这里就省略安装。

1.登录Jenkins webUI界面创建一个项目
GitLab+Jenkins实现持续集成+自动化部署_第1张图片
2.输入项目名称(free-job)并选择构建一个自由风格的软件项目
GitLab+Jenkins实现持续集成+自动化部署_第2张图片
3.上面创建完成后跳转进来后进行配置,选择丢弃旧的构建(下面保持天数一般在5~7天即可)
GitLab+Jenkins实现持续集成+自动化部署_第3张图片
4.接着上面选择构建,然后选择Execute Shell 来执行shell命令
GitLab+Jenkins实现持续集成+自动化部署_第4张图片
5.既然能执行shell命令,那么我们执行一个pwd,看下默认的工作目录在哪里
GitLab+Jenkins实现持续集成+自动化部署_第5张图片
6.上面保存后点击立即构建,就会在下面生成一个build history,(出现蓝色即表示正常,若红色即表示有问题)
GitLab+Jenkins实现持续集成+自动化部署_第6张图片
7.构建完成,我们可以点击build ID下拉框选择Console Output 来查看详细信息
GitLab+Jenkins实现持续集成+自动化部署_第7张图片
8.通过输出信息我们可以看到Jenkins默认的工作目录在 /root/.jenkins/workspace/(项目名称)
GitLab+Jenkins实现持续集成+自动化部署_第8张图片
9.既然能执行shell命令,那么我们创建一个文件试试;返回工作台,点击配置
GitLab+Jenkins实现持续集成+自动化部署_第9张图片
10.创建一个free.txt文件并保存
GitLab+Jenkins实现持续集成+自动化部署_第10张图片
11.同上面一样,我们点击立即构建
GitLab+Jenkins实现持续集成+自动化部署_第11张图片
12.同样查看构建后的控制台输出,可以看到构建成功
GitLab+Jenkins实现持续集成+自动化部署_第12张图片
13.既然构建成功,那么我们进入服务器进行验证是否创建成功
[root@jenkins ~]# cd /var/lib/jenkins/workspace/free-job/
[root@jenkins /var/lib/jenkins/workspace/free-job]# ls
free.txt

三.GitLab+Jenkins自动化部署及更新

流程图如下:

GitLab+Jenkins实现持续集成+自动化部署_第13张图片

说明:通过gitlab+Jenkins实现代码的自动更新同步代码到web服务器站点目录。此处示例后端web服务器使用nginx。
环境规划以及ip分配如下表:
GitLab+Jenkins实现持续集成+自动化部署_第14张图片

注意:开发环境这里直接放在gitlab服务器上这里将git也部署在gitlab服务器上。git基本使用请参考: https://www.jianshu.com/p/96c4a6d0c587

3.1gitlab 配置

说明:首先在gitlab上面创建一个群组,并创建一个项目,将代码push 到代码仓库中(项目)。创建一个开发用户(用于提交代码等),同时在Jenkins服务器上面生成ssh秘钥并将key添加到新建用户的ssh认证下面。

1.登录gitlab点击项目,然后点击创建一个群组
GitLab+Jenkins实现持续集成+自动化部署_第15张图片
2.点击新建群组
GitLab+Jenkins实现持续集成+自动化部署_第16张图片
3.输入新建群组的相关信息并点击创建
GitLab+Jenkins实现持续集成+自动化部署_第17张图片

GitLab+Jenkins实现持续集成+自动化部署_第18张图片

GitLab+Jenkins实现持续集成+自动化部署_第19张图片
4.新建一个项目
GitLab+Jenkins实现持续集成+自动化部署_第20张图片

GitLab+Jenkins实现持续集成+自动化部署_第21张图片

GitLab+Jenkins实现持续集成+自动化部署_第22张图片
5.设置秘钥
[root@gitlab ~]# 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:WyI0C3MBpUdsAKQsDkEf99WmtCUvcXUoxWL+NgF2R0I root@gitlab
The key's randomart image is:
+---[RSA 2048]----+
|ooooo*+  .. =Eoo |
|.o. oo+..+ @ +o. |
|+. .+.=.. & = .  |
|+    * o + o .   |
| .    o S o . .  |
|       . +   +   |
|        .   . .  |
|                 |
|                 |
+----[SHA256]-----+
[root@gitlab ~]# cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDnnyT5IRLN2AzknCPE3pLnLhH0Vq6jGJsYsjDaLKBQNkBD4coTMW47PJpjxL/pjwyV9KaQ3BuEqam8jQlpaDYUQVBK++0ALFAObGTyTPThRVKhW7X3kjSkInkwAZVj2dLdU0oIinzEuCjldhOe3BF2FYHRgcbnklEFIVpK3quTJbKxcF4h8SMbihRbXor0AIsOupWd0z2skqqvr4xSDNPAb4t+Ypd0MnGPRJYb8DTs+Ign+gn6L7a48RWqqIhBjVjgDLHiitMeEKA6FCS4cEHvcbHhXtrLswfF2ocA+mjfb5WGfP73d959fSPfvraRhhxXqBMqM309DmO3DGtS2e1j root@gitlab
6.塞key操作,方便源码上传下载
GitLab+Jenkins实现持续集成+自动化部署_第23张图片
7.点击头像查看创建项目的结果
GitLab+Jenkins实现持续集成+自动化部署_第24张图片

GitLab+Jenkins实现持续集成+自动化部署_第25张图片
8.查看项目根据提示配置初始化
GitLab+Jenkins实现持续集成+自动化部署_第26张图片

GitLab+Jenkins实现持续集成+自动化部署_第27张图片
9.模拟开发建立git本地工作目录和本地仓库
#这里的源码使用的码云上源码,你可以自行下载使用即可。
[root@gitlab ~/yiliaoqixie]# git config --global user.name "Administrator"
[root@gitlab ~/yiliaoqixie]# git config --global user.email "[email protected]"
[root@gitlab ~/yiliaoqixie]# git init
Initialized empty Git repository in /root/yiliaoqixie/.git/
[root@gitlab ~/yiliaoqixie]# git add .
[root@gitlab ~/yiliaoqixie]# git commit -m "第一次提交项目"
[root@gitlab ~/yiliaoqixie]# git remote add origin [email protected]:yiliao/yiliao.git
[root@gitlab ~/yiliaoqixie]# git push -u origin --all
10.查看上传的结果
GitLab+Jenkins实现持续集成+自动化部署_第28张图片
11.点击设置选择新建用户
GitLab+Jenkins实现持续集成+自动化部署_第29张图片
12.输入账号相关信息并点击创建用户
GitLab+Jenkins实现持续集成+自动化部署_第30张图片

GitLab+Jenkins实现持续集成+自动化部署_第31张图片
13.点击编辑,为上面新创建的用户设置密码
GitLab+Jenkins实现持续集成+自动化部署_第32张图片
14.给这个账号设置密码并保存
GitLab+Jenkins实现持续集成+自动化部署_第33张图片

GitLab+Jenkins实现持续集成+自动化部署_第34张图片
15.将上面创建的用户添加到devops组中并给与开发者权限
GitLab+Jenkins实现持续集成+自动化部署_第35张图片
16.找到刚刚创建的dev用户并给予开发人员权限,然后增加用户到群组
GitLab+Jenkins实现持续集成+自动化部署_第36张图片

3.2Jenkins配置

1.在Jenkins的服务器上生成秘钥
[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:Y/nVt2+ldZc+h4VrsormDhSXKj3ryP/LlLkpIU95xjA root@jenkins
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|         .       |
|      . o        |
|     .E+ .   .   |
|    . ==S   . ..o|
|    .o+++= .  .oB|
|     +o++ .   .B+|
|   . oo+.+  . =o+|
|    o.o*X....+ .+|
+----[SHA256]-----+
[root@jenkins ~]# cat ./.ssh/id_rsa
id_rsa      id_rsa.pub  
[root@jenkins ~]# cat ./.ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCssc5KGRIvHV64Md3HR3SdT0w4twdrAIbxWSSo3tvfrauMdSk2ptmxvgzPqfGEQUgHfPsZY10eN0bpvaFARLBDytyRLbgdSo6gts+J0nGhy0hcjOhu4xJgygt8hN53UCUbdy7DhUnwxIfOuzENFYLS7ZW/Uk4N1FrNNuZK0X5aVNsV5r9H+fUeOfMJ4YLjLhFn6C94q4XmS9OfAW0aCSUfBbCT9LnRmeU/FoQMGdujBZ+Koc9289IVNHkVL+vEW6ZTxLPMEoRaB0RlLxfZF86LMsjsqx6ABBHNpV5FZWl0OYnnEn3jKHRNStfxx2g5Hz9e7eRguBubBis75OfHf2br root@jenkins
2.回到gitlab服务器上面使用maliu用户登录,然后点击头像选择设置
GitLab+Jenkins实现持续集成+自动化部署_第37张图片
3.上面的设置点进来后,选择SSH 秘钥, 然后复制Jenkins服务器上生成的秘钥然后点击增加秘钥
GitLab+Jenkins实现持续集成+自动化部署_第38张图片

GitLab+Jenkins实现持续集成+自动化部署_第39张图片

GitLab+Jenkins实现持续集成+自动化部署_第40张图片
4.新建任务
GitLab+Jenkins实现持续集成+自动化部署_第41张图片

GitLab+Jenkins实现持续集成+自动化部署_第42张图片
5.点击项目名称开始配置
GitLab+Jenkins实现持续集成+自动化部署_第43张图片
6.选择源码管理,选Git,输入仓库URL地址(如果下方出现红色及表示出错了),然后选择保存
GitLab+Jenkins实现持续集成+自动化部署_第44张图片
7.立即构建
GitLab+Jenkins实现持续集成+自动化部署_第45张图片
8.查看构建信息
GitLab+Jenkins实现持续集成+自动化部署_第46张图片
9.服务端查看
[root@jenkins /var/lib/jenkins/workspace/yiliao]# ls
about.html           article.html                         contact.html  index.html           product.html
album.html           Bootstrap医疗器械公司响应式网站模板  css           js
article_detail.html  comment.html                         images        product_detail.html

3.3实现自动部署

上面已经完成了Jenkins从gitlab上拉取代码,现在需要实现如何将源码自动部署到web服务器上,这里使用脚本的方式来实现,Jenkins支持执行脚本的功能。

1.在Jenkins服务器上面编写同步脚本,由于是通过脚本拷贝到web服务器的站点目录,所以需要先做一个ssh秘钥认证
[root@jenkins ~]# ssh-copy-id -i 10.0.0.7
[root@jenkins ~]# ssh-copy-id -i 10.0.0.8
[root@jenkins /server/scripts]# vim deploy.sh 
#项目目录
CODE_DIR=/var/lib/jenkins/workspace/yiliao/
#时间格式
DATE_TIME=`date +%Y-%m-%d-%H-%M-%S`
#打包后的名字
TAR_NAME=web-${DATE_TIME}.tar.gz
#web服务器站点目录的上一级 "/usr/share/nginx/html"
WEB_DIR=/usr/share/nginx/
#web服务器新建的站点目录名字
WEB_NEWDIR_NAME=web-${DATE_TIME}
#进入到项目目录上一级打包代码
cd $CODE_DIR && tar czf /opt/$TAR_NAME ./*
for i in {7,8}
do
#拷贝到web服务器的站点目录的上一级
    scp /opt/$TAR_NAME 10.0.0.${i}:$WEB_DIR
#连接web服务器进行解压压缩包到新的一个已时间命名的站点目录
    ssh 10.0.0.$i "cd $WEB_DIR && mkdir $WEB_NEWDIR_NAME && tar xf $TAR_NAME -C $WEB_NEWDIR_NAME"
#将新建的站点目录与html站点目录做一个软链接
    ssh 10.0.0.$i "cd $WEB_DIR && rm -rf html && ln -s $WEB_NEWDIR_NAME html"
    ssh 10.0.0.$i "cd $WEB_DIR && rm -rf $TAR_NAME"
    sleep 3
done
2.配置Jenkins,使用Jenkins调用部署脚本(此处写脚本全路径脚本名称)
GitLab+Jenkins实现持续集成+自动化部署_第47张图片
3.立即构建
GitLab+Jenkins实现持续集成+自动化部署_第48张图片
4.查看输出结果
GitLab+Jenkins实现持续集成+自动化部署_第49张图片
5.测试访问结果

3.4自动更新

1.配置自动触发构建、需要设置安全令牌Secret token,进入项目选择配置,设置相关信息,然后生成token,复制token(需要填写到gitlab上面)和Build when a chang上面提示的URL地址( http://10.0.0.57:8080/project/yiliao)

选择构建触发器,然后选择build when a change is ....,下方有个高级选项后然后选择Filter branches byname,然后输入master分支,再点击下面的Generate生成token,然后点击保存。


GitLab+Jenkins实现持续集成+自动化部署_第50张图片
2.配置gitlab,添加token

点击项目→设置→设置→集成,然后输入Jenkins上面提示的URL地址和和生成的token,点击增加web钩子。


GitLab+Jenkins实现持续集成+自动化部署_第51张图片
3.测试Web钩子

添加完钩子完成后可以测试,选择Push event,执行完会显示上面的提示。


GitLab+Jenkins实现持续集成+自动化部署_第52张图片
4.上面已经配置完成,接下来就是测试,我们知道目前web服务站点访问得到结果如上面, 这里gitlab服务器下载的代码并进行修改,然后推送gitlab仓库。这里去除首页的右上角的English版本。

修改首页内容:


GitLab+Jenkins实现持续集成+自动化部署_第53张图片
5.推送新的修改源码
[root@gitlab ~/yiliaoqixie]# git add .
[root@gitlab ~/yiliaoqixie]# git commit -m "第二次提交"
[master 4b8d377] 第二次提交
[root@gitlab ~/yiliaoqixie]# git push -u origin --all
6.测试访问

之前的结果如下图:



现在的结果:


3.5配置构建Jenkins返回构建状态gitlab

1.现在gotlab上面生成访问令牌token,点击用户处的设置
GitLab+Jenkins实现持续集成+自动化部署_第54张图片
2.访问令牌——>输入名称——>选择范围为api——>创建个人访问令牌,将生成的令牌token复制
GitLab+Jenkins实现持续集成+自动化部署_第55张图片
3.登录Jenkins———>选择系统管理——>选择系统设置——>选择Gitlab——>输入名字——>输入URL———>点击Add
GitLab+Jenkins实现持续集成+自动化部署_第56张图片
4.上面点击Add进来后,kind处选择Gitlab API token,粘贴上面复制的token,自定义ID和描述
GitLab+Jenkins实现持续集成+自动化部署_第57张图片
5.上面添加后,回到这里选择刚刚生成的这个token。然后点击保存
GitLab+Jenkins实现持续集成+自动化部署_第58张图片
6.上面保存后,进入到项目里选择配置,配置构建后操作,选择Publish ... to ...Gitlab,选择后直接保存就ok
GitLab+Jenkins实现持续集成+自动化部署_第59张图片
7.测试,点击立即构建
GitLab+Jenkins实现持续集成+自动化部署_第60张图片
8.回到gitlab上面查看,那里生成了一个对号
GitLab+Jenkins实现持续集成+自动化部署_第61张图片
9.点击对号,进来后可以看到流水线,下面一些信息,比如状态,提交等。
GitLab+Jenkins实现持续集成+自动化部署_第62张图片
10.点击上面Status下面的对号,可以看到如下图一样的有个jenkins-success
GitLab+Jenkins实现持续集成+自动化部署_第63张图片
11.再点击jenkins就跳转到jenkins上面去了,也可以查看输出,还可以查看工作空间,可以查看到所有代码,返回的话只能选择后退。
GitLab+Jenkins实现持续集成+自动化部署_第64张图片

GitLab+Jenkins实现持续集成+自动化部署_第65张图片

GitLab+Jenkins实现持续集成+自动化部署_第66张图片

四.java项目代码上线

1)最终目标:对JAVA项目实现CI/CD
2)把代码存到GitLab
3)使用Maven编译并打包源码
4)将war包部署到Tomcat

4.1安装maven

请参考链接文档进行安装:https://www.jianshu.com/p/b7dfc7c357ca

4.2在jenkins中调用maven

点击系统管理→全局工具配置


GitLab+Jenkins实现持续集成+自动化部署_第67张图片

在Maven 配置这里分别设置默认和默认全局settings提供


GitLab+Jenkins实现持续集成+自动化部署_第68张图片

下拉到Maven,点击“新增Maven”,Name这里自定义即可,然后把“自动安装”前面方框里的对勾取消,填写MAVEN HOME为/usr/local/maven


GitLab+Jenkins实现持续集成+自动化部署_第69张图片

配置JDK

之所以要配置JDK是因为后续的Maven操作需要设置JAVA_HOME这个变量。点击“系统管理”、“全局工具配置”,下拉到JDK,点击“JDK安装”,“别名”设置为jdk,“JAVA_HOME”设置为/usr/java/jdk


GitLab+Jenkins实现持续集成+自动化部署_第70张图片

这个JAVA_HOME路径其实就是你的JDK安装路径,如果用yum安装的openjdk,则在/usr/lib/jvm/java-xxxx(这里的xxxx是jdk版本)。

4.3用Jenkins部署JAVA项目

4.3.1安装插件
首先需要安装Maven Integration plugin 和 Deploy to container Plugin。
到Jenkins逐次点击系统管理、插件管理、可选插件,在右上角的“过滤”文本框里输入“integration”,会出现两个插件,选择下面的插件,点击直接安装。

GitLab+Jenkins实现持续集成+自动化部署_第71张图片

GitLab+Jenkins实现持续集成+自动化部署_第72张图片

等它安装完后,用同样的方式再安装Deploy to container。


GitLab+Jenkins实现持续集成+自动化部署_第73张图片

两个插件完成安装后,重启一下Jenkins服务

[root@jenkins ~]# systemctl restart jenkins

4.3.2模拟开发建立git本地工作目录和本地仓库

#这里的源码使用的码云上源码,你可以自行下载使用即可。
[root@gitlab ~]# mkdir /jeesns
[root@gitlab ~]# cd /jeesns/
[root@gitlab /jeesns]#
[root@gitlab ~/jeesns]# git config --global user.name "Administrator"
[root@gitlab ~/jeesns]# git config --global user.email "[email protected]"
[root@gitlab ~/jeesns]# git init
Initialized empty Git repository in /jeesns/.git/
[root@gitlab ~/jeesns]# git add .
[root@gitlab ~/jeesns]# git commit -m "第一次提交项目"
[root@gitlab ~/jeesns]# git remote add origin [email protected]:jeesns/jeesns.git
[root@gitlab ~/jeesns]# git push -u origin --all

web界面查看项目


GitLab+Jenkins实现持续集成+自动化部署_第74张图片

4.3.3新建任务
重启完成后,再次访问Jenkins的WEB界面,点击左侧的“新建任务”,任务名称自定义(jeesns),选择“构建一个maven项目”

GitLab+Jenkins实现持续集成+自动化部署_第75张图片

点击左下角的“确定”按钮后,进入配置页,下拉到“源码管理”,点击"git",“Repositories"填写GitLab的jeesns项目地址
GitLab+Jenkins实现持续集成+自动化部署_第76张图片

这里需要如之前的一样将Jenkins的服务器上生成秘钥的公钥塞到gitlab的用户的sshkey下,也可以点击“添加”按钮,紧接着点击“Jenkins”进入如下页面
GitLab+Jenkins实现持续集成+自动化部署_第77张图片

类型选择“SSH Username with private key”,username填写git,Private Key右侧小圆点点击一下,把在git客户端生成的私钥(/root/.ssh/id_rsa)粘贴到此处,最后点“添加”,返回到刚才的页面,Credentials这里选择刚刚添加的“git”
GitLab+Jenkins实现持续集成+自动化部署_第78张图片

Pre Steps设置,这里可以设置切换数据库,生产中可以用于切换测试库和生产库


GitLab+Jenkins实现持续集成+自动化部署_第79张图片

build 构建设置,这里设置源码编译的参数


GitLab+Jenkins实现持续集成+自动化部署_第80张图片

Post Steps设置,这里在源码包编译完成后通过ansible实现代码的批量上线
GitLab+Jenkins实现持续集成+自动化部署_第81张图片

你可能感兴趣的:(GitLab+Jenkins实现持续集成+自动化部署)