使用 Deployer 部署 Drupal 8 站点
Deployer是一个基于PHP的部署工具,我已经成功使用了几个月了。它提供了许多不同的方法来部署各种基于PHP的应用程序,包括Laravel、Symfony、Yii和Drupal。
在寻找适合我需求的部署包时,我首先找到了Deployer。Phing多年来一直是我的首选工具,但事实证明,当事情需要调整时,尝试调试XML语法是有问题的。当我部署PHP应用程序时,使用基于PHP的系统来进行部署对我来说是有意义的。我查看了Capistrano之类的工具,但由于我对Ruby不太熟悉,我担心我无法轻松调试错误或自定义部署过程。
从那以后我一直在使用Deployer来部署这个站点,在我的第100次部署之后,一切仍然顺利运行。这个工具给我留下了深刻的印象,我想我应该整理一份关于如何使用它的快速指南。
开始设置
我使用此类工具的常用方法是将其作为开发依赖项包含在项目本身中,而不是全局安装它们。第一步是在Composer文件中安装deployer作为开发依赖项。
composerrequire--devdeployer/deployer
在此之后,您可以运行初始化命令以使用Deployer进行设置。
./vendor/bin/depinit
这将询问一些关于您使用的平台以及项目的git存储库托管的问题。完成后,您将在项目的根目录中创建一个名为deploy.php的文件。
以下是deploy.php在此过程中创建的Drupal8文件示例。
set('deploy_path', '~/{{application}}'); //任务 task('build', function () { run('cd {{release_path}} && build'); }); //[可选]如果部署失败自动解锁。 after('deploy:failed', 'deploy:unlock');
开箱即用,我需要调整一些设置才能使工作正常进行。
Drupal用来存储用户文件的目录需要在我的设置中更新。默认情况下,Deploy假定您的Drupal代码库是扁平的,即Web根将位于存储库的根中。我的代码库是一个Composer设置,使用名为“docroot”的目录作为Web目录。这需要更改共享文件指令,以便将它们指向正确的位置。
可以在此处使用特殊变量drupal_site,默认情况下它指向“default”,因此如果您正在使用多站点设置,则可以在此处使用它来指向正确的目录。这里的shared_dirs参数指向部署目录中共享的区域,稍后我会回到这一点。该writeable_dirs参数允许部署者设置某些目录正确的权限,让他们可以通过该网站进行写入。这是我为自己的部署文件所做的更改。
set('shared_dirs', [ 'docroot/sites/{{drupal_site}}/files', ]); set('writable_dirs', [ 'docroot/sites/{{drupal_site}}/files', ]);
您可能会注意到默认deploy.php文件允许您添加这些指令,而在上面的示例中,我已经用set()函数覆盖了它们。这是因为我想简单地覆盖它们而不是添加到值中。
接下来,您需要设置用于连接到远程服务器的参数以及部署目录所在的位置。我之前已经讨论过如何设置一个用户,让您可以使用Deployer正确连接和部署。下面通过设置要连接的用户和端口来扩展默认创建的托管设置。
host('127.0.0.1') ->user('deployer') ->port(22) ->set('deploy_path', '/var/www/html/myproject');
可以对deploy.php文件的其他现有部分进行进一步的定制。您可能想要调整的一个部分是task()功能。该函数保存在drupal8.php文件(包含在文件顶部deploy.php)中,用于通知Deployer在部署期间运行什么。您可以从drupal8.php文件中复制它并根据需要进行修改。
task('deploy', [ 'deploy:info', 'deploy:prepare', 'deploy:lock', 'deploy:release', 'deploy:update_code', 'deploy:shared', 'deploy:writable', 'deploy:symlink', 'deploy:unlock', 'cleanup' ]);
部署结构
该工具本身通过创建一组标准目录来工作,它以deploy_path指令作为根目录部署到这些目录中。在此目录中,您将看到这样的结构。
.dep current releases shared
该.DEP目录包含一个名为发行文件,该文件跟踪应用程序的发布历史。每次部署计数器都会增加并记录当前时间。发行版存储在发行版目录中,每个发行版对应一个编号。以下是撰写本文时此站点的当前发布目录。
# ls releases/ 100 96 97 98 99
默认情况下,这设置为保留5个最新版本。您可以使用文件中的keep_releases设置来设置要保留的版本数deploy.php。
set('keep_releases',5);
Deploy结构中的当前目录实际上是当前版本的符号链接。当您运行部署时,该工具将在发布中创建另一个目录并在那里部署您的应用程序。如果部署任务成功,它将重新创建从旧版本目录到新版本目录的“当前”符号链接。这样做的好处是部署是原子的,因为它们是作为单个目录更改发生的,而不是站点的任何长时间停机。只有在部署过程没有遇到任何问题时才会执行最后一步,这样您就不会启动损坏的站点。此外,可以执行回滚以将代码恢复到以前的版本,而不会对站点造成任何重大中断。
这里的最终目录是共享目录。这是您的Drupal用户上传文件的存储位置,您还可以选择添加其他文件,例如settings.php或services.yml将它们添加到shared_files指令中。当您部署时,除了创建指向发布目录的符号链接外,Deploy还会在您的Drupal文件目录和此位置之间创建一个符号链接。您将看到在此目录中创建了一个类似的文件夹结构(即docroot/sites/default/files),它将在同一位置具有指向活动站点目录的符号链接。
我还没有提到这一点,但我们在这里所做的是部署到web目录中。在这种情况下,您需要将Web服务器设置为指向为您的站点提供服务的当前符号链接中的目录。在上面的示例中,它位于/var/www/html/myproject/current/docroot。
运行部署
配置文件就位并创建根部署目录后,您可以运行部署。这是通过 使用deploy命令运行dep来完成的 。
./vendor/bin/depdeploy
第一次发生这种情况时,Deploy将设置deploy_path中所需的所有目录(.dep、releases等),将您的Drupal站点部署到正确的位置,然后将所有内容符号链接在一起。
如果您想回滚,只需运行相同的操作,但使用rollback命令。所有这些都是将符号链接交换回它们之前的状态。
./vendor/bin/deprollback
您还可以使用许多其他操作。您可以使用cleanup命令清理任何旧版本,如果您的应用程序很大并且您想要释放一些服务器空间,这可能很有用。
./vendor/bin/depcleanup
如果您绝对需要登录服务器,那么您可以使用ssh命令快速登录。这将使用提供给该工具的凭据登录并将目录更改到正确的位置。
./vendor/bin/depssh
这也是在开始运行部署测试之前测试用户凭据的好方法。
有几次让我感到困惑的一件事是Deployer只会从git存储库中进行部署,而不是从您的本地代码库中进行部署。这意味着如果您忘记推送代码然后部署部署将运行但实际上无法部署任何内容。但是,它将使用您的本地deploy.php文件来运行部署。
最终,部署的使用大大降低了我的部署的复杂性并提高了可靠性。我强烈建议您使用此系统进行部署,即使您使用Travis之类的服务在部署之前检查您的代码库。您还可以使用Deploy在远程主机上执行自定义操作,因此如果您有任何SCSS编译步骤,那么这些步骤也可以构建到您的流程中。我没有涉及到这一点,但在他们的文档中有大量关于Deploy入门的信息。