techsemicolon/laravel-migration-pipeline

一个迁移管道,确保在多个服务器设置中相同的迁移不会再次运行

1.0.0 2019-04-09 15:43 UTC

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 也将被跳过,因为这些迁移已经由左侧的服务器运行。

Laravel Migration Pipeline

注意

此包假设/要求你为你的迁移提供唯一的名称。默认情况下,如果你使用 php artisan make:migration some_table_migration,其中 laravel 在迁移文件名开头添加时间戳,laravel 中的每个迁移都是唯一的。但是,如果你删除了该时间戳,确保你在迁移文件名中有一些内容可以将其标记为唯一。

许可

此包是开源软件,许可协议为 MIT 协议