曾几何时,发布Java项目是需要在本地打包,然后ssh登陆远程服务器,然后上传包到指定目录,然后杀进程,启动项目。流程很冗长,很机械化,非常的人肉运维

说来惭愧,其实自由书之前也是这么做的。但是,在某一天频繁的修改发布,我发现这是一个问题,本来自由书就是我用于学习的平台,用于对技术实践的地方,那为何不把自动化运维也搞一把呢,说干就干。先上一张目前自由书的架构图

可以看到自由书目前从架构上还是比较简单的,虽然使用了springboot脚手架,但是模块化,监控这块做的还不够完善,后续我会慢慢拆分的。就像新开的项目,其实都是图快图简单嘛,有需求了才有动力嘛。
但是自由书也不是一点好的地方也没有,比如还是部分使用到了devops的地方。
下面我就梳理下自由书的自动发布打包更新镜像到重建容器的过程,前半部分是整理概览,后半部分我将手把手的教大家在云上从购买主机到配置Docker再到编译发布整个过程(没有广告哈)。
触发构建
这个过程是最简单的,因为我是设置的master分支 pull request时触发hooks具体设置如下:


编译过程
编译相对简单,因为我是选择的maven来管理和构建自由书的,这个一会看我操作就完事了
构建镜像
在maven编译过后会生成一个jar包,然后我编写了一个Dockerfile定义了基础镜像以及端口,去除了很多过程只保留了核心功能,这是我的Dockerfile
FROM java:8
MAINTAINER vipzipp@163.com
ADD zysWeb.jar zysWeb.jar
EXPOSE 80
ENTRYPOINT ["java","-jar","/zysWeb.jar"]
重建容器
这个是整个CICD最重要的过程,我实现的思路是把我以前手动操作的做成了shell命令,让机器帮我完成。首先,在打包完成后删除已经运行的容器,第二删除旧版本的镜像,第三构建新的镜像,第四运行新的容器。命令如下:
# 删除运行的容器
docker rm -f zysweb;
#删除旧的镜像
docker images | grep -E "(zysweb)" | awk '{print $3}' | uniq | xargs -I {} docker rmi --force {}
#构建新的镜像
docker build -t zysweb:v$BUILD_ID . ;
#运行新的容器
docker run -d -p 8080:80 --name zysweb zysweb:v$BUILD_ID;
下面我在全新的腾讯与云环境下搭建整套环境。我这里演示我就选择按量计费的模式了,首先在首页选择云主机,购买入口是https://buy.cloud.tencent.com/cvm
地域的话按照所在城市或者区域选择就行了,主机规格按照自己的需求购买,越高的规则越贵,镜像的话如果想全部自己动手安装的话可以只选操作系统就行了,如果图省事或者快速使用可以在镜像市场里选择相对应的镜像就行了。下图是我为大家演示选择的临时配置

然后等待分配完成

接下来开启部署docker服务,需要登陆到控制台,这里我推荐大家一个免费的SSH工具,也是我平时使用的工具FinalShell,带服务器监控,也是Java开发的,缺点是需要占一点点资源,使用它登陆刚刚购买的云主机

这里给大家一个快速安装docker的命令,省掉了很多步骤
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
执行完成之后可以使用dockere命令来查看下docker版本
dockere -v
到此docker服务是安装好了,然后安装jenkins,这里需要注意一个很重要的地方,我们使用maven打包好的jar需要构建成docker镜像,而这个在上面的命令里可以看到使用到了docker命令,而我们的jenkins是在docker容器里面的,即我们使用容器内的jenkins构建镜像需要使用到宿主机上面的docker环境,一些有经验的朋友可能就想到了使用目录映射来让容器内的服务可以访问到宿主机的目录。具体在构建jenkins容器的时候指定目录,命令如下
# 授权
sudo chmod a+rw /var/run/docker.sock
sudo chown -R 1000 /var/jenkins_home
# 运行jenkins服务, -v指定映射目录 -p映射端口
sudo docker run -d -p 1010:8080 --name jenkins -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean
如果没有异常的话jenkins服务容器就构建好了,可以使用docker ps -s 来查看正在运行的容器信息

然后使用http://ip:port即可访问刚构建好的jenkins
初始页面需要填入jenkins预制生成的密码,这个需要进入到jenkisn容器,具体命令是docker exec -it jenkins /bin/bash
即可进入容器内部,然后在执行cat /var/jenkins_home/secrets/initialAdminPassword 就会显示预制密码,然后一路向下使用推荐的插件,使用admin账户就可以看见jenkins真正的功能页面了

然后进行一些必要的设置
1.Manage Jenkins -> Manage Plugins 安装Maven Integration、SSH
2.因为编译需要依赖Jdk和Maven,所以在Jenkins容器内下载Jdk和Maven以及配置好HOME路径
3.保存ssh以及git代码库的账号密码
开始创建jenkins任务

选择构建触发器后会有一串密码生成用于在代码库上设置hooks使用

然后在代码库上设置hooks,我这里是使用的码云,github也是差不多的设置

回到jenkins上,我这里还有一个在编译钱的步骤,就是修改运行环境,设置为线上环境
echo -e 'spring:\n profiles:\n active: online' > \
$WORKSPACE/zysWeb/src/main/resources/application.yml
然后在post steps里加入shell命令
cd $WORKSPACE/zysWeb/target;
cp ./classes/Dockerfile ./;
docker rm -f zysweb;
docker images | grep -E "(zysweb)" | awk '{print $3}' | uniq | xargs -I {} docker rmi --force {}
docker build -t zysweb:v$BUILD_ID . ;
docker run -d -p 8080:80 --name zysweb zysweb:v$BUILD_ID;
到此为止,体验了一把从云主机购买到保姆级的CICD构建流程就演示完成了,如果对你有帮助的可以加个关注~