jenkins+Maven持续继承中的不同环境配置问题解决
说明:改文档主要用于开发人员改造现有系统,快速使用持续继承自动部署。实现开发、测试、生产环境自动打包。解决频繁打包,替换配置文件出错等等问题。让一切自动化起来。
第一部分:项目修改部分
1、修改service.sh脚本。
替换项目下/main/resource/bin中的service.sh文件。注意:标注部分请替换成你所修改的服务的MAINCLASSNAME。
#!/bin/bash
#project directory
MAINCLASSNAME="com.reapal.main.CoreMain"
if [ -z "$BASE_DIR" ] ; then
PRG="$0"
# need this for relative symlinks
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*->\(.*\)$'`
if expr "$link" : '/.*'> /dev/null; then
PRG="$link"
else
PRG="`dirname"$PRG"`/$link"
fi
done
BASE_DIR=`dirname "$PRG"`/..
# make it fully qualified
BASE_DIR=`cd "$BASE_DIR"&& pwd`
#echo "Benchtest is at$BASE_DIR"
fi
source $BASE_DIR/bin/env.sh
AS_USER=`whoami`
LOG_DIR="$BASE_DIR/log"
PID_DIR="$BASE_DIR/log"
PID_FILE="$PID_DIR/.run.pid"
CONFIG_FILE=" $BASE_DIR"
function running(){
if [ -f "$PID_FILE" ]; then
pid=$(cat "$PID_FILE")
process=`ps aux | grep " $pid" | grep -v grep`;
if [ "$process" =="" ]; then
return 1;
else
return 0;
fi
else
return 1
fi
}
function start_server() {
if running; then
echo "is running."
exit 1
fi
mkdir -p $PID_DIR
mkdir -p $LOG_DIR
chown -R $AS_USER $PID_DIR
chown -R $AS_USER $LOG_DIR
sleep 1
nohup $JAVA $SERVER_ARGS$MAINCLASSNAME $CONFIG_FILE >/dev/null 2>&1 &
echo $! > $PID_FILE
chmod 755 $PID_FILE
sleep 1;
}
function stop_server() {
if ! running; then
echo "service is notrunning."
exit 1
fi
count=0
pid=$(cat $PID_FILE)
while running;
do
let count=$count+1
echo "Stopping $counttimes"
if [ $count -gt 5 ]; then
echo "kill -9 $pid"
kill -9 $pid
else
kill $pid
fi
sleep 3;
done
echo "Stop servicesuccessfully."
rm $PID_FILE
}
function help() {
echo "Usage: startup.sh{start|stop}" >&2
echo "start:start the server"
echo "stop:stop the server"
}
command=$1
shift 1
case $command in
start)
start_server $@;
;;
stop)
stop_server $@;
;;
*)
help;
exit 1;
;;
esac
说明:此脚本做了细微修改,注释掉了启动后打印日志的代码。同时去掉了自动创建日志文件的代码。日志文件通过log4j配置生成。便于日切。
2、基于dubbo的服务实现流程(请参考base-core项目)
(1)修改pom.xml文件。
在pom.xml文件的project标签内(倒数第二行)添加如下配置:
说明:true添加的地方说明时默认的配置。就是使用maven打包不传参时,默认使用的配置。
(2)修改resource/assembly/assembly.xml文件
特别说明:如果你的项目之前的标签配置的是/src/main/resources请在其前面添加${project.basedir},修改之后如下:
上面修改主要解决windows和linux下文件路径问题。添加${project.basedir}后,linux系统就可以正常打包了。如果缺少此处,mac、linux系统是无法打包的。
(3)修改resource/assembly/assembly.xml文件
(4)准备env文件。如下图所示,在resource中添加如下目录的文件(与环境相关的配置)。
(5)如何测试自己配置的是否成功?
使用maven命令打包
clean package -P dev或者clean package -P qa或者clean package -P prod
检查打包中的配置文件是否正确。
3、基于dubbo的web项目实现流程(请参考base-web-auth项目)
(1)同2(1)中修改。修改完后如下所示。
(2)继续修改pom.xml文件(与dubbo服务不通之处)
按照下图添加对应配置。
配置:dev
添加maven-war-plugin配置:
(3)测试:同2中测试。
第二部分:jenkins持续集成配置
1、前提:你的代码已经在gitlab上托管。(请参考giltlab文档,此处不做说明)
Gitlab托管代码,首次提交请在项目内添加.gitignore文件,防止一些不必要的文件提交。
下图仅供参考:
2、Jenkins配置
(1)jenkins build配置
(2)post steps配置,可以配置多个module,详情请参考basev2项目。
(3)目标服务器准备
如上图10.168.16.115即为项目自动打包成功后发布的服务器地址。使用前提如下:
u在目标服务器创建dev用户工作空间为/home/dev
u在home下准备启动脚本publish.sh
内容如下:
#!/bin/bash
#defined
BASE_HOME="/home/dev"
PROJECT_NAME="$1"
DIR="$2"
#param validate
if [ $# -lt 2 ]; then
echo "you must use like this : ./publish.sh "
exit
fi
if [ ! -f $DIR ] ; then
echo "*****The destination [$DIR] is not exist , pleast confirm it first !!! ***********"
exit
fi
if [ -n "`echo $DIR | sed -n /\.war$/p`" ] ;then
#shutdown tomcat
"$BASE_HOME"/$PROJECT_NAME/bin/shutdown.sh
echo "tomcat shutdown"
ID=`ps -ef | grep java | grep $PROJECT_NAME|awk '{print $2}'`
echo $ID
echo "---------------"
for id in $ID
do
kill -9 $id
echo "killed $id"
done
echo "---------------"
#publish project
echo "scan no tomcat pid,$PROJECT_NAME publishing"
rm -rf "$BASE_HOME"/$PROJECT_NAME/webapps/ROOT
cp $DIR "$BASE_HOME"/$PROJECT_NAME/webapps/ROOT.war
#start tomcat
"$BASE_HOME"/$PROJECT_NAME/bin/startup.sh
echo "tomcat is starting,please try to access $PROJECT conslone url"
elif [ -n "`echo $DIR | sed -n /\.tar\.gz$/p`" ] ; then
#stop provider
"$BASE_HOME"/$PROJECT_NAME/bin/service.sh stop
echo "service stop"
ID=`ps -ef | grep java | grep $PROJECT_NAME|awk '{print $2}'`
echo $ID
for id in $ID
do
kill -9 $id
echo "killed $id"
done
#unzip tar.gz
rm -rf "$BASE_HOME"/$PROJECT_NAME/
tar -zxf$DIR -C ./
cd "$BASE_HOME"/$PROJECT_NAME/bin
sed -i 's/\r//' *.sh
chmod 775 *.sh
#start provider
"$BASE_HOME"/$PROJECT_NAME/bin/service.sh start
else
echo "****************The DIR must endwith <.war>or <.tar.gz> *****************************"
exit
fi
特别说明:
如果是dubbo服务,无需做其他准备。如果是web项目,请先在服务器的/home/dev/目录下准备好tomcat并设置好端口。
如果出现权限不足,请执行chown -R dev:dev /home/dev/*