最近在做部署系统,尝试了一下Jenkins+Java+docker的组合,写了个脚本,通过该脚本配合Jenkins可以实现Jenkins自动编译打包Java代码,并生成一个docker镜像,启动docker容器。
整体思路和直接部署jar包相似,都是先检查原有进程,若有则结束,启动新进程,体现在脚本中就是clean和deploy两个函数。具体到docker时,创建docker是以java8的docker镜像为基础,将自己的jar包打进去形成新镜像。
脚本如下,入参较多,用具体变量名称代替默认入参名:
#!/bin/bash
JARDIR=$1/target
APPNAME=$2
DAPPNAME=$3
PORT=$4
PARAMETER="--spring.profiles.active=$5"
DOCKERNAME=$6
CONTAINERNAME=$7
deploy(){
#create docker image
cd ${JARDIR}
touch Dockerfile
cat << EOF > Dockerfile
FROM java:8-jre-alpine
ADD ${APPNAME} /${DAPPNAME}
WORKDIR /
EXPOSE ${PORT}
CMD java -jar /${DAPPNAME} ${PARAMETER}
EOF
#start docker image
sudo docker build -t ${DOCKERNAME} .
sudo docker container run -d --name ${CONTAINERNAME} -p ${PORT}:${PORT} -u root ${DOCKERNAME}
sudo docker container ls | grep ${DOCKERNAME}
echo "===========deploy finished!=============="
}
clean(){
#stop and delete the old docker container
CONTAINERID=`sudo docker container ls | grep ${DOCKERNAME} | cut -d' ' -f1`
sudo docker container stop ${CONTAINERID}
sudo docker container rm ${CONTAINERID}
#delete the old docker image
IMAGEID=`sudo docker image ls | grep java/JAVANAME | tr -s ' ' | cut -d' ' -f3`
sudo docker image rm ${IMAGEID}
echo "========cleaning finished!==========="
}
main(){
sudo docker container ls |grep ${DOCKERNAME}
if [ $? == 0 ];then
clean
fi
deploy
}
main
exit 0
在Jenkins上配置的remote directory:
~/publish/${JOB_NAME}/${BUILD_ID}
Jenkins上需要配置的执行命令exec command:
sh ~/publish/deploy_java.sh ~/publish/${JOB_NAME}/${BUILD_ID} JAVANAME-0.0.1-SNAPSHOT.jar JAVANAME.jar 8089 beta java/JAVANAME:latest java-JAVANAME
在java程序启动参数一致的情况下,该脚本是通用的,只需要修改脚本入参即可。若java程序启动参数有变化,只需要改变脚本中的parameter变量即可。