Deployer 部署PHP项目

Deployer有点像Python里面的Fabric,都是一个自动化部署工具。使用自动化可以节省很多的时间提高效率,比如自动化测试。很早以前我们写代码是通过FTP、SFTP软件上传到服务器里面(如果现在还是这种方式,表示你不是一名合格的开发者),有时写写都不知道改了几个文件了。现在至少加个版本控制器吧,写完代码提交触发钩子更新代码,如果多台服务器更新代码那是多么痛苦的事情。有一段时间我用Emacs直接连接到服务器里面做开发,所见即所得,其实是很危险的事情。

1. 安装Deployer,由于是一个composer 包,推荐全局安装

安装Deployer后,一定要把自己的composer添加到 $PATH变量上,我使用Zsh,在.zshrc里面添

然后

看到下面的就表示安装成功

2. 服务器里面添加一个用户,然后把这个用户添加到 www-data(nginx 默认的用户组 www-data )。刚拿到一个服务器时候一定要禁止掉root账号。自己随便添加一个用户让回添加到sudo组里面。

我一般加入自己的组、sudo、 www-data 三个组。在设置nginx目录权限

3. Deployer 原理是从 Git 或者其它你指定的代码库 clone 代码到目标服务器。这里我直接在服务器里面添加一个Git用户。把代码库同时放在一台服务器里面。有一点要注意的是分配Bash的时候一定要给git-shell,禁止终端登录服务器。并且单独生成Git用户的密钥。

配置一个Git仓库。

然后切换到本地随便找个代码文件夹看能不能添加这个远程库。这里我以laravel演示,先在本地创建文件夹。

最后一步如果可以push到远程仓库代表成功,代码库这一块就完成了。

4. 经过上面几步后,就可以开搞Deployer了。

dep init 后多出deploy.php文件。

首先配置连接到部署服务器的信息。 把Hosts部分修改成自己的连接信息。例如下面是我的配置,部署到服务器 /wwwroot/php/laravel.leif.im 这个目录里面去。

这个地方你可以配置多个服务器地址,比如你负载均衡后面有十几台服务器就写是几个Hosts部分。

执行 dep deploy,发现报错。提示说没有写的权限,

修改deploy.php文件,把 writable_dirs 这个环境变量的值设成空即可:

再次执行 dep deploy,发现又报错。

发现是在执行 artisan:migrate 时报错了。根据报错内容可以看出是连接数据库失败了,这是因为我们现在还没有上传 .env 文件。

Deployer 提供一个名为 upload 的函数用于文件上传。在deploy.php文件添加下面代码:

再次执行 dep deploy,可以看到一个env:upload的任务在deploy:shared之后执行了。

到服务器你部署的文件夹里面看下

.dep 为 Deployer 的一些版本信息,不用去研究,我们需要关心的是下面这几个:

current-它是指向一个具体的版本的软链接,连接到同级目录release/版本号。你的 nginx 配置中 root 应该指向它,比如 laravel 项目的话 root 就指向:/wwwroot/php/laravel.leif.im/current/public

releases-部署的历史版本文件夹,里面可能有很多个最近部署的版本,出问题时使用 dep rollback 快速回滚项目到上一个版本。

shared-共享文件夹,它的作用就是存储我们项目中版本间共享的文件,比如 Laravel 项目的 .env 文件, storage 目录

为什么要这样三个目录?这是因为,每次执行部署命令时,Deployer 都会在 releases 目录下创建一个新的代码目录,比如下回部署时创建的就是 releases/2 目录,部署完成之后再把 current 链接到 releases/2 目录。这样做的好处是,在部署过程中用户访问到的还是之前的旧代码,只有等到部署完成之后用户才会访问到新代码,这样就不会因为部署而造成站点不可用的情况。

关注我

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180913G0BED000?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券