ebs/parents-one-time-operations

部署后运行一次性的操作 - 就像你做迁移一样!

v1.0.5 2023-03-20 10:17 UTC

This package is auto-updated.

Last update: 2024-09-20 13:40:11 UTC


README

Laravel One-Time Operations

Laravel一次性操作

部署后运行一次性的操作 - 就像你做迁移一样!

使用Laravel一次性操作将您的CI/CD提升到下一个水平!🚀

创建用于一次性使用的特定类,这些类可以在每次部署后自动执行。就像迁移一样,它们只会处理一次,然后不再处理。非常适合在数据库更改或功能更新后立即播种或更新一些数据。

如果你...

  • 经常在部署新代码后更新特定数据
  • 经常在部署后只执行一次作业
  • 有时会忘记执行特定作业,导致情况变得混乱
  • 代码中充满了不再使用的作业
  • 同事总是需要被提醒在数据库更改后执行特定作业
  • 经常在迁移文件中播种或处理数据(这绝对不行!)

安装

使用composer安装此包

composer require timokoerber/laravel-one-time-operations

在您的数据库中创建所需的表

php artisan migrate

现在您已经准备好了!

命令

创建操作文件

php artisan operations:make <operation_name> // create operation file

处理操作

php artisan operations:process                   // process operation files
php artisan operations:process --sync            // force syncronously execution
php artisan operations:process --async           // force asyncronously execution
php artisan operations:process --test            // dont flag operations as processed
php artisan operations:process <operation_name>  // re-run one specific operation

显示操作

php artisan operations:show            // show all operations 
php artisan operations:show pending    // show pending operations 
php artisan operations:show processed  // show processed operations 
php artisan operations:show disposed   // show disposed operations 

php artisan operations:show pending processed disposed  // use multiple filters 

教程

CI/CD & 部署流程

一次性操作 的工作方式与 Laravel迁移 完全相同。只需在代码部署和迁移迁移后处理操作即可。您可以将其作为部署脚本的组成部分,如下所示

...
 - php artisan migrate
 - php artisan operations:process
...

编辑配置

默认情况下,将在您的项目中创建以下元素

  • 数据库中的 operations
  • 项目根目录中的 operations 目录

如果您想使用不同的设置,只需发布并编辑配置文件即可

php artisan vendor:publish --provider="TimoKoerber\LaravelOneTimeOperations\Providers\OneTimeOperationsServiceProvider"

这将创建一个包含以下内容的 config/one-time-operations.php 文件。

// config/one-time-operation.php

return [
    'directory' => 'operations',
    'table' => 'operations',
];

按需进行更改。

创建一次性操作文件

Laravel One-Time Operations - Create One-Time Operation files

Laravel One-Time Operations - Create One-Time Operation files

要创建新的操作文件,请执行以下命令

php artisan operations:make AwesomeOperation

这将创建一个类似于 operations/XXXX_XX_XX_XXXXXX_awesome_operation.php 的文件,并包含以下内容。

<?php
// operations/XXXX_XX_XX_XXXXXX_awesome_operation.php

use TimoKoerber\LaravelOneTimeOperations\OneTimeOperation;

return new class extends OneTimeOperation
{
    /**
     * Determine if the operation is being processed asyncronously.
     */
    protected bool $async = true;

    /**
     * Process the operation.
     */
    public function process(): void
    {
        //
    }
};

process() 方法中提供您的代码,例如

// operations/XXXX_XX_XX_XXXXXX_awesome_operation.php

public function process(): void
{
    User::where('active', 1)->update(['status' => 'awesome']) // make active users awesome
}

默认情况下,操作将通过调度作业 OneTimeOperationProcessJob 异步处理(根据您的配置)。

您也可以通过将 $async 标志设置为 false 来同步执行代码。(这仅适用于小型操作,因为这些操作的处理应该是部署过程的一部分)

处理操作

Laravel One-Time Operations - Processing the operations

使用以下调用处理所有新操作文件。

php artisan operations:process

您的代码将被执行,您将在 operations 表中找到所有已处理的操作。

之后,此操作将不再处理。

同步或异步调度作业

对于每个操作,都会调度一个 OneTimeOperationProcessJob,无论是使用 dispatch() 还是 dispatchSync(),这取决于操作文件中的 $async 属性。

通过提供 operations:process 命令的 --sync--async 选项,您可以强制同步或异步执行并忽略属性

php artisan operations:process --async  // force dispatch()
php artisan operations:process --sync   // force dispatchSync()  

提示! 如果 operation:process 是您部署过程的一部分,则 不推荐 同步处理操作,因为操作中的错误可能会使整个部署失败。

重新运行操作

Laravel One-Time Operations - Re-run an operation manually

如果发生错误(或者只是想这么做),你可以通过在 operations:process 中提供 操作的名称 作为参数来重新处理一个操作。

php artisan operations:process XXXX_XX_XX_XXXXXX_awesome_operation

测试操作

在标记操作为“已处理”之前,你可能想要测试几次你的代码。提供 --test 标志可以重复运行命令。

php artisan operations:process --test

显示所有操作

Laravel One-Time Operations - Showing all operations

因此,你不需要检查数据库或目录以获取现有操作,你可以使用 operations:show 来显示一个列表。使用可用的过滤器 pendingprocesseddisposed 来筛选列表。

  • pending - 尚未处理的操作
  • processed - 已处理的操作
  • disposed - 已处理且文件已被删除的操作
php artisan operations:show pending           // show only pending operations
php artisan operations:show pending disposed  // show only pending and disposed operations

删除操作

这个包的整个想法是,一旦执行了操作,你就可以将其删除,这样你的项目就不会被不再使用的文件和代码所杂乱。

所以你只需要 从你的仓库中删除文件

当你调用 operations:show 时,被删除的操作将显示为 DISPOSED,这样你仍然有所有已处理操作的记录。

测试

composer test

许可

版权 © Timo Körber | www.timokoerber.com

Laravel One-Time Operations 是开源软件,使用 MIT 许可 许可。