前言
在上文性能环境之Jenkins+Maven自动化部署SpringBoot压测环境(实战篇)中我们介绍了常规部署流程,本文将在上文的基础上扩展Jenkins+Maven+Docker自动化部署我们的压测环境。
关于Docker
Docker在这里有什么用?
Docker,是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker是基础架构的管理员。它将能够打包软件及其所有依赖项以作为容器运行。您可以将应用(作为docker镜像打包)部署到安装了docker的任何计算机中。它将软件与硬件分开 - 因此开发人员可以放心,应用程序将在任何计算机上运行,而不管机器可能具有哪些可能与用于编写和测试代码的机器不同的自定义设置。
题外话:本人觉得,每个Tester都应该了解下Docker,毕竟我们不是专业的运维,如果花费大量时间在倒腾一些环境的安装,也是蛮枯燥乏味的。使用了Docker可以减少很多的时间,可以直接上手部署各式各样的环境了。真的很Nice呀!
整体设计
新建Jenkins Job
我们在上文常规部署Job基础上复制一个新的job
配置Job
Post Steps
Send files or execute commands over SSH中的 Execcommand
修改为 jenkins-in/buildimage.sh
新建buildimage脚本
测试应用服务上 /root/jenkins-in
目录新建 buildimage.sh
1. # 设置系统时间
2. DATE=$(date +%Y%m%d)
3. # 设置程序目录
4. DIR=/usr/local/app
5. # 设置Jar名称
6. JARFILE=person-0.0.1-SNAPSHOT.jar
7. # 设置Docker镜像&容器名称
8. SERVER_NAME=springboot-docker-demo
9. # 容器id
10. CID=$(docker ps | grep "$SERVER_NAME" | awk '{print $1}')
11. # 镜像id
12. IID=$(docker images | grep "$SERVER_NAME" | awk '{print $3}')
13.
14. # 判断是否存在backp目录,如果不存储就创建
15. if [ ! -d $DIR/backup ];then
16. mkdir -p $DIR/backup
17. fi
18. cd $DIR
19.
20. # 杀掉当前的容器及镜像
21. docker stop $CID
22. docker rm $CID
23. docker rmi $IID
24.
25. # 备份旧程序
26. mv $JARFILE $DIR/backup/$JARFILE$DATE
27. # 部署新程序
28. mv -f /root/jenkins-in/$JARFILE .
29. # build镜像
30. docker build -t $SERVER_NAME .
31.
32. echo "The service will be starting"
33. # 运行容器
34. docker run --name $SERVER_NAME -d -p 8081:8081 $SERVER_NAME
35.
36. cd backup/
37. ls -lt|awk 'NR>5{print $NF}'|xargs rm -rf
38. echo "starting success!!!"
39. ~
创建Dockerfile
测试应用服务器 /usr/local/app
下创建Dockerfile
1. # Dockerfile
2. # 基于的镜像
3. FROM frolvlad/alpine-oraclejdk8
4.
5. # 数据挂载点
6. VOLUME /usr/local/app/logs
7.
8. # 指定路径下的copy内容到容器中路径下
9. ADD person-0.0.1-SNAPSHOT.jar /usr/local/app/app.jar
10.
11. # 指定镜像的默认入口
12. # -Djava.security.egd=file:/dev/./urandom 可解决tomcat可能启动慢的问题
13. ENTRYPOINT java ${JAVA_OPTS} ${JVM_GC_LOG_PATH} -Djava.security.egd=file:/dev/./urandom -jar /usr/local/app/app.jar
14.
15. # 对外端口
16. EXPOSE 8081
17.
18. # 工作目录
19. WORKDIR /usr/local/app
20.
21. # JVM参数
22. ARG JAVA_OPTS="-server -Xms1024M -Xmx1024M -XX:PermSize=256M -XX:MaxPermSize=256M \
23. -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails \
24. -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=127.0.0.1 \
25. -Dcom.sun.management.jmxremote.port=10086 -Dcom.sun.management.jmxremote.ssl=false \
26. -Dcom.sun.management.jmxremote.authenticate=false"
27.
28. # log路径
29. ARG JVM_GC_LOG_PATH="-XX:ErrorFile=/usr/local/app/logs/gc/hs_err_pid%p.log -XX:HeapDumpPath=/usr/local/app/logs/gc"
30.
31. # JVM环境变量
32. ENV JAVA_OPTS=${JAVA_OPTS}
33. ENV JVM_GC_LOG_PATH=${JVM_GC_LOG_PATH}
部署项目
点击“立即构建”,任务控制台将实时输出相关信息
我们看到输出了starting success!!!,说明我们需要的应用容器已经跑起来了!
我们可以去测试应用服务器验证下
我们可以看到 springboot-docker-demo
镜像已经成功运行起来
测试验证
此处,我们还是使用Postman验证应用查询人员接口
我们可以看到应用成功返回了JSON数据,测试成功。