【问题标题】:How to migrate db in django using CI/CD with Google CloudSQL?如何使用 CI/CD 和 Google CloudSQL 在 django 中迁移 db?
【发布时间】:2023-11-19 12:32:02
【问题描述】:

我在 gitlab 中有一个 django 存储库设置,我正在尝试使用 gitlab CI/CD 在谷歌云上自动构建和部署。

应用必须部署在 App Engine 上,并且必须使用 CloudSQL 进行动态数据存储。

我面临的问题是在部署我的应用程序之前在数据库上执行迁移时。

我应该运行连接到 cloudSQL 的 ./manage.py migrate

我读到我们可以使用云代理连接到 cloudSQL 并迁移数据库。但这有点像黑客。有没有办法通过 CI/CD 管道脚本迁移我的数据库?

感谢任何帮助。谢谢。

【问题讨论】:

  • 如果你想使用 cloudBuild 和 Github 和公有云 sql 实例,请参考 - link

标签: django continuous-integration google-cloud-sql gcloud continuous-deployment


【解决方案1】:

在 App Engine 标准环境中运行 Django 时,处理数据库迁移的 recommended 方法是直接从控制台 shell 或本地计算机(需要使用云 sql 代理)运行 ./manage.py migrate

如果您希望数据库迁移与您的应用程序部署分离并在 Gitlab CI/CD 中运行,您可以按照以下方式进行操作:

  • 用作基础镜像google/cloud-sdk:latest
  • 获取凭据gcloud auth activate-service-account --key-file $GOOGLE_SERVICE_ACCOUNT_FILE
  • 使用wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy 下载cloudsqlproxy 并使其可执行chmod +x cloud_sql_proxy
  • 启动代理./cloud_sql_proxy -instances="[YOUR_INSTANCE_CONNECTION_NAME]"=tcp:3306
  • 最后,运行迁移脚本。

您也可以创建一个自定义 docker 镜像,该镜像已经在幕后完成了上述操作,结果将是相同的。

如果您想进一步了解此事,我建议您查看以下文章link1link2

【讨论】:

  • 启动代理会占用终端 - 你将如何在后台运行它,让你继续迁移步骤?
  • @TielmanNieuwoudt 您可以打开一个新的 Cloud Shell 选项卡(或虚拟机/本地机器中的终端)并在其中运行迁移脚本。
  • 感谢您的建议。我关注的是它在 CI/CD 脚本中的事实。因此,无论是在本地还是在 CircleCI 之类的东西中,我都在尝试找到一种方法来以一种不阻塞终端、无需用户交互的方式启动代理。
  • 为避免终端阻塞,后台运行云代理命令。在 unix 系统命令后跟 & 符号将在后台模式下运行命令
【解决方案2】:

我也在尝试找到正确的方法来做到这一点。 另一种 hacky 方法是在与您的应用程序一起加载的设置文件中添加对它的调用。 类似 migrate.py 文件的东西:

from django.core.management import execute_from_command_line
execute_from_command_line(['./manage.py', 'migrate'])

所以每次部署新版本的应用程序后,它也会运行迁移。

我想相信还有其他方法,不涉及代理,特别是如果您还想为 sql 使用私有 ip - 那么这个脚本必须在同一个 vpc 中运行。

【讨论】:

  • cloudbuild 是一个很棒的部署工具。它与 Github 有很好的集成,但它不支持 VPC。因此无法在私有云 sql 实例上创建 django 迁移。到目前为止,您是否找到了更好的私有 sql 方法?