Jenkins Pipeline+Maven+Gitlab持续集成构建

2018/11/22 17:56
阅读数 103

 

1.以下全是个人理解,此文全是在实际工作环境中实现,如果您是想看着这篇博客去练习,可能有些环境您没法搭建(maven库,编译顺序),得问问一个搞开发的朋友,开发得提供些东西,或者,您可以通过此文档,学习到pipeline脚本的知识,您可以去除掉用mvn  build这一项,其他的环境,作为运维人员,都可以搭建得好。

2.为了方便各位看得清楚,以及我个人这么多年生活知识的基类,我是很恨马赛克的,所以全文没有马赛克,我的配置可以全部看到,没有隐私。

3.文中服务器全是私有ip,本人现在维护的是私有云环境,所以利用现有环境给各位看官写这篇博客,你们是连不上我这儿的内网ip的。

 

 

#什么是pipeline?

pipeline 流水线,简单来说就是将原本独立运行的操作结合起来,统一有序的运作。

联想一下,电视里面的工厂厂子里面的流水线,每部分人,任务可能不同,但是都是在一条线上工作的

工人做的事情可能是装手机壳,装电池,那pipeline中做什么呢,拉取代码,提交代码等

 

准备阶段

#jenkins主机:安装git客户端  安装maven

 

下面是git和maven的包:

链接:https://pan.baidu.com/s/1q5zNU2e69GKeoqz2Yfd94w 密码:kvlp

git安装:[jenkins@host-10-124-198-75 git-2.10.2]$ ./configure  && make && make install 

maven安装:[jenkins@host-10-124-198-75 soft]$ tar xf maven.tar.gz -C /home/jenkins/      

 

#maven安装后在/etc/profile里面配置环境变量PATH即可,以下是我的配置

export JAVA_HOME=/opt/edas/jdk/java/
export JRE_HOME=/opt/edas/jdk/java/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export JENKINS_HOME=/home/jenkins/jenkins
export MAVEN_HOME=/home/jenkins/maven
export PATH=${JAVA_HOME}/bin:$PATH:${MAVEN_HOME}/bin:/usr/local/bin/:$JRE_HOME/bin:/home/jenkins/soft/node-v8.12.0-linux-x64/lib/node_modules

 

 

#jenkins平台上安装:pipeline等插件

由于jenkins的版本跟jenkins所需要的插件版本有着依赖性,我这次使用的jenkins版本跟上一篇博客是有区别的,所以,建议使用一致的版本,通过下面链接下载我现在版本的jenkins,以及一个plugins.tar.gz文件

链接:https://pan.baidu.com/s/11mZ6aK1p1q9ymb3pmjFNRA 密码:ed2p

#plugins文件是干嘛的??

当你安装jenkins后,默认有一个变量JENKINS_HOME指向的是  第一次启动jenkins时,如果没指定这个变量,默认是    “启动用户家目录下的.jenkins/”,此目录用于存储jenkins中的一些数据,jenkins家目录下有一个叫plugins的目录,此目录用于存放插件,我的jenkins跟plugins版本是吻合的,所以,你如果要使用我这个版本的jenkins,就不用自己去寻思安装啥插件了,我都给你准备好了。

 

 

#启动jenkins

java -Djava.awt.headless=true -Xms256m -Xmx512m -XX:MaxNewSize=256m -XX:MaxPermSize=256m    -jar jenkins.war  --ajp13Port=-1 --httpPort=8088 --debug=5 --handlerCountMax=100 --handlerCountMaxIdle=20   &> /home/jenkins/jenkins_log/mesages &

这是讲的jenkins,jvm调优参数啥意思自己百度吧,顺便了解下,就是指定内存大小啥的。

java -jar   名称.war   # 前台启动某个jar包    

--httpPort=8088 指定jenkins的端口

&> /home/jenkins/jenkins_log/mesages &    #标准输出,以及错误输出,全都重定向到某个文件(实现了日志功能),并将这个项目放入后台运行

 

 

 

#jenkins启动了,你要访问http://localhost:8088  进行第一次启动的配置,你配置的时候,什么插件都不用安装,只需要设置用户名和密码就行了,安装成功后,将我给你的plugins.tar.gz 解压,copy,并覆盖掉jenkins家目录下的plugins目录,然后重启jenkins(kill掉进程,然后再次执行上面的命令)

 

