ebs / parents-one-time-operations
部署后运行一次性的操作 - 就像你做迁移一样!
Requires
- php: ^7.2
- laravel/framework: ^v6.20.44
README
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', ];
按需进行更改。
创建一次性操作文件
要创建新的操作文件,请执行以下命令
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
来同步执行代码。(这仅适用于小型操作,因为这些操作的处理应该是部署过程的一部分)
处理操作
使用以下调用处理所有新操作文件。
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
是您部署过程的一部分,则 不推荐 同步处理操作,因为操作中的错误可能会使整个部署失败。
重新运行操作
如果发生错误(或者只是想这么做),你可以通过在 operations:process
中提供 操作的名称 作为参数来重新处理一个操作。
php artisan operations:process XXXX_XX_XX_XXXXXX_awesome_operation
测试操作
在标记操作为“已处理”之前,你可能想要测试几次你的代码。提供 --test
标志可以重复运行命令。
php artisan operations:process --test
显示所有操作
因此,你不需要检查数据库或目录以获取现有操作,你可以使用 operations:show
来显示一个列表。使用可用的过滤器 pending
、processed
和 disposed
来筛选列表。
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 许可 许可。