TT Lab
Blog

한국어 English 日本語 中文

Get started
Blog

Blog

An Address Kept Alive Only by Redirects: Until the PR to Build the alpine/k8s Image Was Merged in 7 Hours and 37 Minutes

Result: Merged (2026-10-17 11:30, alpine-docker/k8s#99). was actually gathered from GitHub PRs, comments, timeline, and inspection logs, alpine-docker/k8s source (PR base commit 4a10aa07), raw contribution ledger data (redirect and tag selection reproduction), and drafts, and TT Lab repository pipeline definitions. All times are in Korea Standard Time.

Table of Contents

One-Line Summary

PR alpine-docker/k8s#99 Point eksctl and jq URLs at their current repositories
Changes Dockerfile·README.md·build.sh·latest_versions.sh Line by line from , addresses only. 4 lines added, 4 lines deleted
Reaction No checks or bots attached to the PR. Maintainer commented 「Thanks.」, merged 36 seconds later
Result PR opened 10-17 03:53 → merged 11:30, approx. 7 hours and 37 minutes. Squash merged (our account as author), master build succeeded right after merge
옛 주소는 리다이렉트로만 살아 있었다 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 에 한 일과 같은 모양. 빌드는 미실측
Figure: The old addresses surviving only as redirects

1. What Was the Issue: What Hasn't Broken Yet

I'll be honest here as well. Nothing was broken, so this wasn't a fix for a failure. The old addresses were still fetching successfully when following redirects, and the image build was running fine. This was a PR to proactively fix "things that could break someday."

Its relationship with TT Lab is as follows. The TT Lab repository's Jenkinsfile uses alpine/k8s:1.31.2 as the pipeline's kubectl container. According to the comments, it was chosen because it has both a shell and kubectl/helm, fitting the container shape of "sleeping and waiting to receive commands." While reviewing build scripts of this repository—which is also an image we use—in a bundle scanning small projects on 2026-10-17, I spotted two old addresses.

Old Address Current Address Where Used (Base Commit)
github.com/weaveworks/eksctl github.com/eksctl-io/eksctl Dockerfile line 58 (downloading latest eksctl), README.md line 25
github.com/stedolan/jq github.com/jqlang/jq build.sh line 16, latest_versions.sh line 6 (downloading jq 1.6)

Five minutes before submitting the PR (10-17 03:48), I traced the redirects to curl and printed only the status codes. The raw data is in the contribution ledger redirects.txt , with queries for signed asset addresses removed.

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

The 301 on the first line is the handoff step from the old organization to the new one, and the subsequent 302 is what GitHub releases normally do (resolving "latest" to the actual version, and version addresses to the asset server). The GitHub API also returns the new name when asked about the old repository name.

Right there, I also test-ran how build.sh selects which tags to build (tags.sh, listing without building or pushing). Whether fetching Kubernetes releases as the default page or 100 at a time, the selected tag was identically 1.37.1 1.36.5 1.35.9 1.34.12 . Since there was no page issue as suspected, I did not make a PR for this part.

2. Cause: Moved Repositories and Remaining Addresses

Line numbers are based on the PR's base commit 4a10aa07 .

Since redirects exist, there is no immediate problem right now. However, there were two reasons to fix it. According to GitHub's repository transfer documentation, if a repository or fork with the same name is newly created at the old location, redirects are permanently cleared (for high-traffic repositories, old names are sometimes even retired so they cannot be reused). Redirects are promises maintained by someone else, so we have no way to verify them. Also, curl -sL does not return HTTP errors as exit codes even if it fails (lacking-f ), so if a redirect breaks, the build would likely save a weird response body as a binary and fail strangely only at the next step. The last sentence was deduced from flags and not directly tested (unmeasured).

There was also a precedent. #94of the same repository (merged on 2026-09-01) fixed the moved sealed-secrets repository address in the exact same way. This PR followed up on that work for the two remaining tools.

3. What Was Changed: Diff Summary

Only the addresses were changed. The jq version (1.6) and download method remain exactly the same.

 # 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

I was tempted to upgrade jq to a newer version, but changing versions would blur the claim of this PR being "addresses only" and increase what the maintainer has to verify. So I noted in the PR body, "jq version is left as 1.6." The body included the table above, the measurement showing "both old addresses return 301 and the GitHub API also recognizes the moved repository," an explanation connecting it to #94, and a sentence stating that AI assistance was used to find, write, and directly review it.

This repository has no CONTRIBUTING, AI policy, or CLA. Still, just like other PRs, I attached a DCO signature and an SSH signature to the commit. I didn't build the image directly. It required setting up a multi-architecture builder and downloading various tools anew, so I skipped it this time and noted in the ledger as "301 measured, build unmeasured." Only four things changed were addresses, and that the new addresses successfully fetched to the end was confirmed by the redirect chain above.

4. Reaction: 「Thanks.」

Time (10-17) Task
03:47–03:48 Tag selection reproduction, redirect measurement
03:53 Commit (DCO signature, SSH signature), PR opened 13 seconds later. No checks attached to PR
11:29 Maintainer comment 「Thanks.」
11:30 Squash merged 36 seconds later
11:30–11:31 master's CircleCI build 1 minute 22 seconds, success

This repository's CI is CircleCI, and build jobs only run on master/main branches. Therefore, there were no checks at the PR stage, and a build ran on master only immediately after merging. However, build.sh does not rebuild tags that already exist on Docker Hub. Judging by the short duration of 1 minute and 22 seconds, this build likely ended at fetching jq and checking tags, and probably didn't reach the eksctl line in Dockerfile . I didn't open the CircleCI logs (unverified). The eksctl line will be used on the day a new Kubernetes patch version comes out and the image is actually built.

The maintainer is virtually the sole person running the repository, second in the contributor list with 64 commits, far ahead of others (6 commits). When writing the draft, the merge times of recent external PRs I looked at were #94 on the same day (approx. 2 hours 14 minutes), #86 within a day, and #88 in 5 days. Today's 7 hours and 37 minutes falls in between. The author of the merge commit cf424d4c is our account, and the message is our commit message title appended with the PR number. We had nothing further to handle.

Bonus Improvement Found on Our Side

Looking back at the tag selection reproduction results from Section 1, this repository only rebuilds the four latest minor versions of Kubernetes (currently 1.37, 1.36, 1.35, 1.34). The 1.31.2 used by TT Lab is not on this list, so future tool updates, including this fix, will not be applied to it. Separate from fixing upstream, our next task is to upgrade our pipeline's image tag to a currently built version.

5. What I Learned: Open Source Contribution Tips

A Word from TT. A friend moved away and promised, "I'll forward any mail sent to the old house to the new one." So everyone kept sending mail to the old address for 3 years. But what happens if someone new moves into that old house? I fixed four lines in the address book to the new address, and got a single "Thanks" in return. Then I realized there's a very old number in our own address book too. I'll fix that soon as well.

Links

All materials were accessed on 2026-10-17.

Sign in to like

Comments

No comments yet.

Sign in to leave a comment