Skip to content

feat: 补 CI/CD 流程与预构建镜像,修复时区/TraeWork 预热/流式截断 - #2

Merged
C3H3-AI merged 1 commit into
masterfrom
ci-cd-and-fixes
Sep 15, 2026
Merged

C3H3-AI merged 1 commit into
masterfrom
ci-cd-and-fixes

Conversation

@C3H3-AI

@C3H3-AI C3H3-AI commented Sep 15, 2026

Copy link
Copy Markdown
Owner

Description / 变更描述

补齐 CI/CD 流程(此前仓库无任何 CI),迁移到官方推荐的预构建镜像发布方式,
并修复三项已确认的功能缺陷。详细背景与验证见下方。

CI/CD(新增)

  • go-cigo build / go vet / go test 门禁。此前仓库无 CI,
    TECHNICAL-DOC.md 的审计本身是在「无 Go 工具链」下做的静态审阅,
    TestModelsDynamic 已失败多时无人发现(v1.1.0b11 起引入)。
  • build-image:用 HA 官方 builder actions(home-assistant/builder@7.2.0
    预构建 amd64/aarch64 镜像推 GHCR;config.yaml 增加 image 字段,
    Supervisor 改为直接拉镜像,不再在用户设备上编译 5 个 Go 二进制。
    末尾增加镜像可达性校验(docker manifest inspect),避免
    config.yaml version 与镜像 tag 不一致导致用户静默装不上。
  • release:读 config.yaml 的 version 做 semver 比较;
    tag 先建再发草稿 release(GitHub 对草稿不创建 tag,会导致用户收不到更新);
    末尾用 git ls-remote 校验 tag 存在,把静默失败变为显式失败。
  • pr-validate / pr-label:分支来源、标题格式、描述完整性、变更类型唯一。
  • stale / sync-labels:issue 清理与标签同步。

修复

问题 根因 影响
签到时刻偏移 Dockerfile 装了 tzdata 但未设 TZ,容器默认 UTC 配置 09:00 实际在 17:00(北京时间)触发
TraeWork 账号被永久禁用 预刷新窗口仅 10min,Trae 侧过窄;401 → ErrSessionDeadPool.Disable 请求途中 token 失效即打死账号,需人工重登
长回答被截断 流式用 Timeout: 120s 的 client,而 http.Client.Timeout 含读取响应体时间 单次输出超 120s 被中途切断
面板列出不可用模型 未过滤 is_custom_model(第三方代理需额外授权) 用户选中后必然失败

对齐上游 wild-work@abb9b0bis_custom_model 过滤。

其他

  • 移除 build.yaml:legacy builder 配置,Supervisor 2026.04.0 起不再读取,
    build_from / args.BUILD_VERSION 均为死配置且易误导。
  • 修正 TestModelsDynamic 的过期断言(改动前基线即失败,已 git stash 复现确认)。
  • PR 模板字段与 pr-validate 门禁对齐(原 ## What / ## Why 会被 CI 拒绝)。

验证

go build ./...   PASS
go vet ./...     PASS
go test ./...    PASS   (7 个包全绿)

新增 3 个单测:TestRefreshSkewPerPlatformTestFetchModelsSkipsCustomModels
TestStreamClientHasNoTotalTimeout。另本地验证了 YAML 合法性、版本解析(5 种引号变体)、
PR 校验逻辑(4 种场景)、semver 比较(5 种场景)与 tag 排序(b13 > b12 > b9 > b3)。

⚠️ build-image.yml 依赖 GitHub Actions 与 GHCR,本机无法实测
(开发机无法访问 docker.io)。逻辑已按官方 builder 7.2.0 的 action.yml
逐项核对,建议首次用 workflow_dispatch 手动触发观察。

Type of change / 变更类型

  • bugfix: Bug fix / 问题修复
  • new feature: New feature / 新功能
  • refactor: Code refactoring and optimization / 重构与优化
  • breaking: Breaking change / 破坏性变更
  • docs: Documentation / 文档更新

Testing / 测试

  • HA Version / HA版本: 2024.1.0+(addon 声明的最低版本)
  • Add-on Version / 加载项版本: 1.1.0b13
  • Test Result / 测试结果: go build / go vet / go test 全部通过;CI 逻辑本地逐项验证

Checklist / 自检清单

  • Code follows project standards / 代码符合项目规范
  • No debug code or unrelated files / 无调试代码或无关文件

CI/CD(新增):
- go-ci: go build / vet / test 门禁,此前仓库无任何 CI,
  TECHNICAL-DOC 的审计本身是在无 Go 工具链下做的静态审阅
- build-image: 用 HA 官方 builder actions 预构建 amd64/aarch64 镜像推 GHCR,
  config.yaml 增加 image 字段,Supervisor 改为直接拉镜像而非在用户设备编译
- release: 读 config.yaml version 做 semver 比较;tag 先建再发草稿 release
  (GitHub 对草稿不创建 tag,会导致用户收不到更新);
  末尾用 git ls-remote 校验 tag 存在,把静默失败变为显式失败
- pr-validate / pr-label: 分支来源、标题格式、描述完整性、变更类型唯一
- stale / sync-labels: issue 清理与标签同步

修复:
- Dockerfile 补 ENV TZ=Asia/Shanghai:容器默认 UTC 使配置的 09:00
  实际在 17:00(北京时间)触发签到与保活
- TraeWork 预刷新窗口 10min -> 24h(按平台区分,WorkBuddy 保持 10min):
  窗口过窄时请求途中 token 失效会返回 401 -> ErrSessionDead -> 账号被永久禁用
- upstream 流式请求改用无总时长上限的 client:http.Client.Timeout 含读取
  响应体时间,长回答超过 120s 会被中途截断;首字节改由 ResponseHeaderTimeout 约束
- traework FetchModels 过滤 is_custom_model 自定义模型(对齐上游 abb9b0b):
  第三方代理模型需额外授权,出现在 /v1/models 会导致用户选中后必然失败

其他:
- 移除 build.yaml:legacy builder 配置,Supervisor 2026.04.0 起不再被读取,
  其 build_from / args.BUILD_VERSION 均为死配置,易误导
- 修正 TestModelsDynamic:v1.1.0b11 起 /v1/models 追加虚拟 cheapest 条目,
  测试仍断言 3 个模型导致长期失败(改动前基线即失败)
- PR 模板字段与 pr-validate 门禁对齐(原 What/Why 会被 CI 拒绝)
@C3H3-AI
C3H3-AI merged commit 12a0ffc into master Sep 15, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant