techsemicolon / laravel-migration-pipeline
一个迁移管道,确保在多个服务器设置中相同的迁移不会再次运行
Requires
- php: >=5.3.0
This package is auto-updated.
Last update: 2024-09-10 06:09:11 UTC
README
一个迁移管道,确保在多个服务器设置中相同的迁移不会再次运行
版本支持
适用于 Laravel 版本 5.3 及以上。
简介
当你运行 laravel 中的 php artisan migrate
时,它会检查是否存在尚未迁移的新迁移文件。如果存在,则会逐个运行每个迁移,并在 migrations
表中添加一条记录,包含迁移名称和批次号。
然而,当你有多个自动扩展的服务器并且有 CI/CD 管道自动拉取 git webhooks 的最新版本时,具有 php artisan migrate
的后端 webhook 脚本几乎同时在这些所有服务器上运行。
例如,假设你有 3 个运行的 laravel 服务器。当你推送到 git 时,git webhook 触发 CI/CD 管道,然后所有服务器几乎同时接收到 webhook。
这三个服务器都将运行 webhook 脚本,这些脚本将执行 git pull 和 php artisan 命令。其中之一将是 php artisan migrate
。如果你在版本中包含 3 个新的迁移,它们将尝试以不同的(通常是连续的)批次号运行。
我们想要避免这种情况。如果一个迁移在 3 个服务器中的第一个服务器上已经运行,我们不想让第二个和第三个服务器再次运行它。这就是这个包发挥作用的时候。
在任何情况下,如果一个迁移正在一个服务器上运行或已在不同的批次号中运行,它将不会再次运行。这将避免上述问题。
安装
使用 composer 安装包
composer require techsemicolon/gitdeployer
安装后,您可以在 config/app.php
文件中添加服务提供者(对于 Laravel 版本 <= 5.4)。对于后续版本,服务提供者将自动包含。
Techsemicolon\MigrationPipeline\ServiceProvider::class,
示例
以下截图展示了两个服务器同时运行 php artisan migrate
的场景。然而,右侧的服务器运行了 migration_1,因此,左侧的服务器跳过了这个迁移并运行了剩余的迁移。
此外,一旦右侧服务器运行了 migration_1,migration_2、migration_3 和 migration_4 也将被跳过,因为这些迁移已经由左侧的服务器运行。
注意
此包假设/要求你为你的迁移提供唯一的名称。默认情况下,如果你使用 php artisan make:migration some_table_migration
,其中 laravel 在迁移文件名开头添加时间戳,laravel 中的每个迁移都是唯一的。但是,如果你删除了该时间戳,确保你在迁移文件名中有一些内容可以将其标记为唯一。
许可
此包是开源软件,许可协议为 MIT 协议