![6007ac2d5e1572d344387561e50114bc.png](https://i-blog.csdnimg.cn/blog_migrate/8be854a7c36700d5140511991f273684.jpeg)
自己实现一个简单的 DevOps 工具系列(后端篇)- 2
前文链接
- 自己实现一个简单的 DevOps 工具系列(后端篇)- 1
前言
在 系列一 我们实现了一个简单 CI/CD 工具,完成自动化部署,这里面还有许多问题可以优化。比如,实际的开发中有不同环境需要配置,这些将代码部署到不同机器上面,有测试环境、生产环境之类的。代码是大同小异,如果每次切换环境都要手动切换代码,挺浪费时间的。
本着减少重复劳动的想法,我继续进一步优化这个 CI/CD 工具,自动化处理切换环境问题。
实现如下
这里我们要用到 springBoot 的一些特性,完成动态切换环境。
在 spring Boot 启动类源码中,它可是使用命令来完成和 applicaiton.yml 一样的效果,它这这些输入进来的命令看成一个特殊的 bean。为了区分系统命令,也就是 VM 命令以及 spring Boot 能识别的命令,用 "--"做区分。(ps:boot 源码后续我可以继续开个坑)。
知道这些前置知识后,我们就可以做动态切换环境。
首先我们先创建两个文件,application-prod.yml,以及application-test.yml 这两个文件
![2b853d116d4e594a9a2b4ffeb107bc98.png](https://i-blog.csdnimg.cn/blog_migrate/b8067c57ced437fcca819893d2fb9196.png)
![a16a241c7bec9e45b7246c1f2bc4682c.png](https://i-blog.csdnimg.cn/blog_migrate/33c4f27a872292f0058a8101a48e96ac.png)
这里也涉及到 boot 启动类,load 环境变量的源码。后续来。
上次 yml 内容我们得修改一下。
![f3eca36e1ecf19062fd005f18aa5f627.png](https://i-blog.csdnimg.cn/blog_migrate/03fa581031b41e6e2afbbbda7b59d393.jpeg)
之后这样运行直接 CI/CD 工具,大概会出现注入不成功的问题。
- mvn package 的时候会执行一次 springBoot的程序,application.yml 里面没有写指定 active 是哪个文件,且调用其他application.yml 里面的东西(比如 application-dev.yml),会出现注入不成功,导致生成不了 jar,从而导致整个自动化部署出现问题。
所以你得修改下之前的 shell 脚本,跳过 mvn 测试,这里先留个坑,后续继续解决这个问题。
#!/bin/sh
cd ../
# 首次 push
for file in *
do
if [[ ${file} =~ (.*).git ]]
then
file_name=${file}
fi
done
# file_name = xxx.git 正则匹配后 project_name = xxx
project_name=${file_name%.*}
rm -fr ${project_name}
# 22 默认端口,如果 ssh 端口修改了 这里也要修改
git clone ssh://root@localhost:22/root/${project_name}.git
cd ${project_name}
# 构建
mvn clean
# 一般我是跳过单元测试,修改成跳过单元测试
mvn package -Dmaven.test.skip=true
# mvn package
cd target
# 这里因为我的应用里面有 compose 文件夹
cp ${project_name}.jar ../compose/
cd ../compose/
docker-compose -f ${project_name}.yaml down
# 启动容器
docker-compose -f ${project_name}.yaml up -d
echo "Complete deployment"
效果
![e1056cac1c60d275e62a27f803038be7.png](https://i-blog.csdnimg.cn/blog_migrate/dfb217f2e515dbc6964e15f844597cfb.png)
不过,compose 还得需要手动自己修改,我们可以继续做调整,完成自动化。
新建两个 yaml 文件
![bfb4e16e013c355bced1bbb07e2882a1.png](https://i-blog.csdnimg.cn/blog_migrate/79bb51afda5e3995616b027ae8c610af.png)
同时修改 shell 脚本。
#!/bin/sh
cd ../
# 首次 push
for file in *
do
if [[ ${file} =~ (.*).git ]]
then
file_name=${file}
fi
done
# file_name = xxx.git 正则匹配后 project_name = xxx
project_name=${file_name%.*}
rm -fr ${project_name}
# 22 默认端口,如果 ssh 端口修改了 这里也要修改
git clone ssh://root@localhost:22/root/${project_name}.git
cd ${project_name}
# 构建
mvn clean
# 一般我是跳过单元测试,修改成跳过单元测试
mvn package -Dmaven.test.skip=true
# mvn package
cd target
# 这里因为我的应用里面有 compose 文件夹
cp ${project_name}.jar ../compose/
cd ../compose/
# 这里加上 compose 后缀
docker-compose -f ${project_name}-test.yaml down
# 启动容器 这里加上 compose 后缀
docker-compose -f ${project_name}-test.yaml up -d
echo "Complete deployment"
之后需要自己配置不同后缀,放到不同 webhook 里面。
自此
现在,我们完成了一键部署、一键切换环境的 devops 工具。不过在做的途中,我们又产生了几个问题。
- mvn package 执行的时候,由于没有设置环境,可能会导致注入不成功。
- 同一套代码,如何推到不同仓库,完成更自动化 CI/CD 工具。
声明
作者: Sinsy
本文链接:https://blog.sincehub.cn/2020/09/27/finish-devops-2/
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文声明。
如您有任何商业合作或者授权方面的协商,请给我留言:550569627@qq.com