Jenkins部署Java程序docker镜像

最近在做部署系统,尝试了一下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变量即可。

发表评论

您的电子邮箱地址不会被公开。