refactor(infra): 重构为 no-push 本地构建部署模式
- 删除 6 个分散 workflow(ci-ts/ci-go/ci-proto/ci-py/docker/deploy) - 合并为单个 ci.yml:3 个 quality job 并行 + deploy job 串行 - 全部使用官方镜像(node:22-alpine/golang:1.22-alpine/bufbuild/buf/docker:25-git) - deploy job 用 DooD 模式挂载 /var/run/docker.sock - docker-compose.deploy.yml 改用 build: 替代 image:(no-push) - 新增 docker-compose.tools.yml 一次性预拉所有 CI 镜像 - 支持 workflow_dispatch 指定 commit_sha 回滚 - 更新 project_rules §15 与 cicd-runbook.md 为 no-push 模式 - 新增设计文档 docs/superpowers/specs/2026-07-08-cicd-no-push-local-build-design.md
This commit is contained in:
@@ -1,23 +1,27 @@
|
||||
# 服务器部署用 Docker Compose
|
||||
# 镜像来源:Gitea Container Registry (git.eazygame.cn/xiner/edu/<service>:<tag>)
|
||||
# 服务器部署用 Docker Compose(no-push 本地构建模式)
|
||||
# 镜像来源:CI 容器内本地 docker build(不推送到 registry)
|
||||
# 基础设施:MySQL + Redis 已在服务器 Docker 中运行(不在此文件管理)
|
||||
#
|
||||
# 部署目录:/opt/edu/
|
||||
# 部署命令(CI 自动执行):
|
||||
# IMAGE_TAG=latest docker compose pull && docker compose up -d
|
||||
# docker compose up -d --build --remove-orphans
|
||||
#
|
||||
# 首次部署手动步骤:
|
||||
# 1. sudo mkdir -p /opt/edu && sudo chown -R $USER:$USER /opt/edu
|
||||
# 2. cp infra/docker-compose.deploy.yml /opt/edu/docker-compose.yml
|
||||
# 3. cp infra/deploy.env.example /opt/edu/.env && 编辑填入生产密钥
|
||||
# 4. docker login git.eazygame.cn -u <user> -p <token>
|
||||
# 5. cd /opt/edu && IMAGE_TAG=latest docker compose up -d
|
||||
# 4. docker compose up -d --build
|
||||
#
|
||||
# 注意:compose 文件中的 build.context 路径相对于 /opt/edu/ 目录
|
||||
# CI 在 deploy 步骤会先把仓库 checkout 到 /opt/edu/repo/,再 cp compose 文件到 /opt/edu/
|
||||
|
||||
name: edu
|
||||
|
||||
services:
|
||||
api-gateway:
|
||||
image: git.eazygame.cn/xiner/edu/api-gateway:${IMAGE_TAG:-latest}
|
||||
build:
|
||||
context: ./repo/services/api-gateway
|
||||
dockerfile: Dockerfile
|
||||
container_name: edu-api-gateway
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
@@ -48,7 +52,9 @@ services:
|
||||
- edu-shared
|
||||
|
||||
classes:
|
||||
image: git.eazygame.cn/xiner/edu/classes:${IMAGE_TAG:-latest}
|
||||
build:
|
||||
context: ./repo
|
||||
dockerfile: services/classes/Dockerfile
|
||||
container_name: edu-classes
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
@@ -70,7 +76,9 @@ services:
|
||||
- edu-shared
|
||||
|
||||
teacher-portal:
|
||||
image: git.eazygame.cn/xiner/edu/teacher-portal:${IMAGE_TAG:-latest}
|
||||
build:
|
||||
context: ./repo
|
||||
dockerfile: apps/teacher-portal/Dockerfile
|
||||
container_name: edu-teacher-portal
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
|
||||
55
infra/docker-compose.tools.yml
Normal file
55
infra/docker-compose.tools.yml
Normal file
@@ -0,0 +1,55 @@
|
||||
# CI/CD 工具镜像预拉(一次性拉取所有 CI 与构建需要的镜像到本地)
|
||||
# 用途:actrunner 的 container job 会优先使用本地镜像缓存,避免每次 CI 联网拉取
|
||||
#
|
||||
# 用法:
|
||||
# docker compose -f infra/docker-compose.tools.yml pull
|
||||
#
|
||||
# 拉取后可用 docker images 查看所有 edu 相关镜像
|
||||
# 这不是常驻服务,只是借用 compose 的批量 pull 能力
|
||||
|
||||
name: edu-tools
|
||||
|
||||
services:
|
||||
# ===== CI 运行时镜像(actrunner container job 使用)=====
|
||||
node-ci:
|
||||
image: node:22-alpine
|
||||
command: ["echo", "node-ci image pulled"]
|
||||
|
||||
golang-ci:
|
||||
image: golang:1.22-alpine
|
||||
command: ["echo", "golang-ci image pulled"]
|
||||
|
||||
buf-ci:
|
||||
image: bufbuild/buf:latest
|
||||
command: ["echo", "buf-ci image pulled"]
|
||||
|
||||
docker-ci:
|
||||
image: docker:25-git
|
||||
command: ["echo", "docker-ci image pulled"]
|
||||
|
||||
# ===== 服务构建基础镜像(Dockerfile FROM)=====
|
||||
# teacher-portal / classes 的 builder 阶段
|
||||
node-builder:
|
||||
image: node:20-alpine
|
||||
command: ["echo", "node-builder image pulled"]
|
||||
|
||||
# api-gateway 的 builder 阶段
|
||||
golang-builder:
|
||||
image: golang:1.22-alpine
|
||||
command: ["echo", "golang-builder image pulled"]
|
||||
|
||||
# api-gateway 的 runner 阶段
|
||||
alpine-runner:
|
||||
image: alpine:3.20
|
||||
command: ["echo", "alpine-runner image pulled"]
|
||||
|
||||
# ===== 开发/测试基础设施(生产用已有的,不在此管理)=====
|
||||
# 服务器已有的 MySQL/Redis 不在此拉取
|
||||
# 仅用于本地开发测试环境(docker-compose.dev.yml,如有)
|
||||
mysql-dev:
|
||||
image: mysql:8.0
|
||||
command: ["echo", "mysql-dev image pulled"]
|
||||
|
||||
redis-dev:
|
||||
image: redis:7-alpine
|
||||
command: ["echo", "redis-dev image pulled"]
|
||||
Reference in New Issue
Block a user