部署到 Google Cloud Platform (GCP)
本指南介绍了如何使用 Google Cloud Build 和 Google Cloud Run 在无服务器架构上构建和运行您的 Swift 服务器。我们将使用 Artifact Registry 来存储 Docker 镜像。
Google Cloud Platform 设置
您可以阅读 GCP 入门指南 以了解更多详情。为了运行 Swift 服务器应用程序,我们需要:
- 启用 结算功能(需要信用卡)。请注意,当您创建新帐户时,GCP 会为您提供 300 美元的免费额度,可在前 90 天内使用。您可以按照本指南免费操作。本指南中的所有内容都应属于 GCP 的“免费层级”类别(每天 120 分钟的构建时间,每月 200 万次 Cloud Run 请求 免费层级使用限制)
- 启用 Cloud Build API
- 启用 Cloud Run Admin API
- 启用 Artifact Registry API
- 在 Artifact Registry 中创建一个仓库(格式:Docker,区域:您的选择)
项目要求
请验证您的服务器监听的是 0.0.0.0
,而不是 127.0.0.1
,并且建议使用环境变量 $PORT
而不是硬编码的值。为了使工作流程通过,两个文件至关重要,它们都需要位于项目根目录中:
- Dockerfile
- cloudbuild.yaml
Dockerfile
Dockerfile 部分的永久链接" href="#dockerfile">
您应该使用 docker build . -t test
和 docker 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
步骤详情
- 从 Artifact Registry 拉取最新的镜像以检索缓存层
- 使用
$SHORT_SHA
和latest
标签构建镜像 - 将镜像推送到 Artifact Registry
- 将镜像部署到 Cloud Run
images
指定要存储在注册表中的构建镜像。默认的 timeout
为 10 分钟,因此我们需要为 Swift 构建增加超时时间。我们在此处使用 8080
作为默认端口,但建议删除此行并让服务器监听 $PORT
。
部署
将所有文件推送到远程仓库。Cloud Build 当前支持 GitHub、Bitbucket 和 GitLab。现在)前往 Cloud Build 触发器 并单击“创建触发器”。
- 添加名称和描述
- 事件:“推送到分支”处于活动状态
- 来源:“连接新仓库”并使用您的代码提供商进行授权,然后添加托管 Swift 服务器代码的仓库。请注意,您需要先配置 GitHub、GitLab 或 Bitbucket 以允许 GCP 访问。
- 配置:“Cloud Build 配置文件”/位置:仓库
- 高级:替换变量:您需要在此处设置区域、仓库名称和服务名称的变量。您可以选择一个您选择的区域(例如
us-central1
)。所有自定义变量都必须以下划线开头(_REGION
)。_REPOSITORY_NAME
和_SERVICE_NAME
由您决定。如果您使用环境变量(例如连接到数据库或第三方服务),您也可以在此处设置值。 - “创建”
在部署新服务之前的最后一步,请转到 Cloud Build 设置 并确保“Cloud Run”已启用。这为 Cloud Build 提供了部署 Cloud Run 服务所需的 IAM 权限。
在触发器概览页面中,您应该看到新的“swift-service”触发器。单击右侧的“运行”以从 main
分支手动启动触发器。对于一个简单的 Hummingbird 项目,构建大约需要 7-8 分钟。Vapor 在标准/小型构建机器上大约需要 25 分钟,这相当慢。来自 Vapor Discord 社区的 “Jordane” 建议在 cloudbuild.yaml
中使用 machineType: E2_HIGHCPU_8
以加快部署速度。
options:
machineType: 'E2_HIGHCPU_8'
成功构建后,您应该在构建日志中看到服务 URL
您可以前往 Cloud Run 并查看您的服务在那里运行。
触发器将部署 main
上的每个新提交。您还可以为功能驱动的工作流程启用 Pull Request 触发器。Cloud Build 还允许蓝绿部署、自动扩缩容以及更多功能。
您现在可以将您的自定义域名连接到新服务并上线。
清理
- 删除 Cloud Run 服务
- 删除 Cloud Build 触发器
- 删除 Artifact Registry 仓库