部署CI/CD(Jenkins项目管理)

管理Jenkins项目

  • 创建Jenkins项目
  • 修改Jenkins项目配置

实验环境准备):

  • 1)5台RHEL8虚拟机,主机名分别为develop、git、jenkins、web1和web2。
  • 2)develop主机的IP地址为192.168.4.10,不需要配置网关和DNS。
  • 3)git主机的IP地址为192.168.4.20,不需要配置网关和DNS。
  • 4)jenkins主机的IP地址为192.168.4.30,不需要配置网关和DNS。
  • 5)web1和web2主机的IP地址分别为192.168.4.100和192.168.4.200,不需要配置网关和DNS。
  • 6)所有主机都需要配置可用的系统YUM源,设置防火墙信任所有,SELinux放行所有。

跨网段走路由,相同网段不需要配置网关就可以互联互通

部署CI/CD(Jenkins项目管理)_第1张图片

程序类型:编译型(如C、C++)和解释型(如Python、JavaScript)。

CI/CD流程:Jenkins下载代码、打包代码、编译代码、测试代码、上线服务器。

步骤

浏览器访问Jenkins服务器8080端口。     #有公私钥的前提下,已经创建仓库成功的情况下

firefox或google-chrome http://192.168.4.30:8080

部署CI/CD(Jenkins项目管理)_第2张图片部署CI/CD(Jenkins项目管理)_第3张图片

 

默认Jenkins会拉取最新版本的代码,这里的设置可以让Jenkins拉取特定的分支或标签(tag)的代码。注意:这里的git参数名称后面会经常用到!

部署CI/CD(Jenkins项目管理)_第4张图片

 

继续设置Git参数,定义Git仓库的URL路径,以及需要下载克隆的版本或分支,注意这里的URL是前面课程GitLab创建的代码仓库的链接地址

部署CI/CD(Jenkins项目管理)_第5张图片

 

构建(build)Jenkins项目

首先需要找到刚刚常见的项目

部署CI/CD(Jenkins项目管理)_第6张图片部署CI/CD(Jenkins项目管理)_第7张图片

 

此时Jenkins会自动连接GitLab服务器获取仓库数据,我们可以选择一个版本,点击《开始构建》

部署CI/CD(Jenkins项目管理)_第8张图片

接下来可以在控制台中查看构建日志,查看构建过程

部署CI/CD(Jenkins项目管理)_第9张图片

  1. [root@jenkins ~]# ls /var/lib/jenkins/workspace/myweb/
  2. [root@jenkins ~]# rm -rf /var/lib/jenkins/workspace/myweb/*         #将原来拉取的所有代码全部删除
  3. [root@jenkins ~]# ls /var/lib/jenkins/workspace/myweb/

 

修改项目配置

如果代码有多个版本或分支,每次都将代码拉取到相同位置,会产生数据覆盖,我们可以修改项目配置,将不同的版本和分支数据保存到不同子目录下

点击《配置》,重新修改Jenkins项目配置

部署CI/CD(Jenkins项目管理)_第10张图片部署CI/CD(Jenkins项目管理)_第11张图片部署CI/CD(Jenkins项目管理)_第12张图片

 

再次构建项目,并查看数据。

部署CI/CD(Jenkins项目管理)_第13张图片    #查看生成的文件为以下结果

在Jenkins服务器查看数据(在192.168.4.30主机操作)

[root@jenkins ~]# ls /var/lib/jenkins/workspace/myweb/
        myweb-v1

设置邮件通知,在构建失败时可以给特定人员发送邮件,效果如图

部署CI/CD(Jenkins项目管理)_第14张图片

 

 构建分发服务器

装、配置FTP共享服务器(仅在192.168.4.30主机操作)

