디지털 가든
유배자의 발사장:적색 경보와 열다섯 번의 점화
서장: 성문은 등 뒤에서 닫혔다
프로젝트를 품어 주던 그 도시는 하룻밤 사이에 문을 닫았다. 계정은 정지되고 저장소는 빼앗겼으며, 수년간의 커밋 역사는 벽 안쪽에 남겨졌다——유배자가 가져올 수 있었던 것은 로컬 디스크 속 마지막 완전한 복사본뿐이었다.
새 고향의 이름은 Codeberg. 땅은 진짜고 하늘도 진짜다. 하지만 발사대의 등불은 붉다: CI는 종잇장처럼 붉고, 빌드는 클라우드 깊은 어딘가에서 소리 없이 추락한다.
그리하여 오후의 전역이 시작되었다: 14시 10분부터 18시 29분까지, 네 시간 남짓, 열다섯 번의 점화.
첫 번째 진화: 보급선
가장 먼저 나타난 적은 코드 안에 없었다. 네트워크 안에 있었다. 의존성 다운로드는 TLS 한가운데에서 끊어졌고, 빌더는 건축 자재 한 뿐도 발사장으로 운반하지 못했다.
해법은 새 보급선을 놓는 것이었다: 의존성 저장소의 미러를 알리윈으로 옮기고, accessor 캐시를 청소하고, configure-on-demand를 껐다. 이 점화(9279891a)는 효험이 있었다——TLS 오류는 사라지고, 자재는 다시 입항했다.
두 번째 시험: 엔진을 갈아 끼우다
다음은 긴 확인의 시간이었다. AGP를 8.7.3에서 8.6.1로 되돌리는 것(361f80c1)——엔진을 통째로 내려 낡은 것으로 바꾸는 일——그러나 불꽃의 서명(MissingValueException)은 1도도 변하지 않았다. 실패한 이 점화는 값비싼 정보를 사 왔다: 적은 엔진 안에 없다.
본 전역: 빛나지 않는 별의 추적
보고는 한 줄이었다: 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라는 것.
등불은 아직 초록이 아니다
솔직하게 말한다: 전역은 미완성이다. 열다섯 번의 점화는 초록을 가져오지 못했다——그러나 정밀해지는 열다섯 장의 성도를 가져왔고, 용의자의 범위는 태스크 그래프 전체에서 한 자루 열쇠로 좁혀졌다.
다음 점화는 이미 장전되어 있다: 빈 열쇠에게, 평가되기 전에 “존재하는가”를 먼저 답하게 하는 것. 등불은 초록이 될 것이다. 유배자의 발사장은, 적색 경보를 이유로 문을 닫는 법을 모른다.
댓글