TT Lab
博客

한국어 English 日本語 中文

开始
博客

博客

仅靠重定向维持的地址:alpine/k8s 镜像构建 PR 从提交到合并仅用 7 小时 37 分钟

结果:已合并 (2026-10-17 11:30, alpine-docker/k8s#99). 实际取自 GitHub 的 PR、评论、时间线、检查记录,alpine-docker/k8s 源码(PR 的基础提交 4a10aa07),以及贡献记录的实测原始数据(重定向及标签选择复现)与草稿、TT Lab 仓库的流水线定义。时间均为韩国时间。

目录

一句话总结

PR alpine-docker/k8s#99 Point eksctl and jq URLs at their current repositories
修改内容 Dockerfile·README.md·build.sh·latest_versions.sh 中逐行修改,仅限地址。新增 4 行,删除 4 行
反应 PR 没有附加检查和机器人。维护者发表评论“Thanks.”,36 秒后合并
结果 PR 公开 10-17 03:53 → 合并 11:30,约 7 小时 37 分钟。Squash 合并(我方账号为作者),合并后 master 立即构建成功
옛 주소는 리다이렉트로만 살아 있었다 10-17 03:48 curl 실측, 바탕 커밋 4a10aa07 의 네 줄 ① eksctl — Dockerfile 58행, README 25행 weaveworks /eksctl 301 eksctl-io /eksctl 302 v0.231.0 tar.gz /releases/latest/download/… 그대로 따라감 ② jq 1.6 — build.sh 16행, latest_versions.sh 6행 stedolan /jq 301 jqlang /jq 302 릴리스 자산 서명된 주소 /releases/download/jq-1.6/jq-linux64 ③ GitHub API 의 저장소 정보 repos/weaveworks/eksctl → eksctl-io/eksctl repos/stedolan/jq → jqlang/jq PR: 네 줄의 주소만 새 저장소로(+4 −4) #94 가 sealed-secrets 에 한 일과 같은 모양. 빌드는 미실측
图:旧地址仅靠重定向维持的状态

1. 问题所在:尚未损坏的部分

在此坦诚说明,我们并非因为出现了故障才进行修复。通过重定向,旧地址目前依然能够下载成功,该镜像的构建也一直在正常运行。这是一个提前修复“将来可能会损坏的部分”的 PR。

与 TT Lab 的关系如下。TT Lab 仓库的 Jenkinsfile 在流水线中将 alpine/k8s:1.31.2 用作 kubectl 容器。根据注释,由于它同时包含 shell 以及 kubectl 和 helm,符合“休眠等待命令”的容器形态,因而被选中。在 2026-10-17 浏览一些小项目时,我们看到了这个作为我们正在使用的镜像的仓库的构建脚本中的两个旧地址。

旧地址 新地址 使用位置(基础提交)
github.com/weaveworks/eksctl github.com/eksctl-io/eksctl Dockerfile 第 58 行(下载 eksctl 最新版), README.md 第 25 行
github.com/stedolan/jq github.com/jqlang/jq build.sh 第 16 行, latest_versions.sh 第 6 行(下载 jq 1.6)

在提交 PR 的 5 分钟前(10-17 03:48),我们顺着 curl 的重定向跟踪并仅打印了状态码。原始数据位于贡献记录的 redirects.txt 中,删除了带签名的资产地址查询参数后保留。

301 -> https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_Linux_amd64.tar.gz
302 -> https://github.com/eksctl-io/eksctl/releases/download/v0.231.0/eksctl_Linux_amd64.tar.gz
301 -> https://github.com/jqlang/jq/releases/download/jq-1.6/jq-linux64
302 -> https://release-assets.githubusercontent.com/…(서명 쿼리 지움)
API repos/weaveworks/eksctl -> eksctl-io/eksctl
API repos/stedolan/jq -> jqlang/jq

第一行的 301 是旧组织移交给新组织的阶段,之后的 302 是 GitHub 释放(release)的常规行为(将“最新版”转换为实际版本,将版本地址转换为资产服务器)。当用 GitHub API 询问旧仓库名称时,它也会返回新名称。

我们在相同位置针对 build.sh 烧录了哪个标签也进行了原样运行测试(tags.sh,仅获取列表而不进行构建和推送)。无论是将 Kubernetes 发布版本作为默认页面获取,还是每次获取 100 个,所选的标签都是 1.37.1 1.36.5 1.35.9 1.34.12 ,结果一致。由于没有发现所担忧的页面问题,因此没有为此创建 PR。

2. 原因:迁移的仓库与残留的地址

行号基于 PR 的基础提交 4a10aa07 。

既然有重定向,目前确实没有问题。但我们要修复它有两个理由。根据 GitHub 的仓库迁移文档,如果旧位置新建了同名仓库或派生仓库(fork),重定向将被永久删除(对于使用量大的仓库,甚至会直接退役旧名称以防再次使用)。重定向是他人维护的承诺,我们无法自行确认。此外, curl -sL 即使失败也不会将 HTTP 错误作为退出代码返回(-f 缺失),因此如果重定向中断,构建过程可能会将错误的响应体保存为二进制文件,并在接下来的步骤中以奇怪的方式失败。最后这句话是通过参数推导出来的,并没有亲自去断开进行测试(未实测)。

此前也有过先例。我们用相同的方法修复了同一仓库的 #94(2026-09-01 合并)中迁移后的 sealed-secrets 仓库地址。本次 PR 是将该工作延续到其余两个工具上。

3. 修改内容:diff 摘要

仅修改了地址。jq 的版本(1.6)以及下载方式均保持不变。

 # Dockerfile
-    curl -sL "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_${ARCH}.tar.gz" | tar xz -C /tmp && \
+    curl -sL "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_$(uname -s)_${ARCH}.tar.gz" | tar xz -C /tmp && \
 # README.md
-- [eksctl](https://github.com/weaveworks/eksctl) (latest version when run the build)
+- [eksctl](https://github.com/eksctl-io/eksctl) (latest version when run the build)
 # build.sh, latest_versions.sh (같은 줄)
-curl -sL https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 -o jq
+curl -sL https://github.com/jqlang/jq/releases/download/jq-1.6/jq-linux64 -o jq

虽然有把 jq 升级到新版本的冲动,但如果更改版本,就会模糊“仅修改地址”这一 PR 的核心诉求,并增加维护者需要核对的内容。因此,我们在 PR 正文中写明了“jq 版本保持 1.6 不变”。正文中包含了上表、实测结果(“两个旧地址均返回 301,GitHub API 也显示已迁移”)、承接 #94 的说明,以及借助 AI 辅助查找编写并经过人工亲自审核的声明。

该仓库没有 CONTRIBUTING、AI 政策和 CLA。不过与其他 PR 一样,我们在提交中附加了 DCO 签名和 SSH 签名。我们没有在本地亲自构建镜像。由于需要多架构构建器并重新下载多个工具,这次没有进行,因此贡献记录中也如实填写了“301 已实测,构建未实测”。修改的内容仅有四个地址,且新地址能完整下载已通过上述重定向链确认。

4. 反应:“Thanks.”

时间 (10-17) 事项
03:47–03:48 标签选择复现、重定向实测
03:53 提交(DCO 签名·SSH 签名),13 秒后公开 PR。PR 没有附加检查
11:29 维护者评论“Thanks.”
11:30 36 秒后 Squash 合并
11:30–11:31 master 的 CircleCI build 1 分 22 秒,成功

该仓库的 CI 是 CircleCI,且构建作业仅在 master/main 分支运行。因此 PR 阶段没有任何检查,直到合并后才在 master 上运行了一次构建。不过, build.sh 对于 Docker Hub 上已有的标签不会重新构建。从 1 分 22 秒的极短时间来看,本次构建仅停留在获取 jq 并验证标签的阶段, Dockerfile 的 eksctl 行应该尚未执行。我们没有打开查看 CircleCI 日志(未确认)。当发布新的 Kubernetes 补丁版本并实际构建镜像的那一天,eksctl 行才会派上用场。

在仓库的贡献者列表中,该维护者拥有 64 个提交,远超第二名(6 个),可以说是实际上独立维护该仓库的人。在编写草稿时查阅了最近外部 PR 的合并时间:#94 是当天(约 2 小时 14 分钟),#86 是 1 天内,#88 是 5 天。本次的 7 小时 37 分钟正处于其间。合并提交 cf424d4c 的作者是我方账号,消息是我方提交信息标题末尾附加了 PR 编号。我们无需采取任何后续行动。

意外发现的我方改进点

再次查看第 1 节中标签选择的复现结果,该仓库仅重新构建 Kubernetes 的四个最新次要版本(目前为 1.37、1.36、1.35、1.34)。TT Lab 使用的 1.31.2 不在此列表中,因此包括本次修改在内,未来的工具更新将无法应用到该镜像中。撇开修复上游不谈,将我们流水线中的镜像标签升级到当前构建的版本是接下来要做的事情。

5. 收获:开源贡献要领

Tee 的寄语。 听说朋友搬家时承诺过“寄到老房子的信会帮你转发到新家”。于是大家连续三年都把信寄到了旧地址。可要是有人搬进那栋老房子该怎么办呢?我们将地址簿里的四行改成了新地址,就收获了一句“谢谢”。同时我们也发现,自己家的地址簿里还有一个非常古老的号码。那个我们也会尽快修复的。

链接

所有资料均于 2026-10-17 查阅。

登录后即可点赞

评论

还没有评论。

登录后即可发表评论