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'
}
}
#仔细看看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 #这是一次有顺序的编译操作,1,2,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
#需要额外注意一点: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脚本
这个call机是我的唉