使用 Deployer 简化 PHP 部署
有选择是件好事,但选择太多往往比选择太少更糟糕。你有可能变得不知所措、困惑,甚至瘫痪。来了解最简单的 PHP 部署工具。
Phing、Jenkins、Capistrano、Capifony、Deploybot、PHPCI、Rocketeer、Teamcity、Envoyer.. 这份名单能持续多久?
我一直在寻找一种简单的方法来部署我自己的应用。
这是一个小项目,还没有带来任何收入。所以我只能证明有限的时间是合理的。所以我一直在寻找可以快速集成并开始部署的东西。
太多的选择可能不是好事
不要误解我的意思,选择可能是一件好事,但有时选择太多比选择太少更糟糕,因为你会变得不知所措、困惑,最终瘫痪——最终的结果是你什么都不做。
其中一些工具功能齐全,这可能会导致学习曲线较大,延迟首次部署,而另一些工具则需要付出经济代价。
我渴望找到的是一种可行的解决方案,但只需最少的时间和金钱投入就能启动和运行。理想情况下,这是一个同样用 PHP 编写的解决方案,我可以在开发过程中对其进行高度配置和定制。
方案
Deployer 是一个用 PHP 编写的开源部署管理工具。它是一个快速、模块化的 PHP 部署工具;支持回滚、原子部署、并行任务和跨多个服务器(无论是本地还是远程)的一致部署。
更重要的是,它创建了一系列版本,当前目录指向最新版本。这样,如果有任何问题,你始终可以快速回滚到早期版本。
Deployer 表现如何?
当然,从安装、配置要部署的服务器、部署任务和环境设置开始,还有一些需要学习的地方。但是部署器配置文件的编写方式很容易学习,不需要大量的配置。
如果你的需求很简单,那么你的配置文件也很简单。更重要的是,你可以从一个极简主义的配置文件开始,并随着需求的增长而构建它。
你无需太多软件
这是部署人员的另一个优点,你不需要很多基础设施即可开始。你只需要三件事:
- 部署的服务器: 当然,你需要准备好这些设置,以便部署到
- PHP 5.4: 虽然我一直鼓励使用最新版本(撰写本文时是 5.6),但 5.4 是最低支持版本
- Git: 你需要获取最新的代码,这些代码将受到版本控制。
其他是可选的
没错,其他所有内容都是可选的额外内容,或者可以合理地预期在您的 Linux 托管帐户中可用。
当然,在更复杂的设置中,你可能会清除和预热缓存,无论是文件系统还是 Redis 和 Memcached 等外部服务器,确保目录存在并且可写,等等。
但是,这些都可以通过操作系统上的工具合理地处理,这些工具应该已经可用。
创建部署
如果这听起来像是一个适合你的工具,那么现在就开始运行吧!让我们来看一个简单的部署器配置示例,你可以根据自己的需求使用它,并在接下来的 30 分钟内启动并运行。听起来不错吧?
假设你已经准备好了一个项目,通过在项目目录的根目录中运行 composer require deployer/deployer:~3.0
来获取部署程序的副本。
接下来,创建一个名为 deployer.php
的新文件。在其中,添加以下配置,我们将逐步完成。在我们这样做之前,最终结果将是本地和远程部署。我假设你在远程服务器上运行 Nginx。如果你正在运行 Apache,请根据需要替换它。
<?php
require 'vendor/autoload.php';
require 'recipe/composer.php';
首先,我们引入 Composer 自动生成的自动加载文件和 Composer 配方(recipe)文件。用 deployer 的话说,配方(recipe)是一组预先编写的任务,你可以使用它们,而不是自己编写。
localServer('testing')
->user('my_user')
->stage('testing')
->env('deploy_path', '/path/to/local/deployment/directory');
server('production', 'staging.example.com', '22')
->user('username')
->password('password')
->stage('production')
->env('deploy_path', '/path/to/remote/deployment/directory');
接下来,我们创建两个服务器配置,一个用于测试的本地服务器和一个用于生产的远程服务器。通过使用流畅的界面,设置每种情况下所需的所有选项几乎是轻而易举的。
对于本地服务器,我们指定了用户名、阶段名称和部署路径。对于远程服务器,我们指定了要连接的主机名和端口、用户名和密码、阶段名称和部署路径。
还有一系列其他选项,你可以在服务器文档中找到。
set('repository', 'https://github.com/settermjd/some.repository.git');
接下来,我们添加一些部署程序配置设置,特别是包含项目代码的 Git 存储库。你可以根据需要设置许多其他全局变量。
task('deploy:done', function () {
write('Deploy done!');
})->desc("When deployment's completed");
task('reload:php-fpm', function () {
run('sudo /usr/sbin/service php5-fpm reload');
})->desc('Reload PHP5 FPM');
现在我们来了解配置的核心,即部署任务。你可以看到,任务需要一个名称和一个闭包,或者如果你正在构建一个任务库,那么调用起来很方便。
第一个任务只是打印出部署已完成的消息,第二个任务重新加载 PHP5 FPM 服务。你可以在此处添加任何内容,这些内容通常可以从命令行运行。
after('deploy', 'reload:php-fpm');
after('deploy', 'deploy:done');
快完成了。现在我们来看一些事件。这些可以是之前或之后。在这里,我们连接到了部署事件,将我们的两个自定义任务设置为在部署完成后运行。在这种情况下,FPM 将重新加载,“Deploy done” 消息将打印出控制台。
task('deploy', [
'deploy:prepare',
'deploy:release',
'deploy:update_code',
'deploy:vendors',
'deploy:symlink',
'cleanup'
])->desc("Main deployment process");
最后一件事,我们已经准备好运行了——核心部署任务。在这个例子中,部署由一系列其他任务组成。简而言之,这将从指定的存储库中提取最新版本的代码,运行 Composer 安装,并将符号链接到最新版本。
运行部署
安装并配置所有内容后,要从命令行运行部署,请运行以下命令:
vendor/bin/dep deploy production
这将把你的应用部署到生产服务器。
总结
只需 30 分钟,你就可以运行第一个部署,只需几行 PHP 代码。没有复杂的服务器设置,没有其他服务需要配置和运行,几乎什么都没有。它与你现有的部署解决方案相比如何?