自己实现一个简单的 DevOps 工具系列(后端篇)- 2

Posted by Sinsy on September 27, 2020 About 2 k words and Need 7 min

自己实现一个简单的 DevOps 工具系列(后端篇)- 2

前文链接

前言

系列一 我们实现了一个简单 CI/CD 工具,完成自动化部署,这里面还有许多问题可以优化。比如,实际的开发中有不同环境需要配置,这些将代码部署到不同机器上面,有测试环境、生产环境之类的。代码是大同小异,如果每次切换环境都要手动切换代码,挺浪费时间的。

本着减少重复劳动的想法,我继续进一步优化这个 CI/CD 工具,自动化处理切换环境问题。

实现如下

这里我们要用到 springBoot 的一些特性,完成动态切换环境。

在 spring Boot 启动类源码中,它可是使用命令来完成和 applicaiton.yml 一样的效果,它这这些输入进来的命令看成一个特殊的 bean。为了区分系统命令,也就是 VM 命令以及 spring Boot 能识别的命令,用 “–“做区分。(ps:boot 源码后续我可以继续开个坑)。

知道这些前置知识后,我们就可以做动态切换环境。

首先我们先创建两个文件,application-prod.yml,以及application-test.yml 这两个文件

create-file

diverse-file

这里也涉及到 boot 启动类,load 环境变量的源码。后续来。

上次 yml 内容我们得修改一下。

change-yaml

之后这样运行直接 CI/CD 工具,大概会出现注入不成功的问题。

  • mvn package 的时候会执行一次 springBoot的程序,application.yml 里面没有写指定 active 是哪个文件,且调用其他application.yml 里面的东西(比如 application-dev.yml),会出现注入不成功,导致生成不了 jar,从而导致整个自动化部署出现问题。

所以你得修改下之前的 shell 脚本,跳过 mvn 测试,这里先留个坑,后续继续解决这个问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/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"

效果

effort2

不过,compose 还得需要手动自己修改,我们可以继续做调整,完成自动化。

新建两个 yaml 文件

create-two-yaml

同时修改 shell 脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/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 工具。不过在做的途中,我们又产生了几个问题。

  1. mvn package 执行的时候,由于没有设置环境,可能会导致注入不成功。
  2. 同一套代码,如何推到不同仓库,完成更自动化 CI/CD 工具。

声明

作者: Sinsy
本文链接:https://blog.sincehub.cn/2020/09/27/finish-devops-2/
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文声明。
如您有任何商业合作或者授权方面的协商,请给我留言:550569627@qq.com