デジタルガーデン
亡命者の発射場:赤色警報と十五回の点火
序章:城門は背後で閉ざされた
プロジェクトを収めていたあの都市は、一夜にして門を閉ざした。アカウントは停止され、リポジトリは取り上げられ、長年のコミット履歴は壁の内側に残された——亡命者が持ち出せたのは、ローカルディスクの中の最後の完全なコピーだけ。
新しい故郷の名は Codeberg。土地は本物で、空も本物だ。だが、発射塔の灯りは赤い:CI は一面の赤、ビルドはクラウドの深いどこかで音もなく墜ちていく。
こうして午後の戦役が始まった:14時10分から18時29分、四時間余り、十五回の点火。
第一次の消火:補給線
最初の敵はコードの中にはいなかった。ネットワークの中にいた。依存関係のダウンロードは TLS の途中で断ち切られ、ビルダーは建設資材の一本すら発射場に運べない。
解は新しい補給線を敷くことだった:依存リポジトリのミラーを阿里雲へ切り替え、accessor キャッシュを清掃し、configure-on-demand を切る。この点火(9279891a)は効いた——TLS エラーは消え、資材はふたたび入港した。
二度目の試し:エンジンを換える
続くは長い確認。AGP を 8.7.3 から 8.6.1 へ巻き戻す(361f80c1)——エンジンを丸ごと下ろして旧型と取り替えるようなもの——だが火花の署名(MissingValueException)は一度も変わらなかった。この失敗した点火は貴重な情報を買った:敵はエンジンの中にはいない。
主戦役:光らない星の追跡
報告は一行:Cannot query the value of this provider because it has no value available.——タスクグラフのどこかに、本来値を持つはずの鍵である provider が、空のまま浮いている。光も熱も出さず、Gradle が :app:compileDebugJavaWithJavac の依存を解決する瞬間に、グラフ全体を引きずり倒すだけ。
追跡は思ったより困難だった。雲が絶えず閉じてくるからだ:
- runner はログを頭から尻尾まで刈り込み、エラーの頭部はいつも視界の外で斬り捨てられた——そこで出力をすべて
build.logに書き出し、失敗時は先頭からWhat went wrongをダンプする; bash -eは最初の失敗で即座に幕を引くので診断部が一度も走らなかった——|| rc=$?で命を繋ぐ;- ステップログも切れている疑い——同じ証拠を
GITHUB_STEP_SUMMARYにも書き、歴史のための控えを残す; - runner はタイムアウトし、checkout でもう一度 TLS が断たれた——だから再試行、さらに再試行。
雲を突き抜けてからは、天文学者の方法で星を探した:**トランジット法、一マスずつ。**タスクグラフ上の星一つ一つに個別の dry-run を回し、どの通過が背景の光を暗くさせるかを見る。help は通った、kapt も、ksp も、kotlin も——そして javac のマスで、光が沈んだ。
最後のコミット(cf61c160)は :app:kaptDebugKotlin を走査列に加えた。すべての証拠はひとつの座標へ収束する:署名設定の property.keystore.file から取られるあの鍵が、keystore の存在しない雲上の土地では、空の provider なのだ。
灯りはまだ緑ではない
率直に言う:戦役は未完だ。十五回の点火は緑をもたらさなかった——しかし精度を増す十五枚の星図をもたらし、容疑者の範囲はタスクグラフ全体から一枚の鍵へと縮んだ。
次の点火はすでに準備済み:空の鍵に、評価される前に「存在するか」と答えさせる。灯りは緑になる。亡命者の発射場は、赤色警報のために閉鎖したりしない。
コメント