Azure for Game Developers Part 2: 使用 Microsoft Game Stack 自动开发和部署游戏服务器





5.00/5 (1投票)
在本文中,我们将学习如何使用 GitHub Actions 自动化开发和部署流程,并使用一个真实、功能齐全的多人游戏服务器。
Microsoft Game Stack 是一系列工具和服务,包括 Microsoft Azure、PlayFab、Xbox Services 和 Visual Studio 等工具。从独立工作室到 AAA 团队的各种规模的游戏开发者都可以使用这些工具来构建和发布令人惊叹的游戏。当我们构建具有实时多人游戏功能的游戏时,一个从开发到生产环境部署的顺畅、自动化的工作流程可以为开发人员节省大量时间和精力。此外,它还可以减少过程中出错的可能性。
在本文中,我们将基于 本系列上一部分 中构建的 Azure Kubernetes Service 集群。我们将使用 GitHub Actions,以便在代码从 Visual Studio Code 推送到存储库时,自动部署一个完全可玩 开源多人贪吃蛇游戏。
要求
要跟随本指南,您需要一个 拥有订阅的 Azure 账户、一个 GitHub 账户,并在您的计算机上安装以下软件
您还需要一个已准备好进行容器部署的 AKS 集群。如果您还没有,可以按照本系列上一部分的步骤 创建 AKS 集群。
创建多人贪吃蛇游戏的分支
在此示例中,我们将使用由 Simon Diep 在 GitHub 上使用 Node.js、Express 和 Socket.io 构建的一个很棒的 开源多人贪吃蛇游戏。
请确保您已登录 GitHub,然后点击页面右上角的 **Fork** 按钮,以拥有存储库的副本以进行新更改。
接下来,打开 Visual Studio Code,并在左侧导航栏中选择 **Source Control**。点击 **Clone Repository**,选择 **Clone from GitHub**,如果需要,授权访问您的 GitHub 账户。然后,搜索 `node-multiplayer-snake` 存储库,并选择一个文件夹来下载源代码。
现在游戏代码已在您的计算机上,我们只需要安装依赖项来测试并确保一切正常。我们可以通过键盘快捷键 ^ + ` (或 Ctrl + `) 直接在 VS Code 中打开终端,然后输入 `npm install` 来完成此操作。
接下来,使用 `npm start` 在本地运行项目,并在 Web 浏览器中打开游戏,地址为 https://:3000。您应该能看到贪吃蛇游戏,并可以使用箭头键进行控制。
设置 GitHub Actions
游戏服务器准备就绪后,我们现在可以设置 GitHub 存储库来构建 Docker 镜像并将其部署到我们的 AKS 集群。
在 Web 浏览器中打开您的 GitHub 存储库,点击 GitHub 存储库中的 **Actions**,然后选择 **set up a workflow yourself** 来创建一个新的工作流。
用此 Build-and-Deploy-Docker-Image 工作流示例中的模板覆盖提供的模板。然后,在工作流文件的 `env` 部分,将 `REGISTRY_NAME` 设置为您的 Azure 容器注册表名称,将 `CLUSTER_NAME` 设置为 AKS 集群名称,并将 `CLUSTER_RESOURCE_GROUP` 设置为您的资源组名称。
它应该看起来像这样
# Environment variables available to all jobs and steps in this workflow env: REGISTRY_NAME: msgsdeployregistry CLUSTER_NAME: ms-gs-deploy-app CLUSTER_RESOURCE_GROUP: ms-gs-deploy NAMESPACE: default
现在您可以提交此工作流文件。
接下来,我们需要为 `REGISTRY_USERNAME`、`REGISTRY_PASSWORD` 和 `AZURE_CREDENTIALS` 添加三个 GitHub 存储库秘密。
要添加秘密,请导航到存储库的 **Settings**,向下滚动,然后点击 **Secrets**。
以下命令在终端窗口中创建一个 Active Directory 服务主体,并将提供我们使用的注册表用户名和密码值
az ad sp create-for-rbac --skip-assignment
这将返回一个看起来像这样的值 JSON 对象
{
"appId": "14c2e46b-abdc-4c06-0c13-1d4e7bd3b203",
"displayName": "azure-cli-2021-09-20-06-39-00",
"name": "http://azure-cli-2021-09-20-06-39-00",
"password": "agJMg1LpRv654~ErFoI~_YbIxFP2PZ_Z9f",
"tenant": "fa928ab4-e149-41d6-af72-1dcc537cfd29"
}
`appId` 是我们将用于 `REGISTRY_USERNAME` 的值,而 `password` 是我们需要用作 `REGISTRY_PASSWORD` 的值。在存储库中创建并保存这些存储库秘密。
Azure 凭据秘密值是一个完整的 JSON 对象,可以使用以下命令检索
az ad sp create-for-rbac --sdk-auth
输出将如下所示:
{
"clientId": "41e027f8-6620-4695-842d-8be259090b1f",
"clientSecret": "PYcqJ7K_.EaqjoQVgmY_4-wt6Eshj03Z2j",
"subscriptionId": "de4b56e1-ab1c-489b-afc6-d286c13f7485",
"tenantId": "fa928ab4-e149-41d6-af72-1dcc537cfd29",
"activeDirectoryEndpointUrl": "https://login.microsoftonline.com",
"resourceManagerEndpointUrl": "https://management.azure.com/",
"activeDirectoryGraphResourceId": "https://graph.windows.net/",
"sqlManagementEndpointUrl": "https://management.core.windows.net:8443/",
"galleryEndpointUrl": "https://gallery.azure.com/",
"managementEndpointUrl": "https://management.core.windows.net/"}
将整个 JSON 对象复制并保存到最后一个存储库秘密中,然后点击 **Add secret**。在这里,我们将秘密命名为 `AZURE_CREDENTIALS`。
让我们验证注册表用户名和密码是否为我们提供了对 Azure 容器注册表的正确访问权限。这可确保 GitHub 可以将构建的镜像推送到其中。
我们将通过两个命令来完成此操作。
首先,在此命令中使用您的资源组名称和 ACR 名称设置 `ACR_ID` 变量
ACR_ID=$(az acr show --resource-group {YOUR-RESOURCE-GROUP} --name {ACR-NAME} --query "id" --output tsv)
例如
ACR_ID=$(az acr show --resource-group ms-gs-deploy --name msgsdeployregistry --query "id" --output tsv)
然后,像这样将 `Contributor` 角色分配给前面创建的用户名 (`appId`)。
az role assignment create --assignee {appId} --role Contributor --scope $ACR_ID
这里有一个例子:
az role assignment create --assignee 14c2e46b-abdc-4c06-0c13-1d4e7bd3b203 --role Contributor --scope $ACR_ID
构建和部署配置
我们几乎准备好了!我们需要在存储库中有一个 `Dockerfile`,用于将存储库构建成 Docker 容器,以及“service.yml”和“deployment.yml”清单文件来指定如何将其部署到 AKS 集群。
在项目文件夹中创建一个 `Dockerfile`,它会将项目文件复制到 `/src` 文件夹。然后,安装依赖项,公开端口 3000,然后启动项目。如果您愿意,可以使用 上一个项目中的相同 Dockerfile。它看起来应该像这样
FROM node:14-alpine WORKDIR /src COPY package*.json ./ RUN npm install --production COPY . /src EXPOSE 3000 CMD [ "npm", "start" ]
接下来,在项目文件夹中创建一个名为“manifests”的文件夹,并创建以下两个文件:“service.yml”和“deployment.yml”。确保将登录服务器地址替换为与您的 ACR 匹配的容器镜像(例如,“msgsdeployregistry.azurecr.io”),如果您愿意,可以将应用程序名称指定为“test-app”以外的名称。
“service.yml”文件应包含以下代码
apiVersion: v1 kind: Service metadata: name: test-app spec: type: LoadBalancer ports: - port: 3000 selector: app: test-app
我们的“deployment.yml”文件应该看起来像这样
apiVersion: apps/v1 kind: Deployment metadata: name: test-app spec: replicas: 1 selector: matchLabels: app: test-app template: metadata: labels: app: test-app spec: containers: - name: test-app image: msgsdeployregistry.azurecr.io/myimage:latest ports: - containerPort: 3000
最后,您可以从 VS Code 提交并推送这些文件。
就是这样!您可以打开 GitHub Actions 页面并选择主工作流,实时查看镜像自动构建并部署到您的 AKS 集群。
部署完成后,您可以打开 Web 浏览器访问集群负载均衡器的外部 IP 地址来玩托管在云上的游戏。
要获取 IP 地址,请运行此命令
kubectl get service test-app --watch
下一步是什么?
做得好!您现在能够编辑您的游戏服务器代码,并通过简单的推送操作到您的 GitHub 存储库来自动部署它。对于更复杂的项目,您可以更新工作流,使其仅在对 main 分支的更改时部署,甚至连接到 GitHub Webhook 以向消息应用程序发送通知。
在本系列的最后一部分,我们将探讨 如何使用 PlayFab 为我们的游戏添加事件和收集数据 以用于 LiveOps 和分析。
可选:清理
如果您在此演示后已完成,并且想在此处停止,可以使用以下命令删除 Azure 上的资源,以避免任何意外的服务器成本
az group delete --name {YOUR-RESOURCE-GROUP} --yes --no-wait