Jenkins 持续集成+自动化部署上线

2018年9月19日15:12:32 4 5,174 views
摘要

jenkins自动化部署项目,通过jenkins 部署来节省运维时间,不需要手动cp上线及版本发布

广告也精彩

自动化运维之DevOps

  DevOps(英文Development(开发)和Operations(技术运营)的组合)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。
  它的出现是由于软件行业日益清晰地认识到:为了按时交付软件产品和服务,开发和运营工作必须紧密合作

简单的来说DevOps是一种文化,是让开发、运维、测试能够之间沟通和交流

  自动化运维工具:saltstack、jenkins、等。因为他们的目标一样,为了我们的软件、构建、测试、发布更加的敏捷、频繁、可靠.
  如果运维对git不熟,是无法做自动化部署。git常用命令总结

一、持续集成组件简介

Jenkins 介绍

Jenkins只是一个平台,真正运作的都是插件。这就是jenkins流行的原因,因为jenkins什么插件都有,Hudson是Jenkins的前身,是基于Java开发的一种持续集成工具,用于监控程序重复的工作,Hudson后来被收购,成为商业版。后来创始人又写了一个jenkins,jenkins在功能上远远超过hudson

Jenkins官网:https://jenkins.io/

Gitlab 介绍

  GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。
  GitLab拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。
gitlab官网:https://about.gitlab.com/
gitlab服务器配置: 建议2c4G

上面介绍了持续集成及Devops的基础内容,下面是安装部署

二、jenkins+gitlab 快速部署

Jenkins + Gitlab 安装部署传送门

Jenkins 持续集成+自动化部署上线
Jenkins 持续集成+自动化部署上线

三、持续集成之实战

环境介绍

服务器系统 IP 主机名 配置
CentOS7.2 x86_64 192.168.56.11 Jenkins 2c4G
CentOS7.2 x86_64 192.168.56.13 Gitlab 2c4G

Jenkins所需插件

Gitlab Hook           # gitlab钩子,push代码后自动触发拉取操作 
Publish Over SSH      # scp拷贝插件 (主要是将包拷贝到web服务器上) 
Build Authorization   # 钩子触发器 

操作步骤:

  • 配置 jenkins(构建)
  • gitlab与jenkins结合,添加认证(公私秘钥)
  • 建立git仓库
  • 立即构建

1,配置 jenkins(构建)

192.168.56.13 gitlab.example.com
# 添加gitlab hosts解析 方便使用

Jenkins 持续集成+自动化部署上线
添加项目
Jenkins 持续集成+自动化部署上线
General选项配置
Jenkins 持续集成+自动化部署上线

2, gitlab与jenkins结合

1)源码管理
gitlab所以安装git插件即可
Jenkins 持续集成+自动化部署上线
我们将git路径存在这里还需要权限认证,否则会出现error
Jenkins 持续集成+自动化部署上线
2)添加一个认证
Jenkins 持续集成+自动化部署上线
选择一下认证方式(我们可以在系统管理-->凭证配置)里面进行设置
#提示:gitlab有一个key,是我们用来做仓库的key。拥有的权限是read-only。
Jenkins 持续集成+自动化部署上线
公钥我们需要在服务器上查看。

创建密钥对

#在 jenkins 192.168.56.11  部署的节点上,生成key
[root@jenkins ~]#  ssh-keygen -t rsa  #一路回车即可
[root@jenkins ~]# cat ./.ssh/id_rsa.pub   #将下面公钥复制到gitlab中
[root@localhost yum.repos.d]# cat /root/.ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCwhIZaDONVtREp/HACvJg/c/Iau1Bxkij0/f/PSTUOEjcjDe+MoIT/oPfKbY5es8vN1UTlOjTRRm6fr7ftZSRCPX2nTO8f/F6d1dh5mfP+YTZ9CBFnAeuaxuHjC1HjEdY3Zz/UkcBAymv9NLwMYap6mLT+DUy793yDMZ96snubKjApCKWdoRRBQezSCZAU7FiuSdmjOEWScyx6QY3BKryZ4Wet+3anU1y1c7C2W0vHsPFrT/vtMfU20pAATxv6fb8fCVb9qL83uVPF8JMtnbKaVM26yG2MmXWhg6VP1LhUnx8/ptpYLlcURW9tb84gXu16fBlsHoqOvaMrxDVwI0yX root@localhost.localdomain

