Skip to content

CI/CD 与生产部署

Phase 08 — Deployment · 知识点 09–10:CI/CD · Production Deployment


1. 学习目标

完成本知识点后,你应该能够:

  • 理解 CI/CD 流水线:检查 → 测试 → 构建 → 部署
  • 使用 GitHub Actions 实现 Go 项目自动测试与 Linux 二进制构建
  • 设计 Production Deployment 流程:版本追踪、回滚、密钥管理
  • 编写生产运行手册(Runbook),使他人可独立部署 Project 03
  • 完成数字孪生后端从代码到上线的完整闭环
  • 明确本路线部署边界(不含 Kubernetes)

2. 为什么需要

手动 scp 二进制容易出错、不可追溯、难以回滚。CI/CD 在每次 push 时自动跑 go testgo vet,构建可复现产物,部署脚本标准化——这是团队交付与生产稳定的基础。

Production Deployment 不仅是「把服务跑起来」,还包括监控、日志、备份、回滚、密钥轮换——Project 03 验收要求公网 HTTPS/WSS、进程恢复、版本可追踪。


3. 核心概念

3.1 CI/CD

阶段典型任务
CI(持续集成)lint、test、vet、race、build 镜像
CD(持续部署)SSH 部署、Compose pull、systemd restart
触发push main、tag v*、manual workflow

3.2 Production Deployment 要素

要素说明
版本追踪Git tag、镜像 tag v1.2.3
配置外置环境变量 / secrets,不进仓库
健康检查/health、systemd、Compose healthcheck
回滚保留上一版二进制或镜像,一键切换
日志journalctl / 集中日志,含 requestId、deviceId
备份PostgreSQL 定期备份
Runbook部署、重启、排障步骤文档

3.3 部署架构(本路线)

GitHub → Actions (test/build) → Artifact / Registry

                              SSH → Linux server
                              systemd + Nginx + Docker(DB)

不包含:Kubernetes、Helm、Service Mesh。


4. 基础语法

4.1 GitHub Actions 示例

.github/workflows/ci.yml

yaml
name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-go@v5
        with:
          go-version: '1.22'
      - name: Vet
        run: go vet ./...
      - name: Test
        run: go test -race ./...
      - name: Build
        run: CGO_ENABLED=0 go build -o server ./cmd/server

4.2 部署 Workflow(简化 SSH)

yaml
name: Deploy

on:
  push:
    tags: ['v*']

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-go@v5
        with:
          go-version: '1.22'
      - run: CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o server ./cmd/server
      - name: Upload to server
        env:
          SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }}
          HOST: ${{ secrets.DEPLOY_HOST }}
        run: |
          echo "$SSH_KEY" > key && chmod 600 key
          scp -i key -o StrictHostKeyChecking=no server deploy@$HOST:/opt/twin-server/bin/server.new
          ssh -i key deploy@$HOST 'sudo systemctl stop twin-server && mv /opt/twin-server/bin/server.new /opt/twin-server/bin/server && sudo systemctl start twin-server'

4.3 版本与回滚

bash
# 部署前备份
cp /opt/twin-server/bin/server /opt/twin-server/bin/server.bak

# 回滚
sudo systemctl stop twin-server
mv /opt/twin-server/bin/server.bak /opt/twin-server/bin/server
sudo systemctl start twin-server

4.4 Runbook 大纲

markdown
# Digital Twin Server 运行手册

## 前置条件
- Ubuntu 22.04、Docker、Nginx、域名 DNS

## 首次部署
1. 创建 deploy 用户
2. 安装 PostgreSQL/Redis(Docker Compose)
3. 配置 systemd + Nginx + certbot
4. 注入 secrets 到 /etc/twin-server/env

## 日常运维
- 查看状态:systemctl status twin-server
- 日志:journalctl -u twin-server -f
- 重启:sudo systemctl restart twin-server

## 回滚
...

