sourcebroker/deployer-extended-wordpress

使用 deployer.org 的 WordPress 部署工具

6.0.0 2023-02-07 22:04 UTC

README

它做什么?

本包提供使用 deployer (deployer.org) 部署 WordPress 的任务,以及同步数据库和媒体文件的额外任务。

部署被简化,以便能够自动升级 WordPress 和通过管理员面板(或使用 InfiniteWP 等工具自动)手动升级插件。这在完全不部署和完全由 composer 驱动的部署之间是一种折中方案。如果您想完全使用 composer 来管理 WordPress 和插件,请查看 https://roots.io/sourcebroker/deployer-extended-wordpress-composer

我应该使用 "deployer-extended-wordpress" 还是 "deployer-extended-wordpress-composer"?

sourcebroker/deployer-extended-wordpress 中,WordPress 和第三方插件是手动安装的。在 GIT 中,您基本上只有主题/插件/muplugins。好处是您可以自动更新 WordPress 和插件。这可以被认为是对低预算 WordPress 网站有利的方案。

sourcebroker/deployer-extended-wordpress-composer 中,WordPress 和第三方插件使用 composer 安装。这种方法可以让你更好地控制安装的内容,但安装新的 WordPress 或新版本的插件时,您需要首先修改 composer.json 或进行 composer update(取决于升级的大小)。然后您需要提交 composer.json / composer.lock 并执行部署,这将安装 WordPress 和插件的新版本。这是一项无法轻易自动化的额外工作。这种解决方案的另一个额外优点是您可以轻松清理受感染的 WordPress/plugins 文件,因为每次部署时,所有 PHP 文件都是新的(部分来自您的 GIT,部分来自 composer 存储库)。

依赖项

本包依赖于以下包

安装

  1. 使用 composer 安装包

    composer require sourcebroker/deployer-extended-wordpress
    
  2. 在您的 deploy.php 中添加以下行

    require __DIR__ . '/vendor/autoload.php';
    new \SourceBroker\DeployerExtendedWordpress\Loader();
    
  3. 从您的 deploy.php 中删除任务 "deploy"。否则,您将覆盖 deployer/deploy/task/deploy.php 中定义的部署任务

  4. 示例 deploy.php 文件

    <?php
    
    namespace Deployer;
    
    require __DIR__.'/vendor/autoload.php';
    new \SourceBroker\DeployerExtendedWordpress\Loader();
    
    set('repository', 'git@my-git:my-project.git');
    
    host('live')
        ->setHostname('example.com')
        ->setRemoteUser('deploy')
        ->set('shared_files', array_merge(get('shared_files'), ['config/.env.live.local']))
        ->set('public_urls', ['https://www.example.com/'])
        ->set('deploy_path', '/var/www/example.com/live');
    
    host('beta')
        ->setHostname('example.com')
        ->setRemoteUser('deploy')
        ->set('shared_files', array_merge(get('shared_files'), ['config/.env.beta.local']))
        ->set('public_urls', ['https://beta.example.com/'])
        ->set('deploy_path', '/var/www/example.com/beta');
    
    host('dev')
        ->set('public_urls', ['https://example-com.ddev.site/'])
        ->set('deploy_path', getcwd());
    

注意 host('dev'); 的声明,这对于数据库任务来说,需要声明域名替换和数据库转储的存储路径。

项目文件夹结构

此部署有以下假设:

  1. WordPress源代码不在GIT中,以便能够从管理面板轻松升级它们。

  2. 为了能够从管理面板轻松升级,wp-content/plugins应该尽可能不包含在GIT中。不过,如果您愿意,也可以在GIT中包含一些插件。

  3. wp-content/mu-plugins可以部分不包含在GIT中,但也可以在那里包含包含在GIT中的插件。

  4. config/environments以及使用wp-config.env的想法是从bedrock反向移植的,并扩展了symfony/dotenv的概念。

  5. 考虑上述各点,GIT中仅有的文件将是:

    /config/environments/development.php
    /config/environments/staging.php
    /config/application.php
    /config/.env
    /config/.env.beta
    /config/.env.dev
    /config/.env.live
    /config/.env.dev.local.dist
    /config/.htaccess
    /wp-content/plugins/my-plugin-in-git
    /wp-content/mu-plugins/my-mu-plugin.php
    /wp-content/themes/my-theme/
    .gitignore
    deploy.php
    composer.lock
    composer.json
    wp-config.php
    

注意.env.beta.env.dev.env.live文件,这些文件存储特定于实例的数据,但可以存储在git中。例如,数据库名称、数据库用户、数据库主机、SMTP设置(不包含密码)。密码应存储在每个实例主机外的文件中,例如.env.beta.local.env.dev.local.env.live.local,或者如果您不太关心安全性,也可以将它们存储在git中。

您还需要为每个实例添加共享的本地env文件。您可以这样操作。看看第4行。
host('live')
 ->setHostname('example.com')
 ->setRemoteUser('deploy')
 ->set('shared_files', array_merge(get('shared_files'), ['config/.env.live.local']))
 ->set('public_urls', ['https://www.example.com/'])
 ->set('deploy_path', '/var/www/example.com/live');

实例上唯一必需的、不包含在git中的文件是/config/.env.local,其中您设置实例信息。/config/.env.local的内容应该是仅包含WP_INSTANCE='live'等,具体取决于哪个实例。

查看sourcebroker/wordpress-starter的示例,了解如何在您的WordPress中使用它。

deployer/set.php中定义的共享目录是:
set('shared_dirs', [
        'wp-content/uploads',
        'wp-content/languages',
        'wp-content/upgrade',
    ]
);
deployer/set.php中定义的共享文件是:
set('shared_files', [
    '.htaccess',
    'config/.env.local',
]);

Composer

您可以使用composer_channel(值:1、2、stable、prelive、snapshot)或composer_version来设置合适的composer版本,后者接受精确的标签作为参数(https://github.com/composer/composer/tags)。为了稳定性和安全性,建议您使用值12设置composer_channel,这样它将自动更新,但不会在未来安装任何新的主要版本,因此您的部署将保持相当稳定。

set('composer_channel', 2);

同步数据库

数据库同步是通过sourcebroker/deployer-extended-database完成的。以下是从生产环境到本地实例同步数据库的命令示例

dep db:pull live

域名替换

“post_command”任务“db:import:post_command:wp_domains”将更改“public_urls”中声明的域名。域名替换是通过wp-cli的“search-replace”命令完成的,来自wp-cli/wp-cli

请注意,为了使域名替换针对每对对应URL进行,每个实例的“public_urls”必须相同。

查看以下示例,以获得灵感。

host('live')
    ->setHostname('example.com')
    ->setRemoteUser('deploy')
    ->set('shared_files', array_merge(get('shared_files'), ['config/.env.live.local']))
    ->set('public_urls', ['https://www.example.com', 'https://sub.example.com'])
    ->set('deploy_path', '/var/www/example.com.live');

host('beta')
    ->setHostname('example.com')
    ->setRemoteUser('deploy')
    ->set('shared_files', array_merge(get('shared_files'), ['config/.env.live.local']))
    ->set('public_urls', ['https://beta.example.com', 'https://beta-sub.example.com'])
    ->set('deploy_path', '/var/www/example.com.beta');

host('dev')
    ->set('public_urls', ['https://example-com.ddev.site', 'https://sub-example-com.ddev.site'])
    ->set('deploy_path', getcwd());

如果您将执行以下命令:

dep db:pull live

数据库导入后,将自动执行以下命令。

wp search-replace https://www.example.com https://example-com.dev
wp search-replace https://sub.example.com https://sub-example-com.dev

配置

请注意,在开始数据库同步之前,“deploy.php”文件必须在所有实例上保持相同。

同步媒体 & WordPress / 插件代码

媒体同步是通过包sourcebroker/deployer-extended-media完成的。同步媒体和不在git中的PHP文件的命令是:

dep media:pull live

因为我们不使用composer获取WordPress和插件,所以我们将把WordPress和插件的代码视为一种媒体来同步。这是对sourcebroker/deployer-extended-media的一点点误用,但如果我们认为媒体是项目的一部分,它需要在不同实例之间同步,那么我们不在git中的WordPress和插件PHP代码就是需要在不同实例之间同步的一组文件。

因此,我们同步媒体和WordPress/插件代码的配置如下:

set('media',
    [
        'filter' => [
            '+ /wp-content/',
            '- /wp-content/mu-plugins/*',
            '- /wp-content/themes/*',
            '+ /wp-content/**',
            '+ /wp-admin/',
            '+ /wp-admin/**',
            '+ /wp-includes/',
            '+ /wp-includes/**',
            '+ .htaccess',
            '+ wp-activate.php',
            '+ wp-blog-header.php',
            '+ wp-comments-post.php',
            '+ wp-config-sample.php',
            '+ wp-config.php',
            '+ wp-cron.php',
            '+ wp-links-opml.php',
            '+ wp-load.php',
            '+ wp-login.php',
            '+ wp-mail.php',
            '+ wp-settings.php',
            '+ wp-signup.php',
            '+ wp-trackback.php',
            '+ xmlrpc.php',
            '+ index.php',
            '- *'
        ]
    ]);