1、jenkins简介

        Jenkins是一个可扩展的持续集成引擎。

        持续集成,就是通常所说的CI(Continues Integration),可以说是现代软件技术开发的基础。

        持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员至少集成一次,也意味着每天可能会发生多次集成。

        每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。

1.1、作用 

  • 持续、自动地构建、测试软件项目。
  • 监控一些定时执行的任务。

1.2、工作流程




jenkins增加任务环境变量 jenkins 增量部署_运维


 

  • 开发者写代码上传gitlab
  • jenkins帮我们到gitlab里面把最新代码拉取出来(clone),jenkins通过插件可以对拉取的代码完成自动化测试。测试完成后,可以自带把代码(编译,打包....)。创建一个共享目录,把打包的代码共享出去(比如NFS共享或者FTP共享)
  • web1,web2这样的服务器就可以自动到jenkins共享里面下载代码,让用户访问

1.3、jenkins 相关网站

  • Jenkins官网:https://jenkins.io/
  • Jenkins官网文档:https://www.jenkins.io/zh/doc/
  • Jenkins学习文档:https://www.w3cschool.cn/jenkins/jenkins-5h3228n2.html
  • jenkins安装包:http://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/
  • OpenJDK:http://jdk.java.net/java-se-ri/11
  • 清华镜像:https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/

2、部署Jenkins服务器

2.1、环境准备

jenkins:192.168.4.30(RHEL8的系统)

关闭防火墙、SELinux

  • jenkins是使用java写的程序,所以运行jenkins需要java环境
  • jenkins需要到gitlab上面拉取代码,所以需要安装git
  • jenkins如果有故障,需要发邮件报警,所以需要安装postfix和mailx程序
  • postfix是发邮件的邮件服务器程序,mailx是收取邮件的客户端软件
[root@jenkins ~]# yum -y install git java-11-openjdk postfix mailx
[root@jenkins ~]# systemctl enable postfix
[root@jenkins ~]# systemctl start postfix

 2.2、安装jenkins

[root@jenkins ~]# yum -y install ./jenkins-2.358-1.1.noarch.rpm 
[root@jenkins ~]# systemctl start jenkins.service 
[root@jenkins ~]# systemctl enable jenkins.service