## 故障排查
- WSS 失败 → 检查 Nginx Upgrade 头
- 502 → Go 进程是否运行

5. 代码解析

go test -race:CI 必跑,防止 WebSocket Hub 竞态上线。

Tag 触发部署:仅 v* tag 部署生产,避免每次 push 自动上线。

server.new + 原子替换:减少部署中途二进制不完整风险。

SecretsDEPLOY_SSH_KEYDATABASE_URL 存 GitHub Secrets,不写进 YAML 明文。


6. JavaScript / TypeScript 对比

概念前端 CIGo 后端 CI
检查ESLintgo vet
测试Vitestgo test
构建vite buildgo build / docker build
部署Vercel / OSSSSH + systemd
环境静态托管服务器进程

Monorepo 时可并行 frontend + backend jobs。


7. 常见错误

错误 1:Secrets 提交到 Git

立即轮换密钥,用 git filter-repo 清理历史(慎用)。

错误 2:CI 不跑 race / 集成测试

生产偶发 panic 难以定位。

错误 3:无回滚预案

新版本故障时 downtime 延长。

错误 4:部署不迁移数据库

schema 变更需 migration 步骤纳入 Runbook。

错误 5:过度自动化

未通过 CI 的 tag 也部署——应加 manual approval 或环境保护规则。


8. 实际应用

Project 03 Phase 08 验收

标准
公网访问HTTPS + WSS 正常
进程恢复kill 后 systemd 自动重启
版本镜像或二进制可对应 Git tag
密钥不在仓库
Runbook他人可按文档独立部署
CIpush PR 跑 test+vet

数字孪生端到端

Git push tag v1.0.0
  → Actions build & deploy
  → Go server 重启
  → Three.js 连接 wss://api.example.com/ws
  → AGV 实时动画

9. 深入理解

9.1 Blue-Green / Canary

本路线不要求,了解概念即可:两版并存、逐步切流量。

9.2 数据库迁移

使用 golang-migrate 或 goose,部署脚本中 migrate up 在 restart 前执行。

9.3 监控告警

最小方案:Uptime 检查 /health + 磁盘空间 cron;进阶 Prometheus/Grafana 不在本路线范围。


10. 练习

详细练习见 exercises/phase-08-deployment/03-cicd-production.md

Level 1 — 基础

练习 1.1:创建 GitHub Actions CI:vet + test + build。

练习 1.2:编写 Runbook 初稿(首次部署章节)。

Level 2 — 应用

练习 2.1:tag 触发构建 Linux 二进制 artifact。

练习 2.2:模拟回滚:备份与恢复二进制步骤。

Level 3 — 综合

练习 3.1:SSH 部署脚本(可手动执行,不必真实 secrets)。

练习 3.2:Runbook 故障排查:WSS 502 案例。

Level 4 — 项目实践

练习 4.1:Project 03 完整上线 — CI/CD + HTTPS/WSS + Runbook + Three.js 联调演示。


11. 学习检查

  1. CI 与 CD 分别解决什么问题?
  2. 为什么生产部署用 tag 而非每次 push?
  3. 回滚至少需要保留什么?
  4. Runbook 应包含哪些章节?
  5. 本路线 deliberately 不包含哪些部署技术?

12. 下一步

已完成下一知识点关系
CI/CD · Production Deployment路线完成 — 进阶自选数字孪生后端上线

恭喜完成 Phase 01–08 全部路线。Project 03 数字孪生 Server 应具备 REST + WebSocket + Docker + 生产部署能力。

可选进阶(路线外):Kubernetes、Prometheus、Kafka、微服务拆分——待你巩固当前成果后再探索。

建议回顾 progress.md,标记 Phase 06–08 各知识点掌握程度,并归档 Runbook 与部署脚本到项目仓库的 docs/operations/(若你自行维护)。


学习导航

上一篇:Nginx、HTTPS 与 DNS · 对应练习