Skip to content

Add GitHub CD pipeline: GHCR build + VPS deploy on release #132

@Besthope-Official

Description

@Besthope-Official

Use Case

项目目前只有 CI(lint + test)和 Release(自动打 tag),没有 CD 流程。部署依赖手动 just compose-deploy 本地构建。需要自动化:release 发布后自动构建镜像、推送到 GHCR、部署到 VPS。

Proposed Solution

Release tag 触发 CD workflow,分两个 job:

  1. build-and-push: 构建 Docker 镜像,推送到 ghcr.io/singularitylab-swufe/fastapi-template-agent,tag 为 semver + latest
  2. deploy: SSH 到 VPS,git pull --ff-only 同步 compose 文件,从 GitHub Secrets 生成 .envdocker compose pull app && up -d app

文件变更:

  • docker/docker-compose.yml — 删 build: 块,image: 改为 GHCR 地址
  • .github/workflows/cd.yml — 新建 CD workflow
  • justfilecompose-deploy 改 pull 模式,新增 compose-dev

.env 管理:ENV_CONFIG secret 存非敏感配置块,敏感值(DB_PASSWORD、JWT_SECRET 等)逐个 secret 存储,deploy 时拼接生成。便于后续迁移 K8s ConfigMap/Secret。

Alternatives Considered

  • GitLab CI/CD:需要自部署 runner 配置,复杂度高,暂不考虑
  • 合入 main 即触发(而非 release):镜像 tag 无法对应 semver,回滚不清晰
  • .env 整块存为单个 secret:迁移 K8s 时需要拆分,不如一开始就分离
  • Docker Swarm / K8s:当前单机 VPS 场景过重

Implementation Notes

  • 依赖 GitHub Secrets:VPS_HOST, VPS_USER, VPS_SSH_KEY, VPS_DEPLOY_PATH, ENV_CONFIG, DB_PASSWORD, JWT_SECRET, CACHE_PASSWORD, OAUTH_GOOGLE_SECRET, OAUTH_GITHUB_SECRET
  • VPS 前置:Docker + Compose 已装,仓库已 clone,SSH key 已授权,用户在 docker 组
  • GHCR package 建议设为 public,省去 VPS 端 docker login
  • docker-compose.dev.yml 无需改动,已有 build:
  • deploy job 设 environment: production 支持 GitHub 环境保护规则
  • concurrency: cancel-in-progress: false 避免取消进行中的部署

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions