本文主要讲述一下我司
(一个成长中的创业公司)
目前的代码发布流程用到了哪些工具。
发布工具:Jenkins
我们用的发布工具是很多公司都在用的Jenkins。
举个栗子图,
在Jenkins Server上可以一键发布后端服务器代码:
按下 Build按钮 以后,
发生的事情如下:
- 在 Jenkins服务器 上触发预先配置的 Bash脚本
- git命令获取到最新的代码版本,切换合适的分支
执行代码风格检测和单元测试自从使用了付费版GitLab后,本功能已切换至GitLab CI了- 安全检查通过以后,使用fab命令部署代码
发布命令:Fabric
这里的fab命令用的就是Python的Fabric库,
这个库类似ansible,
主要包含两套功能:
from fabric.api import * # NOQA
# 不用试了,这里的两个都是假的domain,对应放上ssh的host/user即可
env.hosts = ['www.kezaihui.com', 'zaihuiwebserver-814613977.cn-north-1.elb.amazonaws.com.cn']
env.user = 'saber'
def update_supervisor_config():
put('./supervisor/*.conf', '/etc/supervisor/conf.d/', use_sudo=True)
run('supervisorctl update', use_sudo=True)
但Fabric有个比较蛋疼的地方就是它只支持Python2,
假如要用Python3的话,
可以使用Fabric的一个fork分支Fabric3,
Fabric3与Fabric大部分功能等价。
只想用里面本地命令集成这部分功能的话,
还有一个库叫Invoke也提供了类似的功能。
这个库主要是名字特别帅,
dota2里面的卡尔就叫Invoker(祈求者)。
进程管理:Supervisor
在正式环境中,
为了保证服务器进程的鲁棒性,
我们使用了 supervisor 来监控进程状态。
一个简单的 nginx supervisor 的配置会长这样子:
[program:nginx]
command=/usr/sbin/nginx
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/nginx.log
stderr_logfile=/var/log/supervisor/nginx_error.log
把配置文件放到 /etc/supervisor/conf.d/nginx.conf
以后,
就可以使用一系列命令把服务起起来:
$ supervisorctl update # supervisorctl 是 supervisor 的命令行工具,更新一波配置
nginx STARTING pid 1000, uptime 0:00:00
$ supervisorctl status # 查看进程状态
nginx RUNNING pid 1000, uptime 0:12:34
$ kill -9 1000 # 模拟各种波动,干掉 nginx 进程
$ supervisorctl status # 再次查看进程状态,可以发现 supervisor 自动重启了
nginx STARTING pid 1020, uptime 0:00:00
总结
负责发版的工程师,
可能只在页面上点下了 Build
的一个按钮,
实际上的流程是这样的:
- Jenkins 触发了配置好的 Bash脚本。
- 里面 Bash 脚本跑了 fab 命令。
- fab 命令执行了代码上传的工作,本质上是通过 ssh 执行命令。
- 最终用 supervisor 开启/重启了进程服务。
- 发版完成。
以上大概就是我司目前自动化部署的简陋介绍。
升级之路漫漫,
还是有很多东西要学习/实践/掌握的呀。
本文版权属于再惠研发团队,欢迎转载,转载请保留出处。
触发 build 还是手动的呀,我司的 in-house 解决方案: CI & CD: https://github.com/bosondata/badwolf push 代码到会部署的分支/tag 触发 CI 测试,测试成功可能会在 CI 中继续进行一部分构建(比如打包 Python package、webpack 构建前端代码等),完成后自动触发部署,比如 upload package 到 pypi、触发 saltstack 部署到对应的服务器上并 reload 服务。 supervisord 感觉很难用,我们主要的服务都是用 systemd 来管理。