设置防火墙、SELinux。

  1. [root@jenkins ~]# firewall-cmd --set-default-zone=trusted
  2. [root@jenkins ~]# setenforce 0
  3. [root@jenkins ~]# sed -i '/SELINUX/s/enforcing/permissive/' /etc/selinux/config、

 安装配置vsftpd、启动服务

  1. [root@jenkins ~]# dnf -y install vsftpd                          #安装软件
  2. [root@jenkins ~]# vim /etc/vsftpd/vsftpd.conf              #修改vsftpd配置文件
  3.                   anonymous_enable=YES                            #12行 #允许匿名访问ftp
  4. [root@jenkins ~]# mkdir -p /var/ftp/deploy/packages        #创建目录,未来jenkins将拉取的代码数据拷贝到该目录,共享给应用服务器       #-p是创建多级子目录
  5. [root@jenkins ~]# chown -R :jenkins /var/ftp/deploy/       #修改权限将目录所属组修改为jenkins
  6. [root@jenkins ~]# chmod -R 775 /var/ftp/deploy/             #修改权限让jenkins组对该目录有读写权限
  7. [root@jenkins ~]# systemctl enable vsftpd --now             #设置服务为开机自启动服务,并立刻启动该服务

修改项目配置,添加构建步骤。

部署CI/CD(Jenkins项目管理)_第15张图片

编写构建脚本,脚本内容如下

  1. pkg_dir=/var/ftp/deploy/packages       #定义变量pkg_dir,变量值为ftp共享目录
  2. cp -r myweb-$web $pkg_dir                #将jenkins拉取到/var/lib/Jenkins/workspace/myweb-$web目录的数据拷贝的ftp共享目录。
  3. rm -rf $pkg_dir/myweb-$web/.git         #上一步拷贝过来的数据目录下包含一个隐藏.git目录,删除该git仓库目录。历史记录文件
  4. cd $pkg_dir/                                         #cd到ftp共享目录下。
  5. tar czf myweb-$web.tar.gz myweb-$web          #将ftp共享目录下的代码数据打包。
  6. rm -rf myweb-$web                               #将ftp共享目录下的代码数据目录删除(上一步已经打包数据)。
  7. md5sum myweb-$web.tar.gz | awk '{print $1}' > myweb-$web.tar.gz.md5         #校验打包文件的HASH值,并将结果写入到一个文件中。
  8. cd ..                                            #返回上一级目录。
  9. echo -n $web > ver.txt                #将当前Git版本信息写入ver.txt文件。

重新构建项目,查看数据。

部署CI/CD(Jenkins项目管理)_第16张图片

使用浏览器访问FTP服务,查看数据。

firefox 或者google-chrom 访问ftp://192.168.4.30/deploy/packages/

部署CI/CD(Jenkins项目管理)_第17张图片


自动化上线

部署web服务器完成自动化上线,具体要求如下:

  • 安装配置httpd
  • 编写上线脚本
  • 完成整个工作流程

设置防火墙和SELinux

  1. [root@web1 ~]# firewall-cmd --set-default-zone=trusted
  2. [root@web1 ~]# setenforce 0
  3. [root@web1 ~]# sed -i '/SELINUX/s/enforcing/permissive/' /etc/selinux/config
  4.  
  5. [root@web2 ~]# firewall-cmd --set-default-zone=trusted
  6. [root@web2 ~]# setenforce 0
  7. [root@web2 ~]# sed -i '/SELINUX/s/enforcing/permissive/' /etc/selinux/config

安装、配置httpd。

  1. [root@web1 ~]# dnf -y install httpd wget tar              #安装httpd、tar和wget
  2. [root@web1 ~]# systemctl enable httpd --now          #设置开启自启,并立刻启动
  3.  
  4. [root@web2 ~]# dnf -y install httpd wget tar              #安装httpd、tar和wget
  5. [root@web2 ~]# systemctl enable httpd --now          #设置开启自启,并立刻启动

编写自动化上线脚本

web1和web2自动从jenkins共享服务器下载代码实现持续部署,可以结合计划任务实现周期性自动上线持续部署。

