Skip to content

Release 流水线产出容器镜像并推送 registry.237575.xyz #72

Description

@RiriAgent

必须先读的关联 issue

Umbrella: mouriya-s-lab/homelab-tf#401。继承契约(逐字快照):

§1 GitOps-first:凡技术上可走 Komodo git-source ResourceSync 的 stack 必须走 ResourceSync;komodo-stacks 的 ansible file_contents 推送是被收敛的遗留机制,不再新增使用者。

分工:本 issue 只管"release → 镜像进 registry";stack 侧消费(compose 换镜像、poll 自动部署)归 homelab-tf 的 hapi 迁移 child(umbrella 范围区 B3)。

目标

每个 fork release 自动产出容器镜像并推送 registry.237575.xyz,无人工步骤。

使用场景

维护者给 fork 打 tag 发 release 后不做任何别的事;homelab 侧(B3 落地后)由 auto_update 自动运行新版本。

上下文

  • Repo: mouriya-s-lab/hapi(fork;官方发 npm @twsxtd/hapi,fork 不发 npm、发 GitHub Release 单可执行文件,如 hapi-linux-x64-baseline.tar.gz——homelab-tf#290 与其实施 comment)。
  • 现有 Release workflow 已产全平台二进制(homelab-tf#290:"Release workflow 产全平台单可执行文件并挂 GitHub Release");本 issue 在其后追加/并行镜像 job。
  • 生产在用版本 v0.20.2-fork.2,由 homelab-tf komodo 模板硬编码消费(komodo/roles/komodo-stacks/templates/hapi/compose.yaml.j2,注释 "Upgrade both via a separate PR"——这就是被消灭的人工步骤)。
  • registry push 的已验证模板:runner-canarypublish.ymlmoat-browserdeploy.yml——GARM runner label [self-hosted, linux, vctcn](需 netbird 时加 netbird),keycloak-token-action 换 token 后 docker login registry.237575.xyz
  • GARM:mouriya-s-lab/hapi 需注册 GARM pool(garm-cli on VM 181,runtime state;注册后更新 pve-vctcn/apps/runner/README.md 的清单 pointer)。
  • 运行形态:hub 单二进制,容器内 hapi hub --no-relay,监听 3006(现行 compose 同款行为)。
  • 实施前自行核对上述 workflow / 模板的现行内容。

已裁决的目标级决策

  • 双 tag 发布:不可变 tag vX.Y.Z-fork.N + channel tag stable,两者同 digest。B3 的 compose pin stable,Komodo auto_update = true 检测 channel tag digest 变化并自动 redeploy(upstream client/core/rs/src/entities/stack.rs 字段注释:"Whether to automatically redeploy when newer images are found. Will implicitly enable poll_for_updates";注意单开 poll_for_updates 只产生更新提示不触发 redeploy)。自动重部署机制在 homelab 尚无在产实例,由 B3 首验。不可变 tag 供回滚与审计。
  • 不采用 CI 直调 DeployStack(moat-browser 形态):那会要求本 repo CI 持有 homelab Komodo API key;auto_update 形态把部署权限留在 Core 拉取侧,hapi repo 的信任面只到 registry。若 B3 验证 auto_update 对私有 registry 不可行,fallback 即切 moat-browser 形态(CI 追加 UpdateStack + DeployStack job)——双 tag 发布在两种形态下都需要,本 issue 不被该未知阻塞。

问题

fork 只发二进制 tarball,没有镜像 artifact;homelab 消费端只能用 buildpack-deps 基础镜像在容器启动时 curl 下载(运行时装配),版本升级被迫走"改模板 tag+sha → submodule PR → parent bump → make hapi"的三步人工链。

"hapi现在非常愚蠢的每次都是手动更新" — 操作员方向(2026-07-06)

预期结果

性质表述:release 事件之后,registry.237575.xyz/hapi/hub:stable 的 digest 在无人工介入下等于该 release 内容构建出的镜像;镜像自包含(运行不再下载任何 artifact),入口行为与现行 hapi hub --no-relay 等价。

不应残留

  • 范围内:无(本 repo 只增一个 workflow job + Dockerfile;不删现有二进制 release 产物——其他消费者可能在用)。
  • 范围外不得改动:homelab-tf / homelab-komodo 的任何文件(stack 侧是 B3);registry 服务端配置(pve-vctcn/apps/registry 冻结,仅按既有 keycloak client 流程拿 push 权限)。

约束

  • registry 凭据走既有 keycloak-token-action 流程,不在 repo secrets 存长期 registry 密码。
  • 镜像必须 self-contained:禁止入口脚本在运行时从 GitHub 下载二进制(那只是把现状搬进镜像)。
  • Dockerfile 基底 / 分层属实现细节(b 类),留 PR;但镜像内必须可跑 hapi hub --no-relay 且监听 3006。

验收标准

Dimension Check Command Env Expect
function release 触发全自动 发一个测试 release,观察 workflow GitHub workflow 由 release 事件触发并 green,无手动输入
function 双 tag 同 digest docker buildx imagetools inspect registry.237575.xyz/hapi/hub:{stable,vX.Y.Z-fork.N} mesh 内主机 两 tag digest 相同
integration 镜像可拉可跑 mesh 内主机 docker run --rm -p 3006:3006 …:stablecurl -sI localhost:3006 mesh 内主机 容器起动无下载动作,端口应答
assumption GARM pool 生效 workflow job 落在 [self-hosted, linux, vctcn] runner GitHub job 由 GARM runner 执行(run log 可见 runner 名)

依赖关系

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions