ci 自动部署
文章目录
【注意】最后更新于 5 年前,文中内容可能已过时,请谨慎使用。
前言
很久没写博文了,最近正好公司内部需要进行 ci 自动部署,就写一篇 ci 自动部署。其中分为两种,公开项目,私有项目
一、自动部署原理
现在的 git 自动部署都是通过推送钩子,触发第三方 ci 执行脚本,然后在脚本中进行部署。
- git push
- 触发 git hooks 去调用 ci
- ci 执行 shell,自动拉取代码,build,部署
但是这样会缺少每次更新的代码,无法做到回滚。
所以正常的做法是每次 ci 执行更新时做一个打包当前代码,并存到一个地方。
现在有了另一种做法,那就是直接打包 docker 镜像,通过私有或者公开 docker 仓库保存
- git push
- 触发 git hooks 去调用 ci
- ci 执行 shell,自动拉取代码,build,打包 docker,推送 docker 镜像部署
这样的好处就是完全保证,代码,环境一致,并能快速回滚
二、ci
ci(Continuous integration)的中文是持续集成,常用于自动测试。
在每次提交代码时自动的执行项目中的测试用例。
这里我公司内部使用的gitlab所以直接使用内置的 ci
.gitlab-ci.yml
| |
除了需要自己部署的私有 ci:gitlab-ci
常见的公开的有travis-ci,circle-ci,appveyor,一般都为私有项目收费,开源项目免费。
然后 ci 的环境一般都是docker的,然后执行的命令都是shell,所以实际上就是编写一个一键部署脚本。
| |
以上是一个自动部署脚本的ci示例,但是以上要正常的跑起来需要open-ssh,以及连接部署机的 ssh 密钥。
但是这里有一个问题,ssh密钥必须在ci环境中,而ci环境每次运行都会重置,如果写在代码中就暴露的部署机的密钥。
如果ci和代码仓库都是私有的那倒是没问题,但是使用github + travis-ci明显都是公开的。
travis-ci 提供了一个后台来配置私有变量和文件。
我公司的做法是使用一个内网docker仓库来存放要部署的代码,然后通知Rancher管理的内网部署机更新镜像,并运行。
然后把内网的镜像推送到外网手动的操作Rancher更新, 其中代码的数据库配置使用ZooKeeper获取,切换ZooKeeper节点通过环境变量。
以上使用GitLab + GitLab-ci + Harbor + Rancher + ZooKeeper 感觉有点多。