[root@web1 ~]# vim web.sh

  1. #!/bin/bash
  2. #定义变量,指定FTP共享路径
  3. ftp_url=ftp://192.168.4.30/deploy
  4. #定义变量,指定网页根路径
  5. web_dir=/var/www/html
  6. #定义函数,行数名为down_file,该函数的作用是从FTP服务器下载代码数据到网站根目录
  7. down_file(){
  8. #获取FTP服务器上面最新构建的代码版本号
  9. #curl是基于命令行的浏览器,-s选项为静默访问,不显示下载过程(可以自己对比不是用-s的差异)
  10. version=$(curl -s $ftp_url/ver.txt)
  11. #将服务器上面的版本文件下载到web服务器的/var/www/html/目录下
  12. #wget为下载工具(如果没有则需要安装),-q选项为静默模式下载,不显示下载过程
  13. #-O选项可以指定将文件下载到哪里,这里是下载到/var/www/html/ver.txt
  14. wget -q $ftp_url/ver.txt -O $web_dir/ver.txt
  15. #下载代码数据的打包文件,根据前面获取的版本号,下载对应的版本数据打包文件
  16. wget -q $ftp_url/packages/myweb-$version.tar.gz -O $web_dir/myweb-$version.tar.gz
  17. #对下载下来的数据打包文件计算HASH值(哈希值),awk过滤仅显示第一列数据结果
  18. hash=$(md5sum $web_dir/myweb-$version.tar.gz| awk '{print $1}')
  19. #使用curl访问ftp服务器上面的HASH值
  20. ftp_hash=$(curl -s $ftp_url/packages/myweb-$version.tar.gz.md5)
  21. #对比本地和FTP服务的HASH值是否一致,如果不一致代表数据损坏了
  22. #如果一致就可以解压该数据包,将数据解压到网站根目录下/var/www/html/
  23. if [ "$hash" == "$ftp_hash" ];then
  24. tar -xf $web_dir/myweb-$version.tar.gz -C $web_dir
  25. fi
  26. }
  27.  
  28. #判断如果本地没有/var/www/html/ver.txt文件,则直接调用前面的函数下载代码数据
  29. if [ ! -f $web_dir/ver.txt ];then
  30. down_file
  31. fi
  32. #盘如果本地有/var/www/html/ver.txt文件,则判断本地版本文件和FTP版本文件是否一致
  33. #一致就不再下载FTP的数据,如果不一致则调用前面的函数下载新的代码数据包
  34. if [ -f $web_dir/ver.txt ];then
  35. ftp_ver=$(curl -s $ftp_url/ver.txt)
  36. local_ver=$(cat $web_dir/ver.txt)
  37. if [ "$ftp_ver" != "$local_ver" ];then
  38. down_file
  39. fi
  40. fi

[root@web1 ~]# chmod +x web.sh       #添加可执行权限

[root@web1 ~]# ./web.sh                     #执行脚本
[root@web1r ~]# ls /var/www/html/
     myweb-v1  myweb-v1.tar.gz  ver.txt

完成整理工作流程。

工作流程

开发人员编写代码,将代码上传到GitLab服务器,Jenkins从GitLab服务器上面拉取最新代码数据到本地,根据Jenkins项目配置,将代码拉取到本地后,可以进行编译、测试、打包等工作,最后将数据包写入到共享服务器,应用服务器最后从共享服务器拉取数据实现上线功能。

开发人员修改代码、上传代码(主机192.168.4.10操作)

  1. [root@develop ~]# cd myproject                      #进入仓库目录
  2. [root@develop myproject]# vim index.html        #修改首页文件第4行内容
  3. 修改前:
  4. Home
  5. 修改后:
  6. Tarena
  7. [root@develop myproject]# git add .                  #添加修改记录
  8. [root@develop myproject]# git commit -m "modify index"          #提交修改
  9. [root@develop myproject]# git tag v2                     #添加代表版本标签
  10. [root@develop myproject]# git push origin master         #推送数据到服务器
  11. [root@develop myproject]# git push origin v2              #推送数据到服务器

Jenkins重新构建项目

部署CI/CD(Jenkins项目管理)_第18张图片

在web服务器执行上线脚本完成持续部署。

在192.168.4.100和192.168.4.200操作,这里仅以web1为例

[root@web1 ~]# ./web.sh

浏览器访问(标签会变为   Tarena    )

http://192.168.4.100/myweb-v2/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的