Files
goodBaby/docs/release.md
T
meiandClaude Fable 5 ce01604f13 ci: 新增发版流水线,构建产物上传 Release 并推送镜像到 ghcr
推送 v 开头的 tag 时自动执行:
- frontend: 前端只构建一次(含 vue-tsc 类型检查),产物由各平台共用,
  保证所有二进制内嵌的前端完全一致
- build: 交叉编译 linux/windows/darwin 的 amd64 与 arm64 共 5 个目标,
  打包时附带 README/LICENSE/docs
- release: 汇总产物、生成 checksums.txt、创建 Release(自动生成发布说明)
- docker: buildx 构建 amd64+arm64 镜像推送 ghcr,标签按 semver 展开

Dockerfile 改为交叉编译友好:前端与后端构建阶段固定在 BUILDPLATFORM,
用 TARGETARCH 做 Go 交叉编译,避免构建 arm64 镜像时 npm 与 go build
被丢进 QEMU 执行。同时补上 -trimpath。

只使用内置 GITHUB_TOKEN,无需额外 secret。

文档: 新增 docs/release.md,README 补充镜像拉取与二进制下载说明,
docker-compose 默认镜像改为 ghcr。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-27 07:38:44 +08:00

72 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 发版流程
发版由 [`.github/workflows/release.yml`](../.github/workflows/release.yml) 全自动完成,
触发条件是推送一个 `v` 开头的 tag。
## 发一个版本
```bash
git tag v2.2.0
git push origin v2.2.0
```
推上去之后 workflow 会依次做四件事:
| 阶段 | 内容 |
| --- | --- |
| `frontend` | 跑一次 `npm ci && npm run build`(含 `vue-tsc` 类型检查),产物作为 artifact 共享 |
| `build` | 5 个平台交叉编译,打包成 tar.gz / zip |
| `release` | 汇总产物、生成 `checksums.txt`、创建 GitHub Release(发布说明自动生成) |
| `docker` | buildx 构建 `linux/amd64` + `linux/arm64` 镜像推送到 ghcr |
前端只构建一次,所有平台的二进制共用同一份产物,保证各平台内嵌的前端完全一致。
## 产物
二进制覆盖:
* `linux/amd64`、`linux/arm64`
* `windows/amd64`
* `darwin/amd64`、`darwin/arm64`
每个压缩包内含可执行文件、`README.md`、`LICENSE` 与 `docs/`。
镜像标签由 tag 推导:`v2.2.0` 会产出 `2.2.0`、`2.2`、`2` 与 `latest`。
## 版本信息注入
编译时通过 ldflags 注入,启动日志里能看到:
```
goodBaby v2.2.0 (a1b2c3d, 2026-07-27T07:00:00Z) 启动中...
```
对应 `main.go` 里的 `version` / `gitCommit` / `buildDate` 三个变量。
## 关于交叉编译
项目依赖里没有 CGO——sqlite 用的是纯 Go 的 `glebarez/sqlite`——所以所有平台都能用
`CGO_ENABLED=0` 直接交叉编译,不需要各平台的 runner。
Dockerfile 里前端与后端构建阶段都标了 `--platform=$BUILDPLATFORM`,配合 `TARGETARCH`
做 Go 交叉编译,因此构建 arm64 镜像时不会把 npm 和 go build 丢进 QEMU 里跑。
## 手动验证
workflow 支持 `workflow_dispatch` 手动触发。手动跑时**不会创建 Release**(`release` job 有
`if: github.ref_type == 'tag'` 保护),只会构建产物并推一个 `sha-xxxxxxx` 标签的镜像,
适合在正式打 tag 前先验证流程。
## 权限
workflow 只用了内置的 `GITHUB_TOKEN`,不需要额外配置 secret:
```yaml
permissions:
contents: write # 创建 Release
packages: write # 推送镜像到 ghcr
```
首次推送后,包默认是私有的。如果要公开,去仓库的 Packages 页面把
`goodbaby` 这个包的可见性改成 Public。