Capistrano
什么是多机热部署
热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。
多机热部署 ,同时升级多台服务器
什么是Capistrano
是一种在多台服务器上运行脚本的开源工具,它主要用于部署web应用。它自动完成多台服务器上新版本的同步更新,包括数据库的改变。
为什么需要Capistrano
假设我们的应用程序是由多台内网的开发机器 ,一台测试服务器与一台预发布服务器 ,多台在公网上提供服务的服务器构成 . 那么我们就面临着这样一个问题 : 多人开发完成之后并在本地测试通过 ,其后提交到了中心的GIT服务器 . 那么我们如何才能吧GIT中的代码推送到测试服务器上呢 ,FTP 还是手动到众多服务器上挨个进行git pull
, 显然这两种方法都不是我们喜欢的 .
如果你希望解决这个问题 , 那么我想你是需要Capistrano的 .
Capistrano的能力
Capistrano 可以通过简单的配置与简单的命令 ,分别进行不同环境的多台服务器的代码自动拉取和更新 ,并且可以通过命令方便的进行版本回滚 ,防止错误的代码上线提供不那么可靠的服务 .
安装Capistrano
Capistrano 是由ruby驱动的开源程序 , 所以可以方便的使用包管理器 gem
来安装 ,并且它依赖 ruby
-
安装ruby和gem
sudo yum -y insatll ruby gem
-
替换gem源到国内 ,这里选用 raby-china 源
gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/ gem sources -l https://gems.ruby-china.org
-
安装Capistrano
gem install capistrano
建立测试的GIT项目
既然需要把GIT仓库部署到服务器上 ,那么我们首先应该有个GIT仓库
以coding为例 ( gayhub私有项目需要付费 ,可以我并没有钱 ).
- 创建一个私有项目
-
添加部署公钥
- 得到部署公钥 , 以linux为例 : cat ~/.ssh/id_rsa.pub
- 然后点击右上角的 ,添加部署公钥
- 粘贴刚才得到公钥到这里 ,不需要授予推送权限 ,点击新建即可
建立Capistrano工程
上述和以下操作都是在本地进行 , 而非远程服务器上
进入到一个你喜欢的目录里 , 然后使用gem insatll
来初始化一个项目
如下这样就是创建成功了
修改Capistrano配置
需要修改3个配置 , 项目名 , 可访问的GIT项目地址 ,需要自动部署的机器用户名与IP地址
值的一提的是 ,服务器与GIT地址都需要可以免密码访问
- 配置项目名与GIT仓库地址
使用你喜欢的编辑器打开 deploy 目录下的deploy.rb 文件 ,并更新如下这些配置
-
配置各个环境的机器配置
Cap可以配置多种身份 ,例如dba使用的db ,前置web服务器web ......
这里只配置一台前置服务器 ,以web身份为例 .
使用你喜欢的编辑器打开 deploy 目录下的deploy.rb 文件 ,并更新如下这些配置 ,多台机器以空格分割 ,这里我添加了两台 .
确保你添加的这些机器可以不使用密码进行ssh远程登陆 ,否则一定会部署失败
配置远程服务器
使Cap部署时可以不需要密码 ,本来不打算写 ,想了想还是补上了
- 用你喜欢的方法使用root账户登陆需要部署的远程服务器
-
把本地的公钥使用你喜欢的方法追加到 `~/.ssh/authorized_keys 文件中
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
- 最终的authorized_keys文件就像这样子
开始部署
- 把最新的代码推送到刚刚创建的GIT仓库中 ,当然也可以不用推送 ,空项目默认会有README.md
- 然后初始化Capistrano的目录执行cap production deploy
-
等待好消息
此时自动部署就已经完成了 ,接下来我们来看看远程服务器中是什么样子的
查看远程服务器
看到这里 ,所有的疑惑大概都解开了
Cap的核心原理就是 ,当客户端进行推送时 ,自动登陆到各个身份的各个服务器 ,然后自动配置文件中的部署目录 , 然后拉取最新的代码到release目录中 ,并把current软链接到最新的代码目录.
例如laravel项目 . nginx的root就可以配置到path/current/public
, 然后每次推送之后 ,Cap都会帮我们把current的代码变成最新拉取的那一份 ,我们提供的服务也就随之更新了 .
- 目录结构 , 如下
.
├── current -> /www/wwwroot/gly.inc.api.binger.site/releases/20180417091707
├── releases
│ └── 20180417091707
├── repo
├── revisions.log
└── shared - 展示
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。