使用svn+docker搭建持续集成环境

功能描述: 通过使用svn+docker部署一套自动打包系统,使得项目的打包部署更加简单,只需要做一步操作: 在本地svn上面执行commit操作即可,svn服务器端收到推送后,会利用post-commit钩子将新的项目内容同步到目标路径,同时执行docker打包脚本,被docker部署脚本

准备工具

  1. svn服务端
  2. docker和tomcat基础镜像

实现逻辑

  1. 使用svn进行项目更新包的同步
  2. svn hooks完成更新包和tomcat内容的同步
  3. 自动化脚本由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操作,服务器端自动重新构建全新版本的项目,无需进行多余操作

注意点:

  1. 注意dockerFile的编写规范,要求待打包的内容必须在上下问路径
  2. 注意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 + ######容器启动完成#####