适用于站点的自动化部署
适用于站点的自动化部署
站点引导页在最近有很多改动,每次改动都需要部署,这很麻烦,是时候上自动化部署了。
能实现站点自动化的方案,我找到两种,下面我分析一下这两种方案。
方案一 CI/CD
CI/CD就是持续集成/持续交付,它包括有拉取代码、构建、部署、测试。
代表这一方案的产品选择的话,我当然是选择Jenkins了。
方案二 自动化部署平台
常用的自动化部署平台包括DeployHQ、Capistrano、Fabric等。
需要在它的平台上配置相关内容,然后它通过SSH、FTP的方式把构建文件推送到机器上。
抉择
基于成本的考虑,我是最后选择了Jenkins,但我会谈一谈选择的问题。
流量
机器的流量计费如果是限制总流量大小的,远程平台的自动部署它会消耗可用流量。
从这一点上考虑,自动化部署平台之类的已经被pass掉了,除非是限制速率的无限流量计费或者是不用考虑流量计费问题的。
内存
自动化部署平台是在它自己的平台上操作的,内存上不用考虑。
CI/CD之类的大而全的东西,运行起来还是比较占内存的。
不过Jenkins可以根据你的需要进行一定的定制化安装功能,而且它是基于Java,可以对参数进行调整。
执行方案
我想将我部署上去的程序全部使用Docker来运行管理,Jenkins也不例外。
触发自动化构建的方式
- Github的Webhook
- 对应平台或软件提供的方法
我选择了Github的Webhook来触发自动化构建,Github会在特定事件发生后发出POST请求配置URL。
基于Docker环境的Jenkins配合Nginx进行自动化部署站点
要实现这样的方案的话,得考虑容器间文件数据共享的问题。
如果不想暴露Jenkins的端口,可以使用Nginx去进行代理,但需要留意一个网络互通问题。
容器间的文件数据共享
Docker给出的方案有数据容器、数据卷的方式。但很遗憾,Docker不能给正在运行的容器挂载数据容器或数据卷。
就目前的场景来说,哪种方式都可以,简单提一下它们的用法。
Docker数据容器
1
2
3
4// 创建一个数据容器
docker create --name 起个名字 -v 宿主机目录:容器目录 hello-world
// 启动一个容器并挂载数据容器
docker run -it --rm --volumes-from 数据容器的名字 nginx bash执行完上面的命令就可以在到对应的目录已经挂载,后续的容器要对接启动的时候加个
--volumes-from
就行。Docker数据卷
1
2
3
4// 创建一个数据卷
docker volume create 起个名字
// 启动一个容器并挂载数据卷
docker run -it --rm -v 数据卷的名字:容器目录 nginx bash后续的容器对接的话,启动时给容器加
-v
参数就行。
嗯,对了,还需要观察一下不同容器产生的问题的权限问题。
容器间的网络互通
一般如果创建时不明确指定使用的网络,都会使用默认网卡,一般是没有通信问题的。
不过要使用nginx转发到Jenkins的容器上需要知道容器对应的IP。
IP可以通过docker inspect 容器标识符
来查看,不过Docker也给出了便利的方案,它内置了DNS可以通过解析容器名称来获取IP。
所以如果需要的话,就配置一下Nginx就行,给个简单示例
1 |
|
Jenkins配置
启动流程可以参考官方的文档。
创建任务
配置任务
这里勾选的就是Github的Webhook方式触发自动化构建,可见Jenkins还提供了很多方法来拉取构建项目。
编写构建脚本
图中的
jenkins_data
为容器中共享的数据卷,Nginx再根据根路径路由到这个文件夹就行。配置Github的Webhook
![][img-4] **注意Payload URL别忘记加上`github-webhook/`**
PS:其实我一开始也比较嫌弃Jenkins大而全有种大炮打蚊子的感觉,想尝试自己做一个对接Github的Webhook触发自动更新的项目,自己的demo是做成了,然后再缕一缕流程什么的,发现Jenkins能全面覆盖我,那还不如用Jenkins再调调它参数算了。