Demo

最小 Go HTTP 服务,源码入口 src/,项目根是 Git 仓库边界;私有仓库为 https://git.dever.cc/rabin/demo。仅使用 Go 标准库,不引入业务框架。

2026-10-08(UTC)已部署到共享 dev,https://demo-test.5dev.cn 无需登录即可返回 hello world。真实 HTTP、源码同步、单服务重启、停止释放端口及 dev Pod 重建恢复均已验证;没有构建或发布业务生产镜像。

行为

  • GET / 返回 hello world 和换行,Content-Type 为 text/plain; charset=utf-8。
  • 其他路径返回 404,不支持的方法返回 405;HEAD / 使用 HTTP 标准行为。
  • 程序读取 PORT,开发配置固定为 18080,未提供时使用 8080;非法端口启动失败。
  • Supervisor 程序名为 demo,日志是 dev 内 /work/log/demo.log。

开发

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

当前没有额外测试框架,go test 的包检查不能替代真实 HTTP 请求验证。源码修改不构建镜像;普通依赖在 dev 内按兼容 Go 1.25 的固定版本添加,检查 go.mod、go.sum 的变化。

开发入口

demo-test.5dev.cn 复用现有 Caddy、Traefik 和 *.5dev.cn 证书。config/dev/ 管理 Service、Ingress;Service demo-dev:80 指向共享 dev 的 18080 端口。

平台入口不叠加统一登录,登录和鉴权由项目自行实现;后续 project 项目也遵循此约定。Demo 没有应用认证,因此可公开访问。初次部署使用的 BasicAuth Middleware、专用 Secret 和生成的凭据文件已按用户要求移除。

开发 Service 不用于生产。正式环境使用独立的 project-demo/demo Deployment,通过 demo.5dev.cn 访问;实际发布结果以 Actions 和 images/<完整提交>.json 为准。

CI/CD

  • .gitea/workflows/ci.yaml:推送到 main 后自动检查格式、执行 go test、go vet 并编译;不推镜像、不发布生产。也可手动执行检查。
  • .gitea/workflows/release.yaml:只接受手动触发。选择明确 Git 分支或标签,operation=release,流水线检出该次事件的完整 commit 后测试、构建、推送私有镜像、验证真实运行镜像,再发布生产并检查公网 HTTPS。
  • operation=rollback 时,target_revision 必须填写曾经成功发布的完整 40 位 commit。回退复用已有镜像摘要和校验过的归档,不重新编译;仍执行运行镜像与正式 HTTPS 检查。
  • 镜像为 git.dever.cc/demo-ci/demo:<完整提交>,实际 Deployment 固定 @sha256,不用 latest。二进制在隔离 BuildKit 容器里用 Go 1.25.14 编译,运行层是非 root 的 scratch 镜像,不含编译器、Supervisor 或项目源码。
  • 发布阶段失败会尝试恢复之前的 Demo 镜像和副本数,并在 Actions 中报失败,不把自动回退当作发布成功。首次发布失败恢复未启动状态。
  • images/<完整提交>.tar、.tar.sha256、.json 是正式发行归档,Git 忽略整个 images/。源码、Git、配置与归档保留;临时 CI 工作目录和验证 Job 会清理。

config/namespace.yaml 和 config/prod/ 保存生产拓扑和首次验证通过的镜像基线。当前生产镜像与副本数由发布流程管理;不要直接重套基线配置覆盖正在运行的版本。更新平台拓扑前需保留当前固定镜像摘要和副本数,审查差异后再应用;日常发布和回退使用 Actions。

Runner、工具镜像、缓存和角色配置归 /dm/service/platform/ci/。Runner 仅接受本仓库任务、并发为 1;构建 Pod 不挂 Kubernetes 令牌,部署 Pod 的生产权限仅能读取和更新本项目的 demo Deployment。只有可信仓库维护者可以修改工作流或触发发布,不接收外部 fork/PR 的自动任务。

2026-10-09 首次自动 CI 和手动发布已通过,开发与正式域名均已实际返回 hello world。后续添加依赖时,将 go.mod、go.sum 一起提交;构建的下载、测试和编译步骤复用同一模块缓存,不把缓存内容提交到 Git。

S
Description
Go HTTP Demo: shared development and manual Kubernetes production release
Readme
53 KiB
0 Stars 1 Watchers 0 Forks
Languages
Go 61.8%
Dockerfile 38.2%