Jenkins+SVN+Maven+SSH Publish自动化部署

Jenkins简介

在以前或者传统的互联网公司,普遍使用的是开发本地编译代码,然后将代码推送到服务器或者运维,运维再将代码发不起来。整个过程繁杂,环节过多,极容易出现纰漏,如果出现多个项目同时发布,极容易出现代码版本的匹配问题。所以引入自动化运维是解决这一问题的关键。

Jenkins依赖环境

1、JDK1.8

Jenkins最新版2.168是需要jdk1.8才能支持的

2、maven

使用最新版的Maven3.6

Jenkins的安装

一、RPM的方式安装

建议使用离线rpm的方式安装,避免其他不必要的环境续期

1、RPM安装

rpm -ivh jenkins-2.168-1.1.noarch.rpm

2、修改Jenkins的配置文件

vim /etc/sysconfig/jenkins

修改配置文件中以下两处

##Jenkins所有的用户
JENKINS_USER="root"

##Jenkins访问所需端口
JENKINS_PORT="9000"

3、修改java环境的地址

vim /etc/init.d/jenkins

修改配置文件中的java进程地址

candidates="
/etc/alternatives/java
/usr/lib/jvm/java-1.8.0/bin/java
/usr/lib/jvm/jre-1.8.0/bin/java
/usr/lib/jvm/java-1.7.0/bin/java
/usr/lib/jvm/jre-1.7.0/bin/java
/usr/lib/jvm/java-11.0/bin/java
/usr/lib/jvm/jre-11.0/bin/java
/usr/lib/jvm/java-11-openjdk-amd64
/usr/bin/java
#自定义bin/java的地址
/root/jdk1.8.0_191/bin/java
"

4、启动Jenkins

#启动命令
service jenkins start

5、修改配置文件安装插件

rpm安装后首次访问会在/var/lib/jenkins中生成相关的配置,修改hudson.model.UpdateCenter.xml

vim hudson.model.UpdateCenter.xml

修改如下:



  
    default
    
    
    
    https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/current/update-center.json
  

二、tomcat的方式安装jenkins

1、下载并安装

2、修改配置文件安装插件

配置文件在C:\Users\Administrator\.jenkins\hudson.model.UpdateCenter.xml



  
    default
    
    
    
    https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/current/update-center.json
  

初始化Jenkins

初始化配置按照引导配置,选择推荐插件即可,如果需要配置代理,则在%Jenkins_home%/updates/default.json中将google.com改成baidu.com即可

依赖插件

除去推荐安装的插件外,仍需另外几个插件

  • SSH Plugin 自定义发布文件到服务器所需插件
  • Maven Integration plugin 配置Maven所需插件
  • Locale plugin 中文汉化所需插件
  • Publish Over SSH 推送文件所需插件
  • Role-based Authorization Strategy 角色配置插件

公用配置项配置

配置位置

Jenkins+SVN+Maven+SSH Publish自动化部署_第1张图片

配置jdk

如图:

Jenkins+SVN+Maven+SSH Publish自动化部署_第2张图片

配置Maven

如图:

Jenkins+SVN+Maven+SSH Publish自动化部署_第3张图片Jenkins+SVN+Maven+SSH Publish自动化部署_第4张图片

配置权限

配置位置:

Jenkins+SVN+Maven+SSH Publish自动化部署_第5张图片

修改授权策略(此处就是之前安装的插件,必须选择此选项才能配置角色权限):

Jenkins+SVN+Maven+SSH Publish自动化部署_第6张图片

这里面有许多的坑,我单独在开一篇进行讲解

Publish Over SSH

将编译后的源文件直接推送的对应的服务器

Jenkins+SVN+Maven+SSH Publish自动化部署_第7张图片

这里的SSH配置有两种方式,

  1. 第一种是SSH Key免登陆的方式去做,在Passphrase配置key的密码,然后再path中配置路径,填入远程信息即可连接
  2. 第二种是在高级里面直接配置连接密码即可,不需要使用SSH,配置如图:

Jenkins的任务使用

源码配置

Jenkins+SVN+Maven+SSH Publish自动化部署_第8张图片

注意此处的Local module directory配置,此处的配置是基于Jenkins的workspace的。和下面的推送自动消除目录是要相匹配的

触发器配置

Jenkins+SVN+Maven+SSH Publish自动化部署_第9张图片

此处配置的含义就是每分钟去轮询一下SVN,如果SVN发生了改变,则触发构建任务

Build配置

Jenkins+SVN+Maven+SSH Publish自动化部署_第10张图片

打包命令:clean install -Dmaven.test.skip=true

注意此处maven打包只能构建后端的代码,如果项目中有前端代码是无法编译的

编译后脚本处理

推送脚本处理

Jenkins+SVN+Maven+SSH Publish自动化部署_第11张图片

此处的SSH就是刚才配置的SSH,Exec Command 就是在文件推送后执行的命令,这里放出我自己编写的脚本作为参考。

cd /root
#备份文件数量
number=3
##备份根目录,相对于/root
root=test
dd=$BUILD_ID-`date +%Y%m%d%H%M%S`
soft=aaa
 
#创建备份目录
if [ ! -d $root/$soft/"back" ];then
	mkdir $root/$soft/back
	echo "create "$root/$soft"/back"
fi
 
##创建备份文件夹out/soft/back/time
mkdir $root/$soft/back/$dd
echo "create "$root/$soft"/back"/$dd
 
dir=$root/$soft/back
#删除旧备份
FileNum=$(ls -l $dir/ | grep ^d | wc -l)
echo "current files number:"$FileNum
while(( $FileNum > $number ))
do
    #取最旧的文件夹,*.*可以改为指定文件类型
    OldFile=$(ls -rt $dir/ | head -n 1)
    echo "Delete File:"$OldFile
    rm -rf $dir/$OldFile
    let "FileNum--"
done
 
##跳转到文件输出目录
cd  $root/$soft
 
##备份文件
echo "copy back file"
cp *.war back/$dd
 
##停止程序
ps -fe | grep java | grep $soft |grep -v grep
if [ $? -eq 0 ]
then
	ps -ef | grep java  | grep $soft | grep -v grep | awk '{print $2}' | xargs kill -9
	echo "stop software"
fi
##启动程序
echo "start war"
nohup java -jar -Xmx1024m -Xmx768m *.war >$soft.log  &

此脚本的做的事情就是,首先创建一个备份目录,然后清除旧的备份文件,只保留最新的备份文件。然后将SSH推送过来的文件进行保存,最后判断此程序是否已经运行过,如果运行则kill之后再启动。

此处会存在一个java命令找不到的情况,具体原因及解决办法戳这里Jenkins SSH 命令command not found问题解决

留档脚本处理

除去我们推送给运行服务器的包,我们还在在编译服务器上留档备份。备份脚本如下:

#base 目录
base_dir=/home/back
#保留备份数量
number=3
#日期格式
dd=`date +%Y%m%d%H%M%S`
##项目的名称
pro=test
##打包的名称
war=$JOB_NAME
#判断文件夹是否存在
if [ ! -d $base_dir ];then
	mkdir $base_dir
	echo "create"$base_dir
fi
if [ ! -d $base_dir/$pro ];then
	mkdir $base_dir/$pro
	echo "create $base_dir/"$pro
fi
 
if [ ! -d "$base_dir/"$pro/$war ];then
	mkdir $base_dir/$pro/$war
	echo "create $base_dir/"$pro"/"$war
fi
 
dir=$base_dir/$pro/$war
#删除旧备份
FileNum=$(ls -l $dir/ | grep ^d | wc -l)
echo "current files number:"$FileNum
while(( $FileNum > $number ))
do
    #取最旧的文件夹,*.*可以改为指定文件类型
    OldFile=$(ls -rt $dir/ | head -n 1)
    echo "Delete File:"$OldFile
    rm -rf $dir/$OldFile
    let "FileNum--"
done
#创建新备份
cd $dir
mkdir $BUILD_ID-$dd
echo "create folder"$BUILD_ID-$dd
##备份文件
cp ${WORKSPACE}/target/*.war $BUILD_ID-$dd


此脚本的目的就是备份发布的代码,然后删除旧的代码版本。然后点击立即构建,就可以成功构建代码了

 

 

 

你可能感兴趣的:(运维,Jenkins)