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

Jenkins 自动化部署上线
Jenkins
- Jenkins 自动化部署上线一、Jenkins是什么
- 二、上线流程图
- 三、Jenkins安装配置
- 四、Jenkins 自动化部署项目案例(1) Java 环境演示 [Jenkins和Tomcat在一台服务器上]
- (2) Java 环境演示 [Jenkins和Tomcat不在一台服务器上]
- (3) Java 环境演示 [上线脚本]
- (4) NodeJs 环境演示 [上线脚本]
一、Jenkins是什么
1Jenkins是一款自包含的开源自动化服务,可用于自动执行与构建,测试和交付或部署软件有关的各种任务。 2Jenkins目前可以通过本地系统软件包Docker进行安装,甚至可以通过任何安装了Java运行环境的计算机独立运行
二、上线流程图
既然我们说到自动化上线,我们就不得不说说一个项目上线的流程.只有规范起来才可以做到不出事故!
上线流程图如下图所示

三、Jenkins安装配置
Jenkins依赖Java环境,我们需要安装Java环境以及相关的环境准备
1###关闭防火墙 2$ iptables -F 3$ iptables -X 4$ systemctl stop firewalld 5$ systemctl disable firewalld 6 7###安装yum源 8$ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 9$ wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 10$ yum clean all && yum makecache
1.下载Jdk包

下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
上传jdk包到服务器
1###解压拷贝jdk 2$ tar xf jdk-8u171-linux-x64.tar.gz -C /usr/local/ 3$ ln -s /usr/local/jdk1.8.0_171/ /usr/local/jdk 4$ ln -s /usr/local/jdk/bin/java /usr/bin/java 5 6###设置环境变量 7$ vim /etc/profile 8export JAVA_HOME=/usr/local/jdk 9export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 10export PATH=$JAVA_HOME/bin:$PATH 11 12$ source /etc/profile
2.安装Jenkins
1$ wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo 2$ rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key 3$ yum install jenkins -y 4 5$ systemctl start jenkins 6##如果我们启动Jenkins出现错误可以直接使用systemctl status jenkins查看错误
jenkins相关目录释义:
1(1)/usr/lib/jenkins/:jenkins安装目录,war包会放在这里。 2(2)/etc/sysconfig/jenkins:jenkins配置文件,“端口”,“JENKINS_HOME”等都可以在这里配置。 3(3)/var/lib/jenkins/:默认的JENKINS_HOME。 4(4)/var/log/jenkins/jenkins.log:jenkins日志文件。
检查端口是否存在

3.配置Jenkins

Jenkins有安全策略,我们按照提示拷贝验证码即可

将验证码复制到Web框里

我们这里使用推荐就可以了,因为后期我们都可以在安装

安装插件中,有的插件会因为网络问题无法安装成功

我们这里可以创建一个管理员,或者直接使用admin
我们最好不要直接使用admin


安装完成访问地址:iP:8080

到这里我们Jenkins已经安装成功,剩下的就是配置插件和配置环境

因为我们目前什么都没有需要安装插件,点击下步安装插件

为了模拟环境我们需要安装Jenkins一些相关插件
下面2个maven 插件都需要勾选
插件名称:
maven lntegration

我们勾选安装重启


安装完成后如下图所示
默认是没有下面的maven项目的

4.Jenkins配置项目
配置SVN地址
因为我是新建的Jenkins目录,没有权限,所以需要创建一个用于认证.

填写SVN地址,因为我这里的svn已经链接到ldap,所以不需要输入svn的密码,默认这里是svn的用户和密码
具体文章可以参考 VisualSVN 迁移至Linux SVN+Apache+ssl集成LDAP

认证成功之后

了解maven 配置
首先我们的svn分支下面需要有pom.xml

继续往下
↓
↓
↓
↓
因为我们只安装maven的插件,并没有安装maven服务,所以这里需要我们配置

我们就在这里添加一个名字,maven就自动安装了