重启成功后,登录进入jenkins,选择左侧的系统管理-插件管理,已安装插件,看有没有pipeline等很多的插件

 

 

 #好的,至此,恭喜你,你已经搞好了2/1了,剩下的循序渐进即可。

 

1.添加git账户

  #添加一个账户用来连接gitlab

  

 

  进入后选择 Add Credentials,进行用户添加

  #下图的其他选项你应该看得懂,但是那个箭头指向的选项还得特别说下:给它设立一个简洁,有含义的名称,因为后面我们将要在脚本中通过这个id名称来调用这个账户来连接gitlab获取数据。

   

 

2.新建任务

  创建好账户后可以直接新建任务了,起一个开发人员能够认识的名字,并且选择pipeline

  

  创建好任务后,直接拉到最下面,找到pipeline,编写pipeline脚本

  

3.编写pipeline脚本

  #编写之前,先想想具体逻辑是什么样的。

  1.从gitlab上拉取代码

  2.备份网站服务器之前的代码

  3.删除网站服务器之前的代码

  4.将新代码传到网站服务器服务器上

  5.重启网站服务器上的web应用

  总的来说就是这5个步骤,接下来要做的是将这5步翻译成脚本命令。

  脚本结构:

  

node () {
def workspace = pwd()
    stage 'checkout'

     
    stage 'Build'
   
  
 
    stage 'backup'
    
   
    
    stage 'delete_old'
    
    
    stage 'upload'
   
    
    stage 'restart_tomcat'
   
}
View Code

 

  共是5个阶段(stage)

  具体代码

node () {
def workspace = pwd()
war_name='custinfo_partner'
tomcat_home='/home/admin/taobao-tomcat-production-7.0.59.3'
host='10.124.193.76'
user='admin'
passwd='A1B2C3D4'

  stage 'checkout'
    dir('base'){
     git branch: 'dev', credentialsId: 'git-yatai', url: 'http://10.124.198.74/AsiaSatComBOSS/base.git'

     }
     dir('business_customer_inform'){
     git branch: 'dev', credentialsId: 'git-yatai', url: 'http://10.124.198.74/AsiaSatComBOSS/business_customer_inform.git'
     }
     
     dir('business_partner'){
     git branch: 'dev', credentialsId: 'git-yatai', url: 'http://10.124.198.74/AsiaSatComBOSS/business_partner.git'
     }
     dir('custinfo_partner'){
     git branch: 'dev', credentialsId: 'git-yatai', url: 'http://10.124.198.74/AsiaSatComBOSS/custinfo_partner.git'
     }
     
    stage 'Build'
   
      
    sh"""
   
         cd $workspace/base
        /home/jenkins/maven/bin/mvn clean install -U -Pdev
		cd $workspace/business_customer_inform
        /home/jenkins/maven/bin/mvn clean install -U -Pdev
        cd $workspace/business_partner
        /home/jenkins/maven/bin/mvn clean install -U -Pdev
		cd $workspace/custinfo_partner
        /home/jenkins/maven/bin/mvn clean install -U -Pdev
 """
 
      stage 'backup'
    
    sh """
    cd $workspace/'$war_name'/target
    tar cfz /home/jenkins/jenkins_work_backup/Web`date +%y%m%d-%s`-test.tar.gz '$war_name'.war

    """
    
    stage 'delete_old'
    sh """sshpass  -p'$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$host' "rm -rf  '$tomcat_home'/deploy/'$war_name'* "
    """
    
    
    stage 'upload'
    sh """
        cd $workspace/'$war_name'/target
        sshpass -p'$passwd' scp -o StrictHostKeyChecking=no '$war_name'.war '$user'@'$host':'$tomcat_home'/deploy/'$war_name'.war
    """ 
    
    stage 'restart_tomcat'
    sh "sshpass  -p'$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$host' 'bash  /home/admin/if_tomcat.sh'"
     echo 'done_______________'
}

  

解释:

#代码中以下部分是定义变量部分,在一处定义变量,文中存在多处调用,这样做可以提高扩展性,别到时候,登录密码改了,还得一处一处去改

def workspace = pwd()    #此处等同于linux命令行中pwd命令  等于把当前路径赋值给workspace变量
  war_name='mgr_resource'                    #最终网站服务器上的war包名称,跟maven打包出来的名称相同,故用变量标识,减少重复编写工作
  tomcat_home='/home/admin/taobao-tomcat-production-7.0.59.3'
  host='10.124.193.76'           #网站服务器的ip和web应用地址,以及登录密码信息。
  user='admin'
  passwd='A1B2C3D4'

 

#以下部分作用是从gitlab中拉取代码

#选此处进行讲解
——————————————————————————————————————————————————————————————————————————————————————————————————————————————
     dir('base'){            #创建目录:base  用于存放下一行代码从gitlab中拉取的代码
                  #base目录绝对路径是:Jenkins家目录下/workspace/任务名称(这儿是mgr_resource-test)/base
                   #(我的环境中是:/home/jenkins/jenkins/workspace/mgr_resource-test/base)
   git         branch: 'dev',    credentialsId: 'git_account',                       url: 'http://10.124.198.74/AsiaSatComBOSS/base.git' }
     git客户端    指定gitlab分支   指定用于登录gitlab的账户id(没忘吧,我们在步骤1创建过的)       #指定gitlab的地址   

   #除了git客户端你自己安装,实际工作环境中,gitlab分支,gitlab账户密码,gitlab地址,以及编译顺序,都是开发人员给你的。
   #不知道gitlab分支是什么,没事儿,忽略这个知识点,就当没说,你理解为简单的拉取代码,用哪个用户,拉哪块的代码,后期你再去了解分支是干啥的。
—————————————————————————————————————————————————————————————————————————————————————————————————————————————— 
stage 'checkout'
   dir('base'){
    git branch: 'dev', credentialsId: 'git-yatai', url: 'http://10.124.198.74/AsiaSatComBOSS/base.git'
}
dir('business_customer_inform'){
     git branch: 'dev', credentialsId: 'git-yatai', url: 'http://10.124.198.74/AsiaSatComBOSS/business_customer_inform.git'
     }
     
     dir('business_partner'){
     git branch: 'dev', credentialsId: 'git-yatai', url: 'http://10.124.198.74/AsiaSatComBOSS/business_partner.git'
     }
     dir('custinfo_partner'){
     git branch: 'dev', credentialsId: 'git-yatai', url: 'http://10.124.198.74/AsiaSatComBOSS/custinfo_partner.git'
     }

 

#我先从gitlab上拉取代码,不做其他操作,先试试水,结果如下(我只使用了stage('checkout')阶段的代码,从git上拉取数据,其他操作还未指定。)

node () {
def workspace = pwd()
war_name='mgr_resource'
tomcat_home='/home/admin/taobao-tomcat-production-7.0.59.3'
host='10.124.193.76'
user='admin'
passwd='A1B2C3D4'
  stage 'checkout'
    dir('base'){
     git branch: 'dev', credentialsId: 'git-yatai', url: 'http://10.124.198.74/AsiaSatComBOSS/base.git'

     }
     dir('business_customer_inform'){
     git branch: 'dev', credentialsId: 'git-yatai', url: 'http://10.124.198.74/AsiaSatComBOSS/business_customer_inform.git'
     }
     
     dir('business_partner'){
     git branch: 'dev', credentialsId: 'git-yatai', url: 'http://10.124.198.74/AsiaSatComBOSS/business_partner.git'
     }
     dir('custinfo_partner'){
     git branch: 'dev', credentialsId: 'git-yatai', url: 'http://10.124.198.74/AsiaSatComBOSS/custinfo_partner.git'
     }
}
View Code

#仔细看看stage('checkout')阶段的代码,每个dir('')生成的目录,这里面都有,而这些目录里面存储的,就是每个dir(‘’)后的那段git代码拉取下来的数据

#好的,平缓下来,继续解释代码

 

#以下代码,作用于编译代码,*可以在jenkins里面执行bash命令,真好。