2.3、登录web页面

  • firefox浏览器访问Jenkins页面(http://192.168.4.30:8080)
  • 第一次访问会提示初始密码的位置,粘贴到网页中,点击《继续》 
[root@jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword 
bdd08c16204f471d8ecd5c4787bdf289

jenkins增加任务环境变量 jenkins 增量部署_java_02

  •  选择插件来安装

jenkins增加任务环境变量 jenkins 增量部署_jenkins增加任务环境变量_03

jenkins增加任务环境变量 jenkins 增量部署_jenkins_04

  •  使用默认的admin用户登录,完成初始化操作

jenkins增加任务环境变量 jenkins 增量部署_jenkins_05

  • 保存并完成 

 

jenkins增加任务环境变量 jenkins 增量部署_jenkins_06

  •  开始使用jenkins

jenkins增加任务环境变量 jenkins 增量部署_jenkins_07

 2.4、管理Jenkins插件、系统配置

2.4.1、重置管理员密码

jenkins增加任务环境变量 jenkins 增量部署_jenkins_08

  •  删除老密码,修改新的密码,点击“save”

jenkins增加任务环境变量 jenkins 增量部署_jenkins增加任务环境变量_09

  •  修改密码后,网站自动退出,重新使用新密码登录

jenkins增加任务环境变量 jenkins 增量部署_运维_10

 2.4.2、插件管理

  • 默认Jenkins是英文界面,如果需要中文需要安装中文插件
  • 默认Jenkins不支持git,需要安装插件支持Git
  • 插件下载地址:https://github.com/metersphere/jenkins-plugin/releases
  • 注意:Jenkins存放插件的目录是固定的:/var/lib/jenkins/plugins/,在192.168.4.30操作
[root@jenkins ~]# ls
anaconda-ks.cfg  jenkins-2.358-1.1.noarch.rpm  jenkins-plugin-1.20.9-lts-rc.tar.gz
[root@jenkins ~]# yum -y install tar
[root@jenkins ~]# tar -xf jenkins-plugin-1.20.9-lts-rc.tar.gz 
[root@jenkins ~]# cp -rp jenkins-plugin-1.20.9-lts-rc
jenkins-plugin-1.20.9-lts-rc/        jenkins-plugin-1.20.9-lts-rc.tar.gz  
[root@jenkins ~]# cp -rp jenkins-plugin-1.20.9-lts-rc/* /var/lib/jenkins/plugins/  # -p代表保留权限
[root@jenkins ~]# systemctl restart jenkins.service
  • 重新登录Jenkins网页控制台,点击Jenkins→Manage Jenkins→Manage Plugins

jenkins增加任务环境变量 jenkins 增量部署_jenkins增加任务环境变量_11

  • 点击已安装,就能看到刚才拷贝的插件

jenkins增加任务环境变量 jenkins 增量部署_运维_12

2.4.3、设置邮箱

  • 如果jenkins有错误,可以报警,也可以不设置



jenkins增加任务环境变量 jenkins 增量部署_jenkins_13


  •  SMTP服务器是本机写:localhost,邮件后缀是@localhost,给root@localhost发一个邮件测试一下,如果OK,点击保存。


jenkins增加任务环境变量 jenkins 增量部署_git_14


2.5、创建并设置Jenkins的任务

  • 安装部署了jenkins软件,如果想让jenkins自己干活,需要在jenkins中创建任务

2.5.1、准备一份构建的项目代码素材

[root@gitlab ~]# cd gitlabtest/
[root@gitlab gitlabtest]# cp -r www_template/* /root/gitlabtest/
[root@gitlab gitlabtest]# git add .
[root@gitlab gitlabtest]# git commit -m "add web"
[root@gitlab gitlabtest]# git push -u origin master
[root@gitlab gitlabtest]# git log --oneline
[root@gitlab gitlabtest]# git tag v1
[root@gitlab gitlabtest]# git push -u origin v1

2.5.2、新建任务

jenkins增加任务环境变量 jenkins 增量部署_java_15

  • 给任务设置一个名称:myweb(名称可以任意)


jenkins增加任务环境变量 jenkins 增量部署_jenkins增加任务环境变量_16


  • 勾选参数化构建过程→添加参数→git参数

jenkins增加任务环境变量 jenkins 增量部署_git_17

  • 定义git参数的名称和描述 

jenkins增加任务环境变量 jenkins 增量部署_git_18

  • 定义源码管理

jenkins增加任务环境变量 jenkins 增量部署_运维_19

  •  查看任务,点击myweb就能进入任务


jenkins增加任务环境变量 jenkins 增量部署_java_20


  • 点击Build with Parameters→选择v1→开始构建

说明:如果没有v1,则需要到git客户端执行git tag创建标签,git push回传

jenkins增加任务环境变量 jenkins 增量部署_jenkins增加任务环境变量_21

  • 绿色代表成功,红色代表失败

jenkins增加任务环境变量 jenkins 增量部署_运维_22

  • 点击这个小球,可以查看日志,可以看到jenkins自动做了git clone拉取了代码

jenkins增加任务环境变量 jenkins 增量部署_jenkins增加任务环境变量_23

 

  • 代码拉取到了jenkins电脑的/var/lib/jenkins/workspace/myweb
[root@jenkins ~]# ls /var/lib/jenkins/workspace/
myweb
[root@jenkins ~]# ls /var/lib/jenkins/workspace/myweb/
404.html  about.html  blog.html  contact.html  css  images  index.html  js  README.md  single.html  work.html  说明.txt



注意:默认Jenkins拉取代码都是存放到/var/lib/jenkins/workspace/myweb目录下,如果多次拉取不同版本,会导致数据被覆盖。为了避免这种情况,拉取v1版代码,最好能在myweb下创建一个子目录v1,拉取v2版代码,最好能在myweb下创建一个子目录v2。

  • 点击jenkins→myweb进入任务


jenkins增加任务环境变量 jenkins 增量部署_jenkins_24


  •  点击配置

jenkins增加任务环境变量 jenkins 增量部署_java_25

  • 找到Additional Behaviours→新增→选择Check out to a sub-directory→仓库的本地子目录(名称可以任意)→保存



jenkins增加任务环境变量 jenkins 增量部署_java_26


  • 点击Build with parameters→v1→开始构建



jenkins增加任务环境变量 jenkins 增量部署_jenkins增加任务环境变量_27


  •  打开jenkins虚拟机验证
[root@jenkins ~]# rm -rf /var/lib/jenkins/workspace/myweb/*
[root@jenkins ~]# ls /var/lib/jenkins/workspace/myweb/
myweb-v1
[root@jenkins ~]# rm -rf /var/lib/jenkins/workspace/myweb/*
[root@jenkins ~]# ls /var/lib/jenkins/workspace/myweb/
myweb-v1

2.6、配置FTP共享



jenkins增加任务环境变量 jenkins 增量部署_jenkins增加任务环境变量_28


 

        现在Jenkins已经可以到gitlab上面拉取代码到本地/var/lib/jenkins/workspace/,下面就需要在Jenkins服务器上做一个FTP共享,因为文件多不方便管理,然后把拉取的代码打包(tar,war,zip),把这个包放到ftp共享目录。

2.6.1、在Jenkins服务器上安装ftp的软件包

[root@jenkins ~]# yum -y install vsftpd
[root@jenkins ~]# vim /etc/vsftpd/vsftpd.conf 
 12 anonymous_enable=YES         # 改成YES,允许匿名访问ftp
  • 在FTP软件里面创建一个共享目录,等会用来存代码共享给应用服务器(目录名称可以任意)
[root@jenkins ~]# mkdir -p /var/ftp/deploy/packages
[root@jenkins ~]# chown -R :jenkins /var/ftp/deploy/    # 修改权限将目录所属组修改为jenkins
[root@jenkins ~]# chmod -R 775 /var/ftp/deploy/         # 修改权限让jenkins组对该目录有读写权限
[root@jenkins ~]# systemctl enable vsftpd
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
[root@jenkins ~]# systemctl start vsftpd

2.6.2、接下来修改任务,让Jenkins自动打包代码,放到FTP共享目录下

jenkins增加任务环境变量 jenkins 增量部署_jenkins增加任务环境变量_29

  • 在构建下面,点击增加构建步骤→Execute

jenkins增加任务环境变量 jenkins 增量部署_jenkins_30

  • 编辑项目构建的shell脚本,点击保存
  • shell脚本说明:

        # 定义ftp共享目录的变量

        pkg_dir=/var/ftp/deploy/packages

        # myweb-$web就是Jenkins拉取代码的路径,把拉取的代码拷贝到ftp共享目录下

        cp -r myweb-$web $pkg_dir

        # 把拉取的隐藏目录.git给删除(我们需要最新版,而不需要所有历史版本)

        rm -rf $pkg_dir/myweb-$web/.git

        # cd到ftp共享目录下

        cd $pkg_dir/

        # 把ftp里面的代码整体打包,做成tar包

        tar czf myweb-$web.tar.gz myweb-$web

        # 有了tar包,原来的目录就可以删除

        rm -rf myweb-$web

        # 校验文件的Hash值,放到一个文件中

 md5sum myweb-$web.tar.gz | awk '{print $1}' > myweb-$web.tar.gz.md5

        cd ..

        # 找一个文件,记录当前操作的版本

        echo -n $web > ver.txt

2.6.3、构建前ftp共享目录是空的

[root@jenkins ~]# ls /var/ftp/deploy/packages/

jenkins增加任务环境变量 jenkins 增量部署_jenkins增加任务环境变量_27

  • 构建后,Jenkins自动放入内容到ftp共享目录
[root@jenkins ~]# ls /var/ftp/deploy/packages/
myweb-v1.tar.gz  myweb-v1.tar.gz.md5
[root@jenkins ~]# ls /var/ftp/deploy/
packages  ver.txt

2.7、配置web服务器

jenkins增加任务环境变量 jenkins 增量部署_jenkins增加任务环境变量_28



2.7.1、安装httpd做web服务器

[root@web ~]# yum -y install httpd
[root@web ~]# systemctl enable httpd --now
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

2.7.2、方式一:人为的下载共享目录的代码,再放到web网页 

[root@web ~]# yum -y install wget tar
[root@web ~]# wget ftp://192.168.4.80/deploy/packages/myweb-v1.tar.gz
[root@web ~]# tar -xf myweb-v1.tar.gz -C /var/www/html/
[root@web ~]# ls /var/www/html/
myweb-v1

2.7.3、方式二:编写脚本,将脚本放到计划任务自动完成

[root@web ~]# vim web.sh


#!/bin/bash

ftp_url=ftp://192.168.4.80/deploy      # 定义变量:FTP共享目录
web_dir=/var/www/html                  # 定义变量:网页根路径

# 定义函数:down_file(该函数的作用是从FTP服务器下载代码数据到网站根目录)
down_file(){

 # 获取FTP服务器上面最新构建的代码版本号,curl是基于命令行的浏览器,-s选项为静默访问,不显示下载过程
version=$(curl -s $ftp_url/ver.txt)  

# 将服务器上面的版本文件下载到web服务器的/var/www/html/目录下,-q选项为静默模式下载,不显示下载过程,-O选项可以指定将文件下载到哪里
wget -q $ftp_url/ver.txt -O $web_dir/ver.txt 

# 下载代码数据的打包文件,根据前面获取的版本号,下载对应的版本数据打包文件
wget -q $ftp_url/packages/myweb-$version.tar.gz -O $web_dir/myweb-$version.tar.gz

# 对下载下来的数据打包文件计算HASH值(哈希值),awk过滤仅显示第一列数据结果
hash=$(md5sum $web_dir/myweb-$version.tar.gz| awk '{print $1}')

# 使用curl访问ftp服务器上面的HASH值
ftp_hash=$(curl -s $ftp_url/packages/myweb-$version.tar.gz.md5)

# 对比本地和FTP服务的HASH值是否一致,如果不一致代表数据损坏了
# 如果一致就可以解压该数据包,将数据解压到网站根目录下/var/www/html/
if [ "$hash" == "$ftp_hash" ];then
tar -xf $web_dir/myweb-$version.tar.gz -C $web_dir
fi
}

# 判断如果本地没有/var/www/html/ver.txt文件,则直接调用前面的函数下载代码数据
if [ ! -f $web_dir/ver.txt ];then
down_file
fi

# 盘如果本地有/var/www/html/ver.txt文件,则判断本地版本文件和FTP版本文件是否一致
# 一致就不再下载FTP的数据,如果不一致则调用前面的函数下载新的代码数据包
if [ -f $web_dir/ver.txt ];then
ftp_ver=$(curl -s $ftp_url/ver.txt)
local_ver=$(cat $web_dir/ver.txt)
if [ "$ftp_ver" != "$local_ver" ];then
down_file
fi
fi


[root@web ~]# chmod +x web.sh
[root@web ~]# ./web.sh