部署后迁移

部署后迁移是常规的Rails迁移,可以在部署后选择性地执行。默认情况下,这些迁移与其他迁移一起执行。要跳过这些迁移,您必须设置环境变量SKIP_POST_DEPLOYMENT_MIGRATIONS到运行时的非空值rake db: migrate

例如,这将运行所有迁移,包括任何部署后迁移:

执行rake db: migrate

但是,这将跳过部署后的迁移:

SKIP_POST_DEPLOYMENT_MIGRATIONS真正的执行rake db: migrate

部署集成

假设您正在使用Chef来部署新版本的GitLab,并且希望在部署新版本后运行部署后迁移。假设您通常使用该命令chef-client这样做。要使用这个特性,你必须像下面这样运行这个命令:

SKIP_POST_DEPLOYMENT_MIGRATIONS真正的sudochef-client

一旦所有服务器都更新了,您就可以运行了chef-client还是在单个服务器上没有环境变量。

该过程与其他部署技术类似:首先使用环境变量集进行部署,然后重新部署单个服务器,但使用该变量设置

创建迁移

要创建部署后迁移,你可以使用以下Rails生成器:

执行g post_deployment_migration migration_name_here

这将生成迁移文件db / post_migrate。这些迁移的行为与常规的Rails迁移完全相同。

用例

部署后迁移可用于执行迁移,从而改变现有版本的GitLab所依赖的状态。例如,假设要从表中删除一列。这需要停机时间,因为GitLab实例依赖于该列在运行时是否存在。在这种情况下,通常你会遵循以下步骤:

  1. 停止GitLab实例
  2. 执行迁移操作,移除列
  3. 再次启动GitLab实例

使用部署后迁移,我们可以遵循以下步骤:

  1. 部署新版本的GitLab,同时忽略部署后的迁移
  2. 重新运行rake db: migrate但是没有设置环境变量

在这里,我们在迁移发生时不需要任何停机时间已经部署了一个新版本(不再依赖于列)。

这些迁移有用的其他一些示例:

  • 清理由于GitLab中的错误而生成的数据
  • 删除表
  • 将作业从一个Sidekiq队列迁移到另一个
Baidu
map