48 lines
4.9 KiB
Markdown
48 lines
4.9 KiB
Markdown
# Demo
|
||
|
||
最小 Go HTTP 服务,源码入口 `src/`,项目根为 Git 仓库边界。公开源码仓库为 `https://git.dever.cc/shemic/demo`,仅使用 Go 标准库。
|
||
|
||
## 开发与正式运行
|
||
|
||
| 环境 | 常驻容器 | 端口 | 域名 | 运行方式 |
|
||
| --- | --- | --- | --- | --- |
|
||
| 开发 | `platform-dev/dev` | 18080 | `demo-test.5dev.cn` | Supervisor 管理 `go run .` |
|
||
| 正式 | `platform-release/release` | 28080 | `demo.5dev.cn` | Supervisor 管理已发布的二进制 |
|
||
|
||
两个环境都按项目共享容器,不再为 Demo 单独保留运行 Deployment。正式端口等于开发端口加 10000;开发范围 18000–18999,正式范围 28000–28999。Service 仍归项目自身;`config/prod/` 选择共享 release 并转发到 28080。开发与正式域名、路由在 Higress Console 管理,应用配置不再带 Ingress YAML。
|
||
|
||
`GET /` 返回 `hello world` 和换行;未知路径 404,不支持的方法 405,`HEAD /` 无响应体。程序从 `PORT` 读取监听端口。入口不叠加平台登录,鉴权由项目自行实现。
|
||
|
||
## 日常操作
|
||
|
||
```bash
|
||
kubectl exec -n platform-dev deployment/dev -c dev -- sh -c 'cd /dm/service/project/demo/src && go fmt ./... && go test ./... && go vet ./...'
|
||
kubectl exec -n platform-dev deployment/dev -c dev -- supervisorctl -c /etc/supervisor/supervisord.conf restart demo
|
||
kubectl exec -n platform-release deployment/release -c release -- supervisorctl -c /etc/supervisor/supervisord.conf status demo
|
||
```
|
||
|
||
正常发布通过 Actions,而不是手动复制开发目录中的可执行文件。需要运维重启时,将最后一条命令的 `status demo` 改为 `restart demo`,只重启该项目,不重建整个 release Pod。日志为相应容器内的 `/work/log/demo.log`。
|
||
|
||
## CI/CD
|
||
|
||
- `.gitea/workflows/ci.yaml`:推送 main 或手动触发,固定提交清洁检出,运行格式检查、`go test`、`go vet` 和编译;不发布生产。
|
||
- `.gitea/workflows/release.yaml`:手动选择 Git ref 和 `operation=release`,构建版本化二进制,不再为项目推送运行镜像。
|
||
- `config/prod/release.json` 不再保存域名,仅保留项目、端口和预期健康响应。历史记录的 `host` 不重写,读取时忽略。公网域名在网关后台管理;独立验收使用 `python3 service/infra/higress/scripts/state.py check-route demo --project-config service/project/demo/config/prod/release.json`,不由公网结果决定业务回滚。
|
||
- 发布配置在 `config/prod/release.json`,流水线校验项目名、开发/正式端口对应关系与当前开发配置,并拒绝与其他已发布项目冲突的正式端口。
|
||
- 候选二进制先在临时 Job 中使用实际 release 基础镜像运行并验证 HTTP,再原子切换该项目的 `current`,仅重启其 Supervisor 进程,验证正式进程的内部 HTTP;公网检查独立执行。
|
||
- `operation=rollback` 配合 `target_revision=<完整40位提交>`,只能回退到曾通过验证的二进制版本。复用校验过的产物,不重新编译。失败发布会尝试恢复之前的项目版本,并保留失败记录。
|
||
- 二进制归档为 `/dm/service/platform/release/artifacts/demo/<commit>/app`、`app.sha256`、`release.json`;正式运行副本为 `/dm/runtime/platform/release/programs/demo/versions/<commit>/`,`current` 指向选定版本。它们不进入源码 Git。
|
||
- 2026-10-09 切换前的旧项目镜像仍保留在 `images/`,仅用于历史恢复。新流水线的回退目标是新二进制发行,不把旧镜像记录冒充新发行。
|
||
|
||
项目已有的 package-write Actions Secret 不再被工作流引用;当前构建和发布不需要镜像仓库写凭据。平台基础镜像只在工具链或运行环境变化时重建,并固定 digest。
|
||
|
||
## 边界
|
||
|
||
复用 `platform-ci/runner`,标签为 `go-build`、`release-deploy`。Runner 注册到可信的 `shemic` 组织,并发为 1;不为新项目常驻新的 Runner。不要给不可信贡献者工作流修改或生产发布权限,不启用外部 fork/PR 自动执行。
|
||
|
||
构建 Pod 不挂 Kubernetes 令牌和正式运行目录;部署 Pod 可以写共享程序目录并 exec 到共享 release,因此是可信平台发布权限,而不是项目间安全隔离。release 不挂源码、开发缓存、集群令牌或宿主机 socket,程序目录只读;整个 release Pod 重启影响其中所有项目。
|
||
|
||
新增项目只需自己的源码、工作流、端口/健康检查配置及 Service,不增加项目运行 Deployment;域名与路由在网关后台创建。首次新增入口仍需经过平台授权部署,发布流水线本身不修改集群入口。
|
||
|
||
2026-10-09 已实测共享运行方案:Actions #8 的 CI 与 #9 的首次二进制发布均通过,正式域名在原独立 Demo Pod 停止后仍返回 `hello world`;运行程序位于共享 release 的 28080 端口,dev 保持原样。各次后续发布与回退结果以 Actions 和对应发行记录为准。
|