node.js - Google Cloud Build、Cloud Run、Cloud SQL Prisma 迁移

标签 node.js google-cloud-sql prisma google-cloud-run google-cloud-build

我正在尝试让 Google Cloud Build 管道与 Node.js 应用程序一起运行,该应用程序使用 Google Cloud Build、Cloud SQL (PostgreSQL) 和 Prisma 作为 ORM。当单击现有应用程序的 Cloud Run UI View 上的设置持续集成按钮时,我开始使用 GCP Cloud Build 提供的默认yaml。缺少的部分是 Cloud SQL 实例的 prisma 迁移。

steps:
  - name: gcr.io/cloud-builders/docker
    args:
      - build
      - '--no-cache'
      - '-t'
      - '$_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA'
      - .
      - '-f'
      - api/Dockerfile
    id: Build
  - name: gcr.io/cloud-builders/docker
    args:
      - push
      - '$_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA'
    id: Push
  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk:slim'
    args:
      - run
      - services
      - update
      - $_SERVICE_NAME
      - '--platform=managed'
      - '--image=$_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA'
      - >-
        --labels=managed-by=gcp-cloud-build-deploy-cloud-run,commit-sha=$COMMIT_SHA,gcb-build-id=$BUILD_ID,gcb-trigger-id=$_TRIGGER_ID,$_LABELS
      - '--region=$_DEPLOY_REGION'
      - '--quiet'
    id: Deploy
    entrypoint: gcloud
images:
  - '$_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA'
options:
  substitutionOption: ALLOW_LOOSE
tags:
  - gcp-cloud-build-deploy-cloud-run
  - gcp-cloud-build-deploy-cloud-run-managed
  - api

最佳答案

我通过使用以下 Cloud Build yaml 解决了该问题。它托管在我的 git 存储库中,因此可以跟踪任何代码更改。我选择了 Repository 作为源,并在我的存储库中添加了 cloudbuild.yaml 文件的位置,而不是 Google Cloud 中的 inline 选项构建触发器。只要从以前的 API 版本到新版本没有任何重大更改,此解决方案就应该有效(在新应用程序代码拥有所有流量之前,如果您执行以下操作,该解决方案将在短时间内不起作用:例如,重命名旧应用程序代码所依赖的数据库中的字段)。管理此问题的方法不是在删除旧列之前进行重大更改并将数据从旧列迁移到新列。另一种选择是安排数据库维护的停机时间。

请记住,数据库迁移运行时存在竞争条件,但以前版本的代码在切换之前仍在接受流量,并且使用该应用程序的人可能会收到 500 个错误。

这是使用 Prisma 迁移步骤更新的 cloudbuild.yaml(注意:这还使用 Google Cloud Secret Manager 作为数据库):

steps:
  - name: 'node:$_NODE_VERSION'
    entrypoint: 'yarn'
    id: yarn-install
    args: ['install']
    waitFor: ["-"]

  - id: migrate
    name: gcr.io/cloud-builders/yarn
    env:
      - NODE_ENV=$_NODE_ENV
    entrypoint: sh
    args:
      - "-c"
      - |
        wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
        chmod +x cloud_sql_proxy
        ./cloud_sql_proxy -instances=$$_DB_HOST=tcp:$$_DB_PORT & sleep 3
        export DATABASE_URL=postgresql://$$_DB_USER:$$_DB_PASS@localhost/$$_DB_NAME?schema=public
        yarn workspace api run migrate
    secretEnv: ['_DB_USER', '_DB_PASS',  '_DB_HOST', '_DB_NAME', '_DB_PORT']
    timeout: "1200s"
    waitFor: ["yarn-install"]

  - name: gcr.io/cloud-builders/docker
    args:
      - build
      - '--no-cache'
      - '-t'
      - '$_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA'
      - .
      - '-f'
      - api/Dockerfile
    id: Build
  - name: gcr.io/cloud-builders/docker
    args:
      - push
      - '$_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA'
    id: Push
  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk:slim'
    args:
      - run
      - services
      - update
      - $_SERVICE_NAME
      - '--platform=managed'
      - '--image=$_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA'
      - >-
        --labels=managed-by=gcp-cloud-build-deploy-cloud-run,commit-sha=$COMMIT_SHA,gcb-build-id=$BUILD_ID,gcb-trigger-id=$_TRIGGER_ID,$_LABELS
      - '--region=$_DEPLOY_REGION'
      - '--quiet'
    id: Deploy
    entrypoint: gcloud
images:
  - '$_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME/$_SERVICE_NAME:$COMMIT_SHA'
options:
  substitutionOption: ALLOW_LOOSE
availableSecrets:
  secretManager:
  - versionName: projects/$PROJECT_ID/secrets/DB_NAME/versions/latest
    env: '_DB_NAME'
  - versionName: projects/$PROJECT_ID/secrets/DB_PASS/versions/latest
    env: '_DB_PASS'
  - versionName: projects/$PROJECT_ID/secrets/DB_PORT/versions/latest
    env: '_DB_PORT'
  - versionName: projects/$PROJECT_ID/secrets/DB_USER/versions/latest
    env: '_DB_USER'
  - versionName: projects/$PROJECT_ID/secrets/DB_HOST/versions/latest
    env: '_DB_HOST'

tags:
  - gcp-cloud-build-deploy-cloud-run
  - gcp-cloud-build-deploy-cloud-run-managed
  - api

关于node.js - Google Cloud Build、Cloud Run、Cloud SQL Prisma 迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74891893/

相关文章:

javascript - 无法理解 node.js

postgresql - Google App Engine Golang 连接到 Cloud SQL Postgres unix 拨号没有这样的文件或目录

javascript - Prisma 中的数据建模与关系

docker - Prisma部署Docker错误 “Could not connect to server”

postgresql - Prisma模型自引用(一对多)

node.js - 我对较大偏移量的 Sequelize 分页响应缓慢

ruby-on-rails - 如何正确安装 dc.js 以便与 Rails 5 一起使用?

postgresql - 使用 Flask 将 Docker 容器连接到 App Engine 中的 PostgreSQL 时出现问题

Node.js: express 不工作?