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就可以了。