jenkins+gitlab+docker+springboot构建及回滚实现

1、需求及实现方案

1.1 需求:

应用服务是一个springboot的java项目,项目中需要注意的是服务端口和日志映射目录。代码托管在gitlab上,服务的打包及发布是在jenkins这台服务器上。

1.2 实现方案:

之前的实现方法是jenkins创建maven项目来构建,然后通过ssh方式发布到应用服务器,但因为是maven项目,实现发布新版本好说,要回滚不好在jenkins上实现,因为每次构建项目都要调用mvn,不管有没有用到新包,会浪费时间。

所以稍微改版一下,jenkins创建自由风格项目,然后用参数化构建,用build_id来作为每次备份的目录名。shell脚本通过参数来判断新发布的时mvn构建,回滚时根据参数选项回滚到指定版本。

2、实现过程

2.1 各软件的安装过程就不在这介绍了,列一下需要的服务器及软件:

gitlab:独立服务器,代码托管。

jenkins:独立服务器,可以docker方式启动,也可以物理机启动。因为我们是用maven打包,所以需要安装maven,另外本机安装了jar私库,nexus,具体打包需要哪些依赖,maven怎么调用nexus,自己上传配置就好了。

应用服务器:docker,CentOS 7.7,java:8基础镜像。

2.2 jenkins+gitlab操作:

jenkins需要与gitlab作ssh-key认证,应用服务器也需要在jenkins里做一下ssh认证,在jenkins的系统管理-系统设置里,Publish over SSH

然后主要是jenkins创建任务:

创建自由风格的任务-在general中选择-参数化构建,先填写选项参数,然后再填加字符参数。

 

 

 

下边是git地址:

 

下边选择Build中的执行shell

 

 

 

case $deploy_type in
    deploy)
        echo "deploy:$deploy_type"
        /usr/local/apache-maven-3.6.1/bin/mvn -s /usr/local/apache-maven-3.6.1/conf/settings.xml clean install -Dmaven.test.skip=true -f salary_wallet/pom.xml -P test
        path="${WORKSPACE}/bak"
           [ -d $path ] || mkdir -p $path
  
        cd ${WORKSPACE}
        rm -rf *.tar.gz
             tar czf bak/${JOB_NAME}-${BUILD_NUMBER}.tar.gz salary_wallet/target/*.jar --exclude=bak
            find $path  -mtime 2 -name "*.tar.gz"  -exec rm -rf {} \;
            echo "Deployment Completed!"
        ;;
    rollback)
        echo  "rollback:$deploy_type"
        echo "buildNum:"$buildNum
        rm -rf target
        cd ${WORKSPACE}
        rm -rf *.tar.gz
        if [ -f bak/${JOB_NAME}-$buildNum.tar.gz ];
        then
            cp bak/${JOB_NAME}-$buildNum.tar.gz ${WORKSPACE}
            tar -zxvf ${JOB_NAME}-$buildNum.tar.gz
            echo  "Rollbacked To build Number:$buildNum"
            pwd && ls
        else
 
            echo  "=========================================================================================="
            echo  "Build Number $buildNum is a Rollback build number ;Please chose a deploy build number!"
            echo  "========================================================================================== "
            cp bak/${JOB_NAME}-$buildNum.tar.gz ${WORKSPACE}
        fi
        ;;
        *)
        exit
            ;;
esac

 

然后到Post-build Actions,选择Send build artifacts over SSH,在里边选择之前创建好的目录应用服务:

这里需要注意的是Remote directory这是相对于系统设置里创建的ssh连接的目录,如果写就是下边的子目录。

 

如果是回滚或者频繁发布未改变代码的build,每次的镜像是不会改变的,所以会同时出现多个同IMAGE ID的镜像,脚本删不掉原来的,不必担心,当代码有改变时构建就会删除了。

该脚本中APP_HOME下边的Dockerfile内容,是在应用服务器上,先pull好java:8基础镜像,会加快速度,在生产环境建议使用自建仓库:

cat Dockerfile 

FROM java:8
MAINTAINER hk
#VOLUME
VOLUME /tmp

#拷贝jar包
ADD saXXXXX-0.0.1-SNAPSHOT.jar saXXXXX-0.0.1-SNAPSHOT.jar

#容器启动命令 也可以用CMD 但CMD会被docker run的指令覆盖
ENTRYPOINT ["java","-jar","/saXXXXX-0.0.1-SNAPSHOT.jar"]

 

小建议及记录:

可以看到我的jenkins脚本中限制了docker 的内存及CPU,不然多个docker在同一宿主机,在资源紧张的时候会杀死部分docker进程。我没有加禁止oom本docker的参数,自己在创建分配docker的时候根据宿主机配置来,不要盲目。

docker run -itd --name $TAG_NAME --cpuset-cpus "0-2" -m 4G --memory-reservation 500M  -p 3780:3780 -v ${APP_HOME}/log:/log ${TAG_NAME}:${TODAY}

 这样就算配置完成了,jenkins构建按扭就不是原来的立即构建了,点进去会有选项,新发不需要指定参数,直接点就可以,选择rollback的时候注意选择回退到哪次buildNum就可以了。

 

posted @ 2021-03-04 10:41  莫莫学习  阅读(706)  评论(0编辑  收藏  举报