Jenkins 持续集成+自动化部署上线

我们设置完成后测试git是否可以拉去

yum install git -y
#如果没有git命令就安装一个git客户端
root@localhost home]# git clone git@gitlab.example.com:root/dgstack-demo.git
正克隆到 'dgstack-demo'...
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@localhost home]# ll
总用量 0
drwxr-xr-x. 3 root root 35 2月  18 18:08 dgstack-demo

Jenkins 持续集成+自动化部署上线

命令行测试成功后,配置jenkins

[root@localhost home]# cat /root/.ssh/id_rsa    #查看私钥
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAsISGWgzjVbURKfxwAryYP3PyGrtQcZIo9P3/z0k1DhI3Iw3v
jKCE/6D3ym2OXrPLzdVE5To00UZun6+37WUkQj19p0zvH/xendXYeZnz/mE2fQgR
ZwHrmsbh4wtR4xHWN2c/1JHAQMpr/TS8DGGqepi0/g1Mu/d8gzGferJ7myowKQil
naEUQUHs0gmQFOxYrknZozhFknMsekGNwSq8meFnrft2p1NctXOwtltLx7Dxa0/7
7TH1NtKQAE8b+n2/HwlW/ai/N7lTxfCTLZ2ymlTNushtjJl1oYOlT9S4VJ8fP6ba
WC5XFEVvbW/OIF7tenwZbB6Kjr2jK8Q1cCNMlwIDAQABAoIBAEs7cHeY3pt83J/k
c2j3MHx60kkKZLLC9KnWR9z0+qPQp6dNHTf2gjjhRjsEjpVWVBqaNw7ry+8V8bgl
kGKhpN6GjrNrWs9rJHho2Cabsx5MGIkZkzEv5FbHRScbf/8jbwWV/+J9bE8w9u2o
OC2ewqYVx64vxPCn/m18DNiikYQDtTsqYMHpE8AUxrfubZYmRE9apHmXAAJwI8+C
zRDQwqFG79tRJxgGSCMdWXl9Sh/e6Eox+3E8LweeO/7YKiMrabpg4lsLLy1UWfnZ
C6QXtVFjh/pcWd3kPiwPySzE81unyt7Dt4k4hUnlwV0T+xHKXQ7D2WEhkKFTSKLj
MTdTm8ECgYEA560TXdFGw/zMAaYPQ/PGW6KR1Pen+fYhlqCmxXldMcaYuYdFq+Ex
APeD24D/63IMV0UMrgwq8YYTfXtxD8VFc7zwjem9AYyRlBpHd8GfCPSsga3mGcTh
RR7v+8ayeeBbEe7pN4vnJZDBrfXkO2m0kFscE4j7G0WsP7ZyfPGUuA8CgYEAwwzq
y9i6KlmSfPbF2+gRxBjjuBWXLECz7L0PEGUmtKLgs2jffVYWVQ6ThDMPBB9zCSWx
MoA15pV1m7qu93bT8lGJ/Hn4L2J2PsCQ5cb0kXDukAnD0tyF9s2/3Qndpqye6P+D
njTxdVA8RkxrkTG4tWP+wu+vm7EASWjRz7bJWvkCgYBPOjUBRGw64dyyQ6O8zUTs
WXAdsIPVS4K5DD98EMD6ILxh1gzRdrVXa03AZyEd12a5AXgQnUCiUAOiSfCkQAY8
SkTJg0GLohK23zXJkoFcgq/ruRiTf2y6QpY3OAAZBcyfGWDQChwGELbrUse2ObPy
GfZEB/g3n2AEedQ1PjhpqQKBgFjwvvAM93bwOTf6XuaTv+YnY09BqRlot6Kv4vqa
5TdhPg0ROTex1aUbbHDPx30dyhrVsSNSC0IFzQch7T6yVJseS0lxZJZW04xxyqC8
RDE9ycqsaTrxi7SqxV5JbWTfOecM/Dtb8O6Jk7KKjlI61fsAid7h5LWd1H+k6GdK
9i4hAoGAINeF1+R6l+BwA63hpW5a0nuxWpn/k53mtE5rDeX1MaZ54qOzSdSZTwuT
kzY1HJxw+w20bRJKq3FOrlNr+rmyEKFGJ0AAvb/LiPLtRLtEuy1CkyYa6eUddBM9
5+I9ep2id8yJAGoP9UUAmdxkjwh0HMe82is9A/jWnY9feFSoGY4=
-----END RSA PRIVATE KEY-----

