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分。スカッシュマージ(我々のアカウントが作者)、マージ直後に 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 はパイプラインの kubectl コンテナとして alpine/k8s:1.31.2 を使用しています。コメントによるとシェルと kubectl・helm が揃っており、「眠って待機し命令を受ける」コンテナの形に合致するため選びました。我々が使うイメージでもあるこのリポジトリのビルドスクリプトを 2026-10-17 に小規模プロジェクトを巡回する中で読んでいる際に、古いアドレスを 2 つ見つけました。

古いアドレス 現在のアドレス 使用箇所(ベースコミット)
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

1行目の 301 は古い組織から新しい組織への引き渡し段階であり、その次の 302 は GitHub リリースが本来行う動作(「最新版」を実際のバージョンへ、バージョンアドレスをアセットサーバーへ)です。GitHub API も古いリポジトリ名を尋ねると新しい名前を返します。

同じ場所で build.sh がどのタグをビルドしているかも同様に実行してみました(tags.sh、ビルドやプッシュなしでリストのみ)。Kubernetes のリリースをデフォルト ページとして取得しても、100件ずつ取得しても選択されるタグは 1.37.1 1.36.5 1.35.9 1.34.12 で同じでした。懸念していたページの問題はなかったため、この部分は PR にしませんでした。

2. 原因:移行されたリポジトリと残されたアドレス

行番号は PR のベースコミット 4a10aa07 基準です。

リダイレクトがあるため、今すぐの問題はありません。それでも修正する理由は 2つありました。GitHub のリポジトリ移行ドキュメントによると、古い場所に同名の新しいリポジトリやフォークが作成されると、リダイレクトは永久に削除されます(利用量が多いリポジトリでは古い名前を完全に引退させ、再利用できなくすることもあります)。リダイレクトは他者が維持する約束事であるため、我々には確認する手段がありません。また、 curl -sL は失敗しても HTTP エラーを終了コードとして 返さないため(-f がない)、リダイレクトが途切れた場合、ビルドは不正なレスポンスボディをバイナリとして保存したまま、次のステップで奇妙な形で 失敗すると予想されます。最後の文はフラグで検証したものであり、実際に遮断はしていません(未計測)。

前例もありました。同じリポジトリの #94(2026-09-01 マージ)が、移行先の sealed-secrets リポジトリのアドレスを同じ方法で修正しました。今回の PR はその作業を残りの 2つのツールに続けて行ったものです。

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つのアドレスのみであり、新しいアドレスが最後まで取得できることは上記のリダイレクトチェーンで確認済みです。

4. 反応:「Thanks.」

時刻(10-17) 作業
03:47–03:48 タグ選択の再現、リダイレクトの実測
03:53 コミット(DCO 署名・SSH 署名)、13秒後に PR 公開。PR に付随するチェックなし
11:29 メンテナーのコメント「Thanks.」
11:30 36秒後にスカッシュマージ
11:30–11:31 master の CircleCI build 1分22秒、成功

このリポジトリの CI は CircleCI であり、ビルドジョブは master/main ブランチでのみ実行されます。そのため、PR 段階ではチェックが一切なく、マージ直後になって初めて master でビルドが 1回実行されました。ただし、 build.sh は Docker Hub に既に存在するタグを再ビルドしません。1分22秒という短時間から判断すると、今回のビルドは jq を取得してタグを確認したところで終了し、 Dockerfile の eksctl の行までは到達しなかったと考えられます。CircleCI のログは確認していません(未確認)。新しい Kubernetes のパッチバージョンがリリースされ、実際にイメージをビルドする日に eksctl の行が使用されます。

メンテナーはリポジトリの貢献者一覧において、2番目(6個)とは大きな差が開く 64個のコミットを持ち、実質的に一人でリポジトリを保守している人物です。ドラフトを作成する際に確認した最近の外部 PR のマージ時間は、#94 が当日(約 2時間14分)、#86 が 1日以内、#88 が 5日でした。今回の 7時間37分はその間に位置します。 マージコミット cf424d4c の作者は我々のアカウントであり、 メッセージは我々のコミットメッセージのタイトルの末尾に PR 番号が付いたものです。こちらで個別に対応すべき作業はありませんでした。

おまけで見つけた我々の側の改善点

第1節のタグ選択の再現結果を改めて見ると、このリポジトリは Kubernetes の最新マイナーバージョン 4つ(現在は 1.37・1.36・1.35・1.34)のみを新しくビルドします。TT Lab が使用する 1.31.2 はこのリストに含まれておらず、今回の修正を含め今後のツールの更新が反映されません。アップストリームの修正とは別に、 我々のパイプラインのイメージタグを現在ビルドされているバージョンに上げることが次の作業となります。

5. 学んだこと:オープンソースコントリビューションのコツ

ティティの一言。 友達が引っ越すときに、「古い家に届いた手紙は新しい家に転送してあげるね」って約束してくれたんだって。だからみんな 3年間古いアドレスに 手紙を送っていたの。でも、その古い家に誰かが新しく引っ越してきたらどうする? アドレス帳の 4行を新しいアドレスに直したら、「ありがとう。」って一言が返ってきたよ。 そしたら、うちのアドレス帳にもすごく古い番号が一つあることに気づいたんだ。それもすぐ直さなきゃね。

リンク

すべての資料は 2026-10-17 に閲覧しました。

ログインするといいねできます

コメント

まだコメントはありません。

ログインするとコメントできます