Maven安装完成了,需要依赖吧都是从maven.apache.org下载会比较慢,所以我们指定私服的地址,因为在实际生产中也都是使用私服的。
在maven的配置文件里面也需要配置 配置文件
conf/settings.xml因为我们所使用的是Jenkins的自动安装,而不是指定路径所以我们要查到这个配置文件
maven 自动安装的配置路径

配置Maven仓库地址
这里配置的都是私服地址
相关文章 Jenkins+Maven+SVN+Nexus 搭建持续集成环境

配置Maven 镜像地址

配置Maven 编译参数 [研发都会]
相关文章:maven 编译命令

1这个pom.xml里面配置是私服的地址 2因为代码里面有很多东西是需要拉去依赖包,这些依赖包就存放在本地的私有仓库里(Nexus)
代码中pom.xml配置如下
私有仓库的地址

5.构建测试

控制台输出说明



6.Jenkins 工程目录

可以通过修改Jenkins主目录

Jenkins打包好后的目录,这个war包就是我们需要拷贝的tomcat下面的

四、Jenkins 自动化部署项目案例
因为目前环境原因,我这里只是截图Jenkins发布的流程(本次演示只是针对测试环境日常发布版本)
(1) Java 环境演示 [Jenkins和Tomcat在一台服务器上]
1.Jenkins 配置

SVN部分配置

maven及脚本设置

