使用svn+docker搭建持续集成环境
功能描述: 通过使用svn+docker部署一套自动打包系统,使得项目的打包部署更加简单,只需要做一步操作: 在本地svn上面执行commit操作即可,svn服务器端收到推送后,会利用post-commit钩子将新的项目内容同步到目标路径,同时执行docker打包脚本,被docker部署脚本
准备工具
- svn服务端
- docker和tomcat基础镜像
实现逻辑
- 使用svn进行项目更新包的同步
- svn hooks完成更新包和tomcat内容的同步
- 自动化脚本由post-commit调用;完成镜像版本的更新、镜像启动等操作
第一步:安装svn服务端,并且在本地checkout出一份,同时在服务器找个文件夹checkout一份
这一步比较简单,可以看我另一篇博客学习,地址如下:Linux SVN服务端搭建
第二步:配置svn hooks实现自动同步,将版本库中文件自动checkout到docker待打包目录
post-commit文件内容示例如下:
echo "#####开始提交 #####" >> /tmp/svn.log #svn日志
echo "提交时间为:" + `date` >>/tmp/svn.log
echo "提交人:" + `whoami` >>/tmp/svn.log
/usr/bin/svn update /opt/tomcat/webapps/lin --username *** --password *** --no-auth-cache
# 执行docker脚本
sudo sh /opt/tomcat/webapps/lin/docker.sh #调用docker.sh脚本,完成镜像包的制作,容器的制作启动等操作
第三步: 编写docker.sh脚本
docker.sh示例: 由于虚拟机空间有限,镜像包的制作逻辑没有遵循版本号递增的规则,此处每次进行重新构建的操作,如果是服务器环境,可以选择利用版本号做区分,或者和我的注释一样,使用时间戳进行标记
#!/bin/sh
# 版本号
#version=`date +%s`
#version=`docker images | grep linjinbao666/svntest | awk '{print $2+1}' | awk '{print $1+1}'`
#version=`docker images | grep linjinbao666/svntest|head -n -1 | awk '{print $2+1}'`
cd /opt/tomcat/webapps/lin
systemctl restart docker >> /tmp/docker.log
echo "##########1.关闭上一个容器" >> /tmp/docker.log
docker stop svntest >> /tmp/docker.log
sleep 5
echo `date` + "###########上一个容器已经关闭####" >> /tmp/docker.log
echo `date` + "##########2.删除上次的容器##" >> /tmp/docker.log
docker rm svntest >>/tmp/docker.log
sleep 5
echo `date` + "#############上一个容器删除####" >> /tmp/docker.log
echo `date` + "#######3.开始删除镜像##########" >> /tmp/docker.log
docker rmi linjinbao666/svntest:latest >> /tmp/docker.log
sleep 15
echo `date` + "########删除上次镜像成功#######" >> /tmp/docker.log
echo "#########4.开始重新制作docker镜像包#########" >> /tmp/docker.log
sudo docker build -f ./dockerFile -t linjinbao666/svntest --no-cache . >> /tmp/docker.log
sleep 20
echo "##########制作完成#########" >> /tmp/docker.log
echo `date` >> /tmp/docker.log
# docker stop $(docker ps -aq)
# sleep 10
# docker rm $(docker ps -aq)
echo `date` + "5.###########创建并启动新的容器####### " >> /tmp/docker.log
# docker run -dit -p 8088:8080 --name svntest linjinbao666/svntest
sudo docker run -dit -p8088:8080 --name svntest linjinbao666/svntest >> /tmp/docker.log
sleep 5
echo `date` + "######容器启动完成#####">>/tmp/docker.log
# echo `date` + "##########删除标签为none的镜像####">> /tmp/docker.log
# docker images | grep none | awk '{print $3}' | xargs docker rmi
# echo `date` + "############清理镜像成功#####">> /tmp/docker.log
# sleep 15
第四步:编写dockerFile脚本
dockerFile示例:
FROM tomcat
COPY . /usr/local/tomcat/webapps/lin
CMD ["catalina.sh", "run"]
EXPOSE 8080
操作说明
在本地svn文件夹修改文件后,进行commit操作,服务器端自动重新构建全新版本的项目,无需进行多余操作
注意点:
- 注意dockerFile的编写规范,要求待打包的内容必须在上下问路径
- 注意shell脚本的执行路径,即脚本
docker.sh
中的cd /opt/tomcat/webapps/lin
,该语句将工作目录切换到路项目文件同级目录,缺少这一句,docker命令执行会出现找不到文件的问题
带图演示
第一次index.html的内容
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8">
</head>
<body>
第一次提交
第二次提交,修改了页面内同
</body>
</html>
提交页面截图:
浏览器访问截图:
修改index.html页面的内容后提交 第二次提交页面截图:
第二次浏览器访问截图:
解释
两次提交过程中,我并没有登录服务器进行手动重构镜像,全部由其自动化完成
docker.log内容截取:
##########1.关闭上一个容器
svntest
2019年 11月 04日 星期一 05:25:53 CST + ###########上一个容器已经关闭####
2019年 11月 04日 星期一 05:25:53 CST + ##########2.删除上次的容器##
svntest
2019年 11月 04日 星期一 05:25:58 CST + #############上一个容器删除####
2019年 11月 04日 星期一 05:25:58 CST + #######3.开始删除镜像##########
Untagged: linjinbao666/svntest:latest
Deleted: sha256:1443c6b69c386a3b6fc6ed44f4f14e0908748b0f51ccd0076da371239d17e099
Deleted: sha256:af62668e9b8abce6dd5310e3c7d65fb927c95a92297e8ceb51f1cfee7684f470
Deleted: sha256:57bee29050664264b6a34bb2686c5065c454b76a5e4698741e8b1cbf93aa3bea
Deleted: sha256:f2abd86d82492bb73cba146bf6f5058d082ae5bb521d3c99e2d350d81d3f0e71
2019年 11月 04日 星期一 05:26:13 CST + ########删除上次镜像成功#######
#########4.开始重新制作docker镜像包#########
Sending build context to Docker daemon 1.03 MB
Step 1/4 : FROM tomcat
---> 882487b8be1d
Step 2/4 : COPY . /usr/local/tomcat/webapps/lin
---> fa7128130bd2
Removing intermediate container f7d201e5ddea
Step 3/4 : CMD catalina.sh run
---> Running in c10feb7bc7cd
---> 52eb3d3b929e
Removing intermediate container c10feb7bc7cd
Step 4/4 : EXPOSE 8080
---> Running in 3aeb1e06ec54
---> 452efcac24bd
Removing intermediate container 3aeb1e06ec54
Successfully built 452efcac24bd
##########制作完成#########
2019年 11月 04日 星期一 05:26:34 CST
2019年 11月 04日 星期一 05:26:34 CST + 5.###########创建并启动新的容器#######
e1c219214186b625d0b01fef0cc7db482a09427e47857306c41943f38aa42d51
2019年 11月 04日 星期一 05:26:40 CST + ######容器启动完成#####