在以前或者传统的互联网公司,普遍使用的是开发本地编译代码,然后将代码推送到服务器或者运维,运维再将代码发不起来。整个过程繁杂,环节过多,极容易出现纰漏,如果出现多个项目同时发布,极容易出现代码版本的匹配问题。所以引入自动化运维是解决这一问题的关键。
Jenkins最新版2.168是需要jdk1.8才能支持的
使用最新版的Maven3.6
建议使用离线rpm的方式安装,避免其他不必要的环境续期
rpm -ivh jenkins-2.168-1.1.noarch.rpm
vim /etc/sysconfig/jenkins
修改配置文件中以下两处
##Jenkins所有的用户
JENKINS_USER="root"
##Jenkins访问所需端口
JENKINS_PORT="9000"
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
"
#启动命令
service jenkins start
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
配置文件在C:\Users\Administrator\.jenkins\hudson.model.UpdateCenter.xml
default
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/current/update-center.json
初始化配置按照引导配置,选择推荐插件即可,如果需要配置代理,则在%Jenkins_home%/updates/default.json中将google.com改成baidu.com即可
除去推荐安装的插件外,仍需另外几个插件
配置位置
如图:
如图:
配置位置:
修改授权策略(此处就是之前安装的插件,必须选择此选项才能配置角色权限):
这里面有许多的坑,我单独在开一篇进行讲解
将编译后的源文件直接推送的对应的服务器
这里的SSH配置有两种方式,
注意此处的Local module directory配置,此处的配置是基于Jenkins的workspace的。和下面的推送自动消除目录是要相匹配的
此处配置的含义就是每分钟去轮询一下SVN,如果SVN发生了改变,则触发构建任务
打包命令:clean install -Dmaven.test.skip=true
注意此处maven打包只能构建后端的代码,如果项目中有前端代码是无法编译的
此处的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
此脚本的目的就是备份发布的代码,然后删除旧的代码版本。然后点击立即构建,就可以成功构建代码了