Jenkins 持续集成+自动化部署上线

返回刚刚的区域,继续配置,检查报错是否解除

Jenkins 持续集成+自动化部署上线
查看gitlab版本

[root@node03 ~]# rpm -qa|grep gitlab
gitlab-ce-11.7.5-ce.0.el7.x86_64

Jenkins 持续集成+自动化部署上线
现在保存就可以了!

保存完毕后,我们选择立即构建
Jenkins 持续集成+自动化部署上线

点击Console Output 可以显示控制台的输出
Jenkins 持续集成+自动化部署上线

基本构建成功。

四、自动化部署上线【git钩子】

上面简单的Jenkins + gitlab集成后,实现的功能是 开发写好代码提交至gitlab上,接下来我们要实现,开发push到gitlab上之后,jenkins自动帮我们立即构建
这个项目我们需要安装一个gitlab钩子的脚本,使用Gitlab Hook Plugin插件来完成.

1、安装 gitlab hook 插件

Jenkins 持续集成+自动化部署上线
Jenkins 持续集成+自动化部署上线
安装完插件之后我们就开始配置钩子脚本

2、安装 Build Aut插件 【管理使用】

插件搜索:Build Aut
Jenkins 持续集成+自动化部署上线

为了令牌的安全性,我们使用openssl生成一个

[root@jenkins ~]# openssl rand -hex 10
9d3003d715b2455bdaca

3、配置构建触发器 【钩子】

Jenkins 持续集成+自动化部署上线

然后我们点击保存即可
因为jenkins上也提示我们需要在gitlab上添加钩子脚本

如果看不到Build when a change is pushed to GitLab选项,请安装依赖插件
git-plugin
gitlab-hook-plugin
gitlab-plugin
以上三个插件都安装好了,就能看到Build when a change is pushed to GitLab选项了

4、gitlab 配置

点击我们创建的项目
Jenkins 持续集成+自动化部署上线
选中Webhooks 或 system hooks
Jenkins 持续集成+自动化部署上线

Build Authorization Token Root Plugin 插件使用说明
https://wiki.jenkins-ci.org/display/JENKINS/Build+Token+Root+Plugin

使用Build插件后,url如下:

http://192.168.56.11:8080/buildByToken/build?job=dgstack-demo&token=9d3003d715b2455bdaca
dgstack-demo=项目名称(构建时的项目名称)
9d3003d715b2455bdaca=jenkins填写的令牌

Jenkins 持续集成+自动化部署上线

然后点击Add syshook
Jenkins 持续集成+自动化部署上线

下方就会出现我们这个选项,我们点击Test进行测试
Jenkins 持续集成+自动化部署上线

5、自动化部署验证

向git服务器提交代码,验证是否可以自动部署:

[root@jenkins dgstack-demo]# echo "www.dgstack.cn 邱月涛" > index.html
[root@jenkins dgstack-demo]# git add index.html
[root@jenkins dgstack-demo]# git config --global user.email "qiuyt@yilonghc.com"
[root@jenkins dgstack-demo]# git config --global user.name "Qyt"
[root@jenkins dgstack-demo]# git commit -m "test"
[root@jenkins dgstack-demo]# git push origin master
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 297 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@gitlab.example.com:root/dgstack-demo.git
   bf73887..6a651df  master -> master

jenkins服务器的日志记录:

[root@jenkins dgstack-demo]# tail -f /var/log/jenkins/jenkins.log

Jenkins 持续集成+自动化部署上线

jenkins项目构建:
Jenkins 持续集成+自动化部署上线

在去jenkins工作目录,查看代码是否更新。(后面在用ssh 将数据拷贝到注定的目录下就完成自动化上线)
Jenkins 持续集成+自动化部署上线

五、项目案例 (基于ssh插件)

上面已经完成push自动化上线,但是没有同步到项目下,我们使用ssh插件来进行项目的自动化部署

系统管理 > 系统设置 > Publish over SSH

Jenkins 持续集成+自动化部署上线

我这里使用用户名密码进行操作
Jenkins 持续集成+自动化部署上线

测试成功,点击保存

项目演示

web项目主机:192.168.56.13
web项目目录:/home/webs/dgstack-demo
项目目的:当开发在本地push后,自动将代码上线到web项目上。

构建后配置 (ssh)

Jenkins 持续集成+自动化部署上线

Name        :这里是自定义的ssh远程服务器,如果有多台,点击add post-build step 继续添加
Source files    :这里直接写文件名即可,如果全部同步 可以写* (与其它项目同名文件不冲突)
Remove prefix   :这里指的是忽略前面的 target/   远程服务器直接显示就是xx.war
Remote directory    :远程服务器要保存的文件目录,优先级低于系统ssh认证里的远程路径
Exec command    :这里直接写 bash 脚本名称 xx.sh    这里也是远程服务器的脚本

排除文件(比如.env .md说明文件 )

Jenkins 持续集成+自动化部署上线

自动化上线整体流程

gitlab配置Jenkins钩子是需要有人push代码,现在我们push代码进行测试

[root@jenkins dgstack-demo]# echo "逗哥架构师之路" >1.log
[root@jenkins dgstack-demo]# git add 1.log
[root@jenkins dgstack-demo]# git commit -m "init"
[root@jenkins dgstack-demo]# git push origin master

Jenkins 持续集成+自动化部署上线

Jenkins 持续集成+自动化部署上线

六、项目回滚

我们已java为例,总体想法,就是在maven打包后,把war包进行备份,并按照构建历史的版本号命令(区分多个版本),然后上线,如果需要回滚,可以根据版本号,回滚war包到指定版本即可。

6.1 建立任务,并添加参数化构建

Jenkins 持续集成+自动化部署上线
Jenkins 持续集成+自动化部署上线
Jenkins 持续集成+自动化部署上线
Jenkins 持续集成+自动化部署上线

6.2 添加shell命令

Jenkins 持续集成+自动化部署上线

