部署后迁移
部署后迁移是常规的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实例依赖于该列在运行时是否存在。在这种情况下,通常你会遵循以下步骤:
- 停止GitLab实例
- 执行迁移操作,移除列
- 再次启动GitLab实例
使用部署后迁移,我们可以遵循以下步骤:
- 部署新版本的GitLab,同时忽略部署后的迁移
- 重新运行
rake db: migrate
但是没有设置环境变量
在这里,我们在迁移发生时不需要任何停机时间后已经部署了一个新版本(不再依赖于列)。
这些迁移有用的其他一些示例:
- 清理由于GitLab中的错误而生成的数据
- 删除表
- 将作业从一个Sidekiq队列迁移到另一个