Files
2026-10-10 02:24:50 +00:00

4.9 KiB
Raw Permalink Blame History

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 读取监听端口。入口不叠加平台登录,鉴权由项目自行实现。

日常操作

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 和对应发行记录为准。