#maven编译代码之前,需要配置一些东西,如jar包仓库,等才能成功编译,也就是说,你要让你自己得到知识上的满足,你必须多看书,你从哪看这些书呢,要不你有书,要不你就上网找书,方案很多,但是需要跟开发人员配合后才知道如何获取这些jar包,这里就不做介绍。stage 'Build'

 

#没忘记吧? $workspace是pwd(),也就是jenkins工作目录,就是jenkins家目录/jenkins/workspace/任务名称/

#sh """command """ sh"command" 都可以执行shell命令(每个单独的sh,等于说新开一个bash环境执行命令),前者一般是执行多行的命令的时候使用,后者执行一条命令时用   

 

    
sh
"""                                                                                                  
cd $workspace/base                    #进入从git下载了代码的目录中 /home/jenkins/maven/bin/mvn clean install -U -Pdev #编译的结果是得到一个war包,但是1个项目一般只有1个war包,为什么要编译这么多文件呢? cd $workspace/business_customer_inform #因为开发要求这样编译。 /home/jenkins/maven/bin/mvn clean install -U -Pdev #这是一次有顺序的编译操作,12,3,4,按照有循序的逻辑来 cd $workspace/business_partner #先有1才能有2,有了2才能有3,我最终要的结果是4,那么也要一步一步来才行 /home/jenkins/maven/bin/mvn clean install -U -Pdev cd $workspace/custinfo_partner #通常,最后编译的包里面,就是需要的war包存在的目录,前三个只是打铺垫。 /home/jenkins/maven/bin/mvn clean install -U -Pdev #编译成功后会在目录下新建一个target目录存放war包 """

 

#编译完成后,我就得到这个war包了,再试一下水,war包如下。

 

 #下一段代码,对网站服务器做一些操作,备份-删除-上传新的,重启网站服务。

#以下全是linux命令,不多做解释,这还看不懂,那就没法了。

sshpass:提供非交互式的密码认证环境
StrictHostKeyChecking=no   #主机key检查,当你第一次连接某台机器时,会出现交互式页面,如下,脚本可不会只能帮我们输入“yes”,所以,避免出现这种情况!

最后一个动作是重启tomcat,当你把新的代码传上去,你得让tomcat识别,所以得重启,简单的操作,我的脚本如下。

#!/bin/bash
tomcat_home=/home/admin/taobao-tomcat-production-7.0.59.3
id=`ps aux |grep /home/admin/taobao-tomcat-production-7.0.59.3 |grep -v grep |awk -F" " '{print $2}'`
tomcat_id=`cat $tomcat_home/catalina.pid`
if [ $id =  $tomcat_id  ];then
        kill  -9  $tomcat_id
        sleep 2
        $tomcat_home/bin/startup.sh  &>/dev/null
else
        $tomcat_home/bin/startup.sh  &>/dev/null
fi
View Code

 

#需要额外注意一点:pipeline中使用变量,除了变量 workspace = pwd() 调用方法是$workspace,其他自定义变量,如user,调用方式是  '$user'

 

stage 'backup'
    
   sh """
    cd  $workspace/'$war_name'/target               #进入编译后的target目录,将war包做个备份,并以年月日-秒来命令,后期可以自己写shell脚本来判断创建时间,超过一周的删除
    tar cfz /home/jenkins/jenkins_work_backup/Web`date +%y%m%d-%s`-test.tar.gz '$war_name'.war   


    """
    
    stage 'delete_old'
    sh """sshpass  -p'$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$host' "rm -rf  '$tomcat_home'/deploy/'$war_name'* "
    """  #删除网站服务器上的旧数据
    
    
    stage 'upload'
    sh """
        cd $workspace/'$war_name'/target   #maven 编译后,在目录下新建一个target文件,将war包放在其中
        sshpass -p'$passwd' scp -o StrictHostKeyChecking=no '$war_name'.war '$user'@'$host':'$tomcat_home'/deploy/'$war_name'.war
    """   #进入编译后的target目录,将war包scp到网站服务器上的web程序目录下。
    

    stage 'restart_tomcat'
    sh "sshpass  -p'$passwd' ssh -o StrictHostKeyChecking=no '$user'@'$host' 'bash  /home/admin/if_tomcat.sh'"
     echo 'done_______________'  #执行重启tomcat脚本

 

 

 

  

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部