ci 自动部署
文章目录
【注意】最后更新于 June 15, 2020,文中内容可能已过时,请谨慎使用。
前言
很久没写博文了,最近正好公司内部需要进行 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
感觉有点多。