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 目录。这样做的好处是,在部署过程中用户访问到的还是之前的旧代码,只有等到部署完成之后用户才会访问到新代码,这样就不会因为部署而造成站点不可用的情况。
关注我
领取专属 10元无门槛券
私享最新 技术干货