[T.3] 团队项目:团队基础设施及 DevOps 准备
[T.3] 团队项目:团队基础设施及 DevOps 准备
我们的项目是一款支持 2~4 人游玩的轻量化多人派对游戏。当前阶段,除了推进玩法和美术内容,我们也把服务器、团队协作工具和自动部署流程先搭了起来,方便后续开发、联调和测试。
这篇文章主要记录三部分内容:服务器选择、团队沟通与协作方式,以及目前已经跑通的 CI/CD 流程。
一、服务器
我们给项目配了一台 火山引擎云服务器 ECS。现在用来部署官网,后面也会用于联机服务和测试。
当前部署方式
前期先用一台服务器把官网、部署流程和后续服务环境搭起来,后面如果需求变大,再拆服务。
服务器配置
| 维度 | 选择 | 说明 |
|---|---|---|
| 厂商 | 火山引擎 ECS 云服务器 | - |
| 地域 | 华北 2(北京) | - |
| 计费方式 | 包年包月 | - |
| 实例规格 | ecs.ec1m1.xlarge | 经济型 e |
| CPU | 4 vCPU | 官网和后续服务一起跑 |
| 内存 | 4 GiB | 当前部署和测试使用 |
| 公网带宽 | 1 Mbps | 当前配置 |
| 系统盘 | 40 GiB SSD | 极速型 |
| 操作系统 | Ubuntu 24.04 64-bit | - |
这套配置是按当前阶段需求来配的:官网是静态站,后续还会接入 Go + Nakama 服务端测试。
当前用途
这台服务器目前用于:
- 部署游戏官网静态页面
- GitHub Actions 自动部署目标机器
- 提供 nginx 静态资源服务
- 预留 Go + Nakama 服务端环境
- 团队联机测试和服务端调试
二、团队沟通、协作与代码管理
1. 团队沟通
- 日常沟通:微信
- 会议讨论:腾讯会议
- 周会:线下研讨室
内容包括进度同步、方案讨论和问题排查。
2. 团队协作
使用 飞书:
- 文档:需求、会议纪要、设计、部署记录等
- 任务:阶段目标、分工、负责人、进度
每周会后更新任务状态。
3. 代码管理
使用 GitHub Organization:
- 分支开发 → 合并主分支
- 管理 Pull Request / Issue / Actions
- CI/CD 与代码管理统一平台
三、CI/CD
使用:
- GitHub Actions
- GitHub Environments
- SSH 部署
CI/CD 配置
- 触发:push 到 main / 手动触发
- 环境:ubuntu-latest
- Node:来自
.nvmrc(>=22.12.0) - 构建:
npm ci + npm run build - 部署内容:
dist/(静态构建产物)
路径:
- 发布目录:
/var/www/bitaction/releases/<commit-sha> - 当前版本:
/var/www/bitaction/current
工作流流程
- 拉取代码
- 设置 Node 版本
- 安装依赖
- 构建项目
- 打包 dist
- 注入 SSH 密钥
- 上传服务器
- 解压到 release
- 切换 current
- 健康检查
- 失败回滚
- 清理旧版本
GitHub Secrets
- DEPLOY_HOST
- DEPLOY_PORT
- DEPLOY_USER
- DEPLOY_SSH_KEY
- DEPLOY_KNOWN_HOSTS
使用 deploy 用户(非 root)
GitHub Actions 工作流
name: Deploy
on:
push:
branches:
- main
workflow_dispatch:
concurrency:
group: production-deploy
cancel-in-progress: true
permissions:
contents: read
jobs:
deploy:
name: Build and deploy
runs-on: ubuntu-latest
environment: production
steps:
- name: Checkout source
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version-file: .nvmrc
cache: npm
cache-dependency-path: package-lock.json
- name: Install dependencies
run: npm ci
- name: Build site
run: npm run build
- name: Prepare release archive
run: tar -czf site.tar.gz -C dist .
- name: Configure SSH
env:
DEPLOY_SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }}
DEPLOY_KNOWN_HOSTS: ${{ secrets.DEPLOY_KNOWN_HOSTS }}
run: |
set -euo pipefail
install -m 700 -d ~/.ssh
printf '%s\n' "$DEPLOY_SSH_KEY" > ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
printf '%s\n' "$DEPLOY_KNOWN_HOSTS" > ~/.ssh/known_hosts
chmod 644 ~/.ssh/known_hosts
- name: Upload release
env:
DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
DEPLOY_PORT: ${{ secrets.DEPLOY_PORT }}
DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
run: |
set -euo pipefail
release_id="$GITHUB_SHA"
ssh -p "$DEPLOY_PORT" "$DEPLOY_USER@$DEPLOY_HOST" "install -d -m 755 /var/www/bitaction/incoming"
scp -P "$DEPLOY_PORT" site.tar.gz "$DEPLOY_USER@$DEPLOY_HOST:/var/www/bitaction/incoming/$release_id.tar.gz"
- name: Activate release
env:
DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
DEPLOY_PORT: ${{ secrets.DEPLOY_PORT }}
DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
run: |
set -euo pipefail
ssh -p "$DEPLOY_PORT" "$DEPLOY_USER@$DEPLOY_HOST" "RELEASE_ID='$GITHUB_SHA' APP_ROOT='/var/www/bitaction' bash -s" <<'EOF'
set -euo pipefail
incoming_dir="$APP_ROOT/incoming"
releases_dir="$APP_ROOT/releases"
release_dir="$releases_dir/$RELEASE_ID"
archive="$incoming_dir/$RELEASE_ID.tar.gz"
previous_target="$(readlink -f "$APP_ROOT/current" 2>/dev/null || true)"
install -d -m 755 "$incoming_dir" "$releases_dir"
rm -rf "$release_dir"
install -d -m 755 "$release_dir"
tar -xzf "$archive" -C "$release_dir"
test -f "$release_dir/index.html"
ln -sfn "$release_dir" "$APP_ROOT/current.next"
mv -Tf "$APP_ROOT/current.next" "$APP_ROOT/current"
rm -f "$archive"
if ! curl -fsS http://localhost/ | grep -q '<!DOCTYPE html>'; then
if [ -n "$previous_target" ] && [ -d "$previous_target" ]; then
ln -sfn "$previous_target" "$APP_ROOT/current.next"
mv -Tf "$APP_ROOT/current.next" "$APP_ROOT/current"
fi
exit 1
fi
find "$releases_dir" -mindepth 1 -maxdepth 1 -type d -printf '%T@ %p\n' \
| sort -nr \
| awk 'NR > 5 {print $2}' \
| xargs -r rm -rf
EOF
运行结果
- push 到 main 自动部署
- 成功后切换到对应版本
- 已验证流程可用
- 网站可正常访问

浙公网安备 33010602011771号