[T.3] 团队项目:团队基础设施及 DevOps 准备

类目详情内容
所属课程 2026年春季软件工程
作业要求 [T.4] 团队项目:选题和需求分析
课程目标 经过两轮迭代完成一次完整的软件开发流程
作业价值 深度拆解选题,明确核心需求与开发路径

[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

工作流流程

  1. 拉取代码
  2. 设置 Node 版本
  3. 安装依赖
  4. 构建项目
  5. 打包 dist
  6. 注入 SSH 密钥
  7. 上传服务器
  8. 解压到 release
  9. 切换 current
  10. 健康检查
  11. 失败回滚
  12. 清理旧版本

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 自动部署
  • 成功后切换到对应版本
  • 已验证流程可用
  • 网站可正常访问
posted @ 2026-04-15 15:09  BitAction  阅读(9)  评论(0)    收藏  举报