部署到 Google Cloud Platform (GCP)

本指南介绍了如何使用 Google Cloud BuildGoogle Cloud Run 在无服务器架构上构建和运行您的 Swift 服务器。我们将使用 Artifact Registry 来存储 Docker 镜像。

Google Cloud Platform 设置

您可以阅读 GCP 入门指南 以了解更多详情。为了运行 Swift 服务器应用程序,我们需要:

项目要求

请验证您的服务器监听的是 0.0.0.0,而不是 127.0.0.1,并且建议使用环境变量 $PORT 而不是硬编码的值。为了使工作流程通过,两个文件至关重要,它们都需要位于项目根目录中:

  1. Dockerfile
  2. cloudbuild.yaml

Dockerfile Dockerfile 部分的永久链接" href="#dockerfile">

您应该使用 docker build . -t testdocker run -p 8080:8080 test 测试您的 Dockerfile,并确保它可以在本地构建和运行。

Dockerfile打包指南中的相同。将 <executable-name> 替换为您的 executableTarget(即 “Server”)。

#------- build -------
FROM swift:centos as builder

# set up the workspace
RUN mkdir /workspace
WORKDIR /workspace

# copy the source to the docker image
COPY . /workspace

RUN swift build -c release --static-swift-stdlib

#------- package -------
FROM centos:8
# copy executable
COPY --from=builder /workspace/.build/release/<executable-name> /

# set the entry point (application name)
CMD ["<executable-name>"]

cloudbuild.yaml cloudbuild.yaml 部分的永久链接" href="#cloudbuildyaml">

cloudbuild.yaml 文件包含一组步骤,用于直接在云端构建服务器镜像,并在成功构建后部署新的 Cloud Run 实例。${_VAR}“替换变量”,在构建时可用,并且可以在“部署”阶段传递到运行时环境中。我们将在配置 构建触发器(步骤 5)时设置变量。

steps:
  - name: 'gcr.io/cloud-builders/docker'
    entrypoint: 'bash'
    args:
      - '-c'
      - |
        docker pull ${_REGION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY_NAME}/${_SERVICE_NAME}:latest || exit 0
  - name: 'gcr.io/cloud-builders/docker'
    args:
      - build
      - -t
      - ${_REGION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY_NAME}/${_SERVICE_NAME}:$SHORT_SHA
      - -t
      - ${_REGION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY_NAME}/${_SERVICE_NAME}:latest
      - .
      - --cache-from
      - ${_REGION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY_NAME}/${_SERVICE_NAME}:latest
  - name: 'gcr.io/cloud-builders/docker'
    args:
      [
        'push',
        '${_REGION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY_NAME}/${_SERVICE_NAME}:$SHORT_SHA'
      ]
  - name: 'gcr.io/cloud-builders/gcloud'
    args:
      - run
      - deploy
      - swift-service
      - --image=${_REGION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY_NAME}/${_SERVICE_NAME}:$SHORT_SHA
      - --port=8080
      - --region=${_REGION}
      - --memory=512Mi
      - --platform=managed
      - --allow-unauthenticated
      - --min-instances=0
      - --max-instances=5
images:
  - '${_REGION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY_NAME}/${_SERVICE_NAME}:$SHORT_SHA'
  - '${_REGION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY_NAME}/${_SERVICE_NAME}:latest'
timeout: 1800s

步骤详情

  1. 从 Artifact Registry 拉取最新的镜像以检索缓存层
  2. 使用 $SHORT_SHAlatest 标签构建镜像
  3. 将镜像推送到 Artifact Registry
  4. 将镜像部署到 Cloud Run

images 指定要存储在注册表中的构建镜像。默认的 timeout 为 10 分钟,因此我们需要为 Swift 构建增加超时时间。我们在此处使用 8080 作为默认端口,但建议删除此行并让服务器监听 $PORT

部署

cloud build trigger settings and how to connect a code repository

将所有文件推送到远程仓库。Cloud Build 当前支持 GitHub、Bitbucket 和 GitLab。现在)前往 Cloud Build 触发器 并单击“创建触发器”。

  1. 添加名称和描述
  2. 事件:“推送到分支”处于活动状态
  3. 来源:“连接新仓库”并使用您的代码提供商进行授权,然后添加托管 Swift 服务器代码的仓库。请注意,您需要先配置 GitHubGitLabBitbucket 以允许 GCP 访问。
  4. 配置:“Cloud Build 配置文件”/位置:仓库
  5. 高级:替换变量:您需要在此处设置区域、仓库名称和服务名称的变量。您可以选择一个您选择的区域(例如 us-central1)。所有自定义变量都必须以下划线开头(_REGION)。_REPOSITORY_NAME_SERVICE_NAME 由您决定。如果您使用环境变量(例如连接到数据库或第三方服务),您也可以在此处设置值。
  6. “创建”

在部署新服务之前的最后一步,请转到 Cloud Build 设置 并确保“Cloud Run”已启用。这为 Cloud Build 提供了部署 Cloud Run 服务所需的 IAM 权限。

cloud build settings

在触发器概览页面中,您应该看到新的“swift-service”触发器。单击右侧的“运行”以从 main 分支手动启动触发器。对于一个简单的 Hummingbird 项目,构建大约需要 7-8 分钟。Vapor 在标准/小型构建机器上大约需要 25 分钟,这相当慢。来自 Vapor Discord 社区的 “Jordane” 建议在 cloudbuild.yaml 中使用 machineType: E2_HIGHCPU_8 以加快部署速度。

options:
  machineType: 'E2_HIGHCPU_8'

成功构建后,您应该在构建日志中看到服务 URL

successful build and deployment to cloud run

您可以前往 Cloud Run 并查看您的服务在那里运行。

cloud run overview

触发器将部署 main 上的每个新提交。您还可以为功能驱动的工作流程启用 Pull Request 触发器。Cloud Build 还允许蓝绿部署、自动扩缩容以及更多功能。

您现在可以将您的自定义域名连接到新服务并上线。

清理