## 备份shell(第一段)
case $Status  in
  Deploy)
    echo "Status:$Status"
    path="${WORKSPACE}/bak/${BUILD_NUMBER}"      #创建每次要备份的目录
    if [ -d $path ];
    then
        echo "The files is already  exists "
    else
        mkdir -p  $path
    fi
    \cp -f ${WORKSPACE}/target/*.war $path        #将打包好的war包备份到相应目录,覆盖已存在的目标
    echo "Completing!"
    ;;
  RollBack)
      echo "Status:$Status"
      echo "Version:$Version"
      cd ${WORKSPACE}/bak/$Version            #进入备份目录
      \cp -f *.war ${WORKSPACE}/target/       #将备份拷贝到程序打包目录中,并覆盖之前的war包
      ;;
  *)
  exit
      ;;
esac

由于服务器硬盘有限,所以我会定期清除

清除备份文件

FileDir=${WORKSPACE}/bak/
date=$(date "+%Y%m%d-%H%M%S")

cd $FileDir   #进入备份目录
FileNum=$(ls -l | grep '^d' | wc -l)   #当前有几个文件夹,即几个备份

if [ $FileNum  -gt 5 ];
    then
        num=`expr $FileNum - 5`
        files=`ls -tr | head -n $num`
        echo $files |xargs rm -rf
        echo "保留5个备份,删除早期备份: " $files
fi

6.2 拟写上线脚本,添加到 ssh-shell里

Jenkins 持续集成+自动化部署上线

#!/bin/bash
##############################################################
# File Name: check_log.sh
# Version: V1.0
# Author: yuetao qiu
# Organization:http://www.dgstack.cn
# Created Time : 2019-06-16 12:32:57 
##############################################################

export JAVA_HOME=/usr/local/src/jdk1.7.0_45 
export PATH=$JAVA_HOME/bin:$PATH 
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export BUILD_ID=dontkillme
LOG= /server/scripts/jenkins_activity.log #精确到秒,避免单日多次上线覆盖最初的包
DATE=`date +%F-%H-%M`
SDIR=FuQin-Activity-Manage-online    #jenkins job名
DDIR=fuqin-activity-1.0.1   #包名



cd /workspace/activity-manage/webapps/activity-manage
unzip -o $DDIR.war
\cp /workspace/activity-manage/webapps/activity-manage/WEB-INF/config.xml.bak   /workspace/activity-manage/webapps/activity-manage/WEB-INF/config.xml
if [ $? -eq 0 ];then
  echo “$DDIR.war更新成功,正在进行构建”
    sh /server/scripts/activity-manage.sh restart
    if [ $? -eq 0 ];then
      echo -e "\033[32m $DDIR.war上线成功 \033[0m"
    else
      echo -e "\033[31m $DDIR.war上线失败 \033[0m"
    fi

else
   echo “$DDIR.war解压失败。。。。”
   exit 

tomcat 启动脚本

#!/bin/bash
# description: Tomcat is a Java Servlet Container
. /etc/profile
TOMCAT_HOME=/workspace/activity-manage  #更换成你的项目目录
start () {
TOMCAT_PID=`ps -ef |grep "$TOMCAT_HOME" |egrep -v "grep|vim|tailf" |awk '{print $2}'`
if [ -z $TOMCAT_PID ];then
    /bin/bash $TOMCAT_HOME/bin/startup.sh
else
    echo "$0 is  running"
fi
}
stop () {
TOMCAT_PID=`ps -ef |grep "$TOMCAT_HOME" |egrep -v "grep|vim|tailf" |awk '{print $2}'`
if [ -z $TOMCAT_PID ];then
        echo "$0 is not running"
else
        echo "shutting down $0"
        kill -9 "$TOMCAT_PID" && echo "PID $TOMCAT_PID killed."
fi
}
status () {
TOMCAT_PID=`ps -ef |grep "$TOMCAT_HOME" |egrep -v "grep|vim|tailf" |awk '{print $2}'`
if [ -z $TOMCAT_PID ];then
        echo "$0 is not running"
else
        echo "$0 is running PID is $TOMCAT_PID"
fi
}
case $1 in
start)
start
#tail -f $TOMCAT_HOME/logs/catalina.out
;;
stop)
stop
;;
status)
status
;;
restart)
stop
start
#tail -f $TOMCAT_HOME/logs/catalina.out
;;
*)
echo "Usage:$0  {start|stop|status|restart}."
;;
esac

Jenkins 持续集成+自动化部署上线

6.3 验证

Jenkins 持续集成+自动化部署上线
Jenkins 持续集成+自动化部署上线
Jenkins 持续集成+自动化部署上线
到此为止,完成上线。

  • QQ精品交流群
  • weinxin
  • 微信公众号
  • weinxin
广告也精彩
admin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:4   其中:访客  2   博主  2

    • avatar 朋友圈 1

      真心觉得不错,总结的到位,很细致😜😜😜

        • avatar admin Admin

          @朋友圈 非常感谢,欢迎转发,阅读,感兴趣可以加入QQ群共同学习

        • avatar pingping 0

          配置钩子需要提前确认git-plugin/gitlab-hook-plugin/gitlab-plugin三个插件都安装好了,就能看到Build when a change is pushed to GitLab选项了,今天试了多遍 :idea:

            • avatar admin Admin

              @pingping 感谢,评论,我总结的内容确实忽略了此,问题,稍后加上。。。。