平常我们会使用Jenkins发布系统,Jenkins可以从代码更新,编译到发布这样的一条龙服务。操作成本很低,作为程序员,肯定不满足于简单的界面操作。
于是我决定使用shell写一个自动发布的脚本,既可以更熟悉发布流程,也可以学习shell语法。
结构
如上图,我们将编写的shell脚本放到主机A,执行脚本,会从git服务器拉取代码,为了在拉取代码时不需要输入密码,我们需要在gitlab上面添加密钥:
image-20210325112328103
这个密钥是在主机A中生成的,生成密钥的命令为:
ssh-keygen -t rsa
我们在 ~/.ssh
目录下就可以找到id_rsa.pub
将id_rsa.pub
中的内容拷贝到gitlab
中即可。
接下来我们在主机A中编译代码,然后将编译好的代码远程分发到不同的主机中,再在这些主机中启动程序。
发布脚本的主要功能见下图:
这个脚本主要要有:拉取代码,编译成jar,备份原程序,分发远程序,启动程序等功能。
因为有测试环境和正式环境,我在执行脚本的时候会在后面带一个参数pro或test,代表发布到不同的环境。
首先我们在两个环境各自相关的地址:
当输入的变量参数为test时,走test的路径。为pro时,走pro的路径。如果输入了其他的参数,会给个提示 "请输入正确参数【test或pro】,当前参数: '$1"。
为了保险起见,我会先打印出要发放的地址,然后给出询问,是否继续执行。
显示如下:
输入Y会继续执行,输入N会退出脚本。
接着开始拉代码:
这里,如果之前没有clone,会先clone下代码,如果clone了,直接pull代码。
接下来maven编译打包。打完包后我们需要将jar包远程发送到应用主机,因为远程访问需要免密登录,这里也需要配置密钥。
cd ~/.ssh
ssh-copy-id -i ~/.ssh/id_rsa.pub root@ip
我们将主机A中的密钥通过上述命令发放到应用主机。
将jar包发放前我们再将应用主机中的原jar包备份一下。
因为应用主机可能是多台,这里写了一个for循环,进行循环备份。
备份好后,就可以远程分发了。
这里也是循环发放,用到了scp
命令。
最后我们启动应用主机的程序即可。
启动系统之前需要将原系统停掉,系统启动脚本在各自的应用系统中。
上图为启应用动脚本这里我们指定了启动的运行环境。
--spring.profiles.active=dev
并且可以退出控制台,实现后台运行。
nohup xxx >/dev/null 2>&1 &
以上一个简单的发布脚本就实现了。
这里是后端的实现,前端也可以用同样的脚本,只要将编译的命令改成前端的编译命令即可。
以上就是用shell脚本模拟了Jinkens的发布过程了,至此有没有发现shell也很简单呢。