2.不发脚本配置如下:
相关参考:Jenkins可用环境变量列表
脚本的存放路径可以在系统管理->全局配置->Jenkins路径
1Last login: Thu Jun 28 18:01:59 2018 from 172.16.29.39 2[root@tomcat ~]# cat /jenkins/deploy.sh 3#!/bin/bash 4 5# 6# Jenkins工程构建通用TOMCAT部署脚本 7# @author abcdocker 8# @create_time 2017-08-19 9# 10# 在Jenkins内配置部署单元参数 11# 参数格式:MAVEN_MODULE_NAME:TOMCAT_ABSOLUTE_PATH MAVEN模块名称:需要部署的目标TOMCAT绝对路径 12# 只有单个部署单元且没有Maven子模块时,模块名称参数可以没有,参数格式为:TOMCAT_ABSOLUTE_PATH 13# 14# 注意: 15# 在本部署脚本内会执行TOMCAT启动脚本,为避免Jenkins在构建成功以后杀掉所有衍生的后台进程,需要在Jenkins内配置全局环境变量 BUILD_ID 值为 allow_to_run_as_daemon 16# 17# 18 19DEPLOY_TARGET_TOMCAT=$TOMCAT 20 21#校验部署参数,不能为空 22if [ -z "$DEPLOY_TARGET_TOMCAT" ] 23then 24 echo 25 echo 部署参数为空,部署失败! 26 echo "#####################################################################" 27 echo 28 echo 单个部署单元参数格式: 29 echo MAVEN_MODULE_NAME:TOMCAT_ABSOLUTE_PATH MAVEN模块名称:需要部署的目标TOMCAT绝对路径 30 echo 31 echo 多个部署单元参数格式:(多个部署单元使用空格分割) 32 echo MAVEN_MODULE_NAME:TOMCAT_ABSOLUTE_PATH MAVEN_MODULE_NAME:TOMCAT_ABSOLUTE_PATH 33 echo 34 echo "#####################################################################" 35 exit 1 36fi 37 38echo 39echo 部署参数:${DEPLOY_TARGET_TOMCAT} 40 41TOMCAT_ARR=${DEPLOY_TARGET_TOMCAT//;/ } 42ARR=($TOMCAT_ARR) 43ARR_LEN=${#ARR[*]} 44echo 共 ${ARR_LEN} 个部署单元 45 46i=1 47#获取Jenkins传入的目标TOMCAT组 48for T in $TOMCAT_ARR 49do 50 echo 51 echo 开始 处理第 ${i} 个部署单元 52 echo 第一个部署单元:$T 53 54 #获取目标TOMCAT的WAR路径和TOMCATA的绝对路径 55 TOMCAT_PARAM=(${T//:/ }) 56 MODULE_NAME=${TOMCAT_PARAM[0]} 57 TARGET_TOMCAT_PATH=${TOMCAT_PARAM[1]} 58 WAR_PATH="$WORKSPACE/$MODULE_NAME/target/*.war" 59 60 echo 部署单元模块名称:"${MODULE_NAME}" 61 echo 部署WAR包路径:"${WAR_PATH}" 62 echo 部署TOMCAT路径:"${TARGET_TOMCAT_PATH}" 63 64 #需要考虑MAVEN单模块下的部署问题 65 #if [ "${#ARR[*]}" -eq 1 -a -z "$TARGET_TOMCAT_PATH" ] 66 if [ "$ARR_LEN" -eq 1 -a -z "$TARGET_TOMCAT_PATH" ] 67 then 68 #MAVEN过程没有子模块,单个部署单元 69 TARGET_TOMCAT_PATH=$MODULE_NAME 70 MODULE_NAME="NULL" 71 fi 72 73 #校验参数,WORKSPACE变量来自于Jenkins环境变量 74 if [ -z "$MODULE_NAME" -o ! -f $WAR_PATH ] 75 then 76 echo 错误:MAVEN部署模块名称 参数为空 或 找不到WAR包! 77 echo 部署失败! 78 exit 1 79 fi 80 81 if [ -z "$TARGET_TOMCAT_PATH" -o ! -d "$TARGET_TOMCAT_PATH" ] 82 then 83 echo 错误:目标TOMCAT绝对路径 参数为空 或 该TOMCAT目录不存在! 84 echo 部署失败! 85 exit 1 86 fi 87 88 echo 开始清理目标TOMCAT启动进程... 89 TOMCAT_PID=`ps -ef |grep "$TARGET_TOMCAT_PATH" |grep "start" |awk '{print $2}'` 90 if [ -n "$TOMCAT_PID" ] 91 then 92 echo TOMCAT_${i},PID${TOMCAT_PID},正在结束该进程... 93 kill -9 $TOMCAT_PID && echo PID${TOMCAT_PID} 已被干掉! 94 else 95 echo TOMCAT_${i} 进程未启动! 96 fi 97 98 echo 开始清理目标TOMCAT缓存... 99 rm -rf $TARGET_TOMCAT_PATH/webapps/* 100 rm -rf $TARGET_TOMCAT_PATH/logs/* 101 rm -rf $TARGET_TOMCAT_PATH/work/* 102 103 echo 开始部署WAR包... 104 cp -a $WAR_PATH $TARGET_TOMCAT_PATH/webapps/ROOT.war && echo WAR包部署完毕。 105 106 echo 开始启动目标TOMCAT服务... 107 sleep 10 108 /bin/bash $TARGET_TOMCAT_PATH/bin/startup.sh 109 110 echo 开始配置web目录的FTP权限... 111 #启动过程会自动解压WAR包,所以在这里需要等待WAR包解压完成再调整目录权限 112 sleep 30 113 chown -R vftpuser.vftpuser ${TARGET_TOMCAT_PATH}/webapps/ && echo 目录权限配置完毕。 114 115 echo 部署成功 116 echo 完成 第 ${i} 个部署单元处理。 117 echo 118 119 ((i++)) 120done
3.构建效果如下图所示:

(2) Java 环境演示 [Jenkins和Tomcat不在一台服务器上]
上面的脚本是针对Jenkins和Tomcat都在相同的目录,有的时候我们测试环境会存在不在一台服务器的情况,脚本如下
1只是脚本简单的修改 2[root@tomcat ~]# cat /jenkins/ysc.sh 3#!/bin/bash 4 5# 6# Jenkins工程构建通用TOMCAT部署脚本 7# @author 刘曙 8# @create_time 2017-08-19 9# 10# 在Jenkins内配置部署单元参数 11# 参数格式:MAVEN_MODULE_NAME:TOMCAT_ABSOLUTE_PATH MAVEN模块名称:需要部署的目标TOMCAT绝对路径 12# 只有单个部署单元且没有Maven子模块时,模块名称参数可以没有,参数格式为:TOMCAT_ABSOLUTE_PATH 13# 14# 注意: 15# 在本部署脚本内会执行TOMCAT启动脚本,为避免Jenkins在构建成功以后杀掉所有衍生的后台进程,需要在Jenkins内配置全局环境变量 BUILD_ID 值为 allow_to_run_as_daemon 16# 17# 18 19DEPLOY_TARGET_TOMCAT=$YSC 20HOST=root@172.16.1.35 21#校验部署参数,不能为空 22if [ -z "$DEPLOY_TARGET_TOMCAT" ] 23then 24 echo 25 echo 部署参数为空,部署失败! 26 echo "#####################################################################" 27 exit 1 28fi 29 30echo 31echo 部署参数:${DEPLOY_TARGET_TOMCAT} 32 33TOMCAT_ARR=${DEPLOY_TARGET_TOMCAT//;/ } 34ARR=($TOMCAT_ARR) 35ARR_LEN=${#ARR[*]} 36echo 共 ${ARR_LEN} 个部署单元 37 38i=1 39#获取Jenkins传入的目标TOMCAT组 40for T in $TOMCAT_ARR 41do 42 echo 43 echo 开始 处理第 ${i} 个部署单元 44 echo 第一个部署单元:$T 45 46 #获取目标TOMCAT的WAR路径和TOMCATA的绝对路径 47 TOMCAT_PARAM=(${T//:/ }) 48 MODULE_NAME=${TOMCAT_PARAM[0]} 49 TARGET_TOMCAT_PATH=${TOMCAT_PARAM[1]} 50 #WAR_PATH="/jenkins/workspace/ysc-all/${MODULE_NAME}/target/*.war" 51 WAR_PATH="${WORKSPACE}/${MODULE_NAME}/target/*.war" 52 53 echo 部署单元模块名称:"${MODULE_NAME}" 54 echo 部署WAR包路径:"${WAR_PATH}" 55 echo 部署TOMCAT路径:"${TARGET_TOMCAT_PATH}" 56 57 58 #判断IP是否有相关目录 59 ssh 172.16.1.35 "[ -d $TARGET_TOMCAT_PATH ]" >/dev/null 2>&1 60 if [ $? != 0 ];then 61 echo 错误 62 else 63 echo 正确 64 fi 65 66 67 #校验参数,WORKSPACE变量来自于Jenkins环境变量 68 if [ -z "$MODULE_NAME" -o ! -f $WAR_PATH ] 69 then 70 echo 错误:MAVEN部署模块名称 参数为空 或 找不到WAR包! 71 echo 部署失败! 72 exit 1 73 fi 74 75 #scp 软件包 76 ssh $HOST /etc/init.d/${MODULE_NAME} stop 77 ssh 172.16.1.35 "[ -d $TARGET_TOMCAT_PATH/webapps/ROOT/ ]" >/dev/null 2>&1 78 if [ $? = 0 ];then 79 ssh 172.16.1.35 rm -rf $TARGET_TOMCAT_PATH/webapps/ROOT 80 if [ $? = 0 ];then 81 scp $WAR_PATH root@172.16.1.35:$TARGET_TOMCAT_PATH/webapps/ROOT.war && echo WAR包部署完毕。 82 echo $TARGET_TOMCAT_PATH is OK 83 else 84 echo 删除$TARGET_TOMCAT_PATH is error 85 fi 86 else 87 echo "not found $TARGET_TOMCAT_PATH/webapps/ROOT" 88 scp $WAR_PATH root@172.16.1.35:$TARGET_TOMCAT_PATH/webapps/ROOT.war && echo WAR包部署完毕。 89 ssh $HOST /etc/init.d/${MODULE_NAME} restart 90 fi 91 92####################启动文件 93 94done 95 #scp /home/config.properties/ysc/${MODULE_NAME}.js root@172.16.1.35:$TARGET_TOMCAT_PATH/webapps/ROOT/web/js/basePath.js 96 ssh $HOST /etc/init.d/${MODULE_NAME} restart
Jenkins配置如下修改


修改完成后我们构建演示

提示:这种环境下配置文件都是通过maven build进行控制,也就是通过研发控制配置文件
(3) Java 环境演示 [上线脚本]
线上环境演示
我们的上线流程如下:

Jenkins配置如下:



1.首先测试环境脚本:
1[root@tomcat ~]# cat /server/scripts/.upgrade-smscenter.sh 2#!/bin/bash 3WAR="/jenkins/workspace/portal-smscenter/bxg-sms-center-web/target/*.war" 4Path="/data/hub/bxg-smscenter/`date +%Y%m%d`/" 5 6scp_war(){ 7 8if [ ! -d $Path ];then 9 ssh root@file-server mkdir -p $Path 10 scp $WAR root@file-server:$Path 11else 12 scp $WAR root@file-server:$Path 13fi 14} 15ssh_file(){ 16 ssh root@file-server "/bin/bash /server/script/bxg/bxg-smscenter.sh" 17} 18scp_war 19ssh_file
2.跳板机脚本修改
1[root@File-server1 ~]# cat /server/script/bxg/bxg-smscenter.sh 2#!/bin/bash 3HOST=online-server2 4WAR="/data/hub/bxg-smscenter/`date +%Y%m%d`" 5DIR="/application/smscenter/webapps/ROOT/" 6function scp_file { 7 if `ssh root@$HOST "[ ! -d $WAR ]"`;then 8 ssh root@$HOST "mkdir -p $WAR" 9 fi 10 scp $WAR/*.war root@$HOST:$WAR/ 11 echo "scp $WAR/*.war root@$HOST:$WAR/" 12} 13ssh_deploy(){ 14 ssh root@$HOST "/bin/bash /server/scripts/deploy_smscenter.sh" 15} 16scp_file 17ssh_deploy
3.web 服务器脚本
1[root@online-server2 ~]# cat /server/scripts/deploy_smscenter.sh 2#!/bin/bash 3WAR="/data/hub/bxg-smscenter/`date +%Y%m%d`" 4OBJECT="/application/smscenter/webapps/ROOT/" 5Backup="/data/tomcat/bxg-smscenter-`date +%Y%m%d`" 6SCR_D="/application/smscenter/webapps/ROOT" 7#config="/data/bak" 8 9 10backup_tar(){ 11 tar zcvf $Backup.tar.gz $SCR_D/ 12 echo "为了防止意外cp整个项目目录存放" 13 cp -a $SCR_D/ $Backup 14 rm -rf $OBJECT/* 15} 16 17 18 19 20cp_war(){ 21 unzip $WAR/*.war -d $SCR_D/ 22} 23 24cp_config(){ 25 cat $Backup/WEB-INF/classes/application-prod.properties >$SCR_D/WEB-INF/classes/application-prod.properties 26 /etc/init.d/smscenter restart 27} 28backup_tar 29cp_war 30cp_config 31[root@online-server2 ~]#
相关文章 企业必会技能 tomcat
(4) NodeJs 环境演示 [上线脚本]
node 环境上线流程
Jenkins配置如下 [node项目不适用maven,所以可以不用创建maven项目,直接在Jenkins创建普通项目就可以]


1.测试环境脚本
1[root@tomcat ~]# cat /server/scripts/mobile/mobile.sh 2#!/bin/bash 3source /etc/profile 4 5HOST=file-server 6BASE_DIR=/server/scripts/mobile/m 7url=$1 8server=$2 9DATE=`date +%Y%m%d` 10 11 12tar(){ 13rm -rf $BASE_DIR 14 15 [ -d $BASE_DIR ] || mkdir $BASE_DIR 16 cd $BASE_DIR 17 echo "##########################################################" 18 echo "代码拉取中!!!" 19 svn co -q $url/ . 20 echo "##########################################################" 21 22} 23 24cp(){ 25 26 cd ${BASE_DIR} 27 /bin/tar -zcvf m_${DATE}.tar.gz ./* 28 echo "##########################################################" 29 echo "文件已经打包完成! 正在拷贝中!!!" 30 echo "##########################################################" 31 sleep 5 32 scp m_${DATE}.tar.gz root@$HOST:/data/hub/bxg-mobile/ 33 echo "##########################################################" 34 echo "文件已经拷贝完成! 正在上传服务器中!!!" 35 echo "##########################################################" 36 ssh root@file-server "/bin/bash /server/script/bxg/bxg-mobile.sh $server" 37 38} 39 40tar 41cp 42[root@tomcat ~]#
2.跳板机脚本
1[root@File-server1 ~]# cat /server/script/bxg/bxg-mobile.sh 2#!/bin/bash 3HOST=$1 4Mobile_tar="/data/hub/bxg-mobile" 5DIR="/application/node" 6DATE=`date +%Y%m%d` 7 8 9 10 11scp_file(){ 12 if `ssh root@$HOST "[ ! -d $Mobile_tar ]"`;then 13 ssh root@$HOST "mkdir -p $Mobile_tar" 14 fi 15 scp $Mobile_tar/m_${DATE}.tar.gz root@$HOST:$DIR/ 16 sleep 3 17 echo " " 18 echo "##########################################################" 19 echo "File-server 正在拷贝 ${HOST}!!!" 20 sleep 3 21 echo "##########################################################" 22} 23 24 25ssh_deploy(){ 26 echo "Hi" 27 ssh root@$HOST "/bin/bash /server/scripts/bxg/bxg-mobile.sh" 28} 29 30scp_file 31ssh_deploy
3.web 发布脚本
1[root@iZbp11tefvghtcfn5mudgdZ ~]# cat /server/scripts/bxg/bxg-mobile.sh 2#!/bin/bash 3source /etc/profile 4DIR="/application/node" 5DATE=`date +%Y%m%d` 6 7Backup="/application/node/m/" 8BAK="/data/hub/bxg-mobile" 9 10 11 12backup_tar(){ 13 echo "为了防止意外cp整个项目目录存放" 14 cp -ar $Backup ${BAK}/mobile_$DATE 15 echo "online-server 原目录拷贝备份完成!" 16} 17 18 19 20cp_war(){ 21 /etc/init.d/mobile stop 22 #mv $Backup /tmp/m_${DATE} && rm -rf /tmp/m_${DATE} 23 rm -rf $Backup 24 mkdir $Backup && cd /application/node/ 25 tar xf m_${DATE}.tar.gz -C $Backup 26 27 28} 29npm_config(){ 30 cd $Backup 31 cnpm install 32 npm run build-prod 33 npm run start-prod &>/var/log/mobile_${DATE}.log & 34 35} 36 37C(){ 38 echo "++++++++++++++++++++++++++++++++++++++++++++++++++++" 39 curl -I 127.0.0.1:3000 40 echo "###################################################" 41 echo "若是200 服务启动正常! 可以启动另一台!" 42 echo "###################################################" 43} 44 45 46 47 48 49 50 51backup_tar 52cp_war 53npm_config 54C
+
相关文章 Node.js 环境搭建
总结:Jenkins自动化不是运维一个人就可以完成的,需要研发的参与,本文只是给大家展示一下我公司的自动化,我眼里所谓的自动化. 希望大家不喜勿喷,对文章有意见或建议请在评论留言哦~