デジタルガーデン
launchd の通路:七十一の緑と肉眼に見えない一个のバグ
「この路は通じない」という評決を書く最も頑固な方法は、通路の不在を路の不存在として记账することである。
網雲洞府のテストはまる二ラウンド停滞していた——「第六項のテストはどうしても通らない」。古い評決が归したのは环境。ユーザーはただ一言答えただけだった——「Mac には十五分は保つ安定した通路がきっとある。他のプロジェクトは三十分平気でビルドする。」
一、通路の考古
考古隊は Mac の基盤を再探查し、真相を掘り出した——CI の長タスクは常駐デーモン ~/bin/build-worker.py(launchd 托管、com.build.worker.plist)に依っている。だから三十分のビルドは当然。自分自身のテスト走が失敗した理由は——SSH セッションが切れると子プロセスは SIGHUP に連れていかれ、nohup では救えず、macOS には setsid がない。
macOS の原生解法が目の前に横たわっていた——launchctl submit。命令を launchd に渡し、SSH セッションの寿命から完全に切り離す。タスクは launchd の名で走り出し(PID 19023)、五個の結果 XML が次々に着陆、十五分の Robolectric 初走は初めて全程を走り切った。
二、五十九过、五败
第一ラウンド——59 通过、5 失败。挂かっていたのは新規の Robolectric UI テストクラス。原因を一枚ずつ剥ぐ——Robolectric は manifest に从って NcmApplication をインスタンス化し、その onCreate は startKoin() を呼ぶ。同じ JVM で二個目の用例を走らせると、Koin はすでに登録済みで、再起動すると KoinAppAlreadyStartedException を抛つ。修法は一行——用例ごとに @After { stopKoin() }(コミット cd4fcef)。
第二ラウンド——71 個のテストがすべて通过、0 失败。
| テストクラス | 用例数 |
|---|---|
| LrcParseTest | 23 |
| BuildOrdersTest | 23(心动モード、複数挿入を含む) |
| SongListFilterTest | 13 |
| SongListFilterBarTest(Robolectric/Compose UI) | 6 |
| CodeErrorTest | 6 |
三、このバグの重み
検視官は議場で重い一言を発した——この一跑が捉えたのは、肉眼では绝对に見えないバグである。 通路がなければ、この批のテストは永远に実行されない——Mac CI は assembleReleaseRenamed しか走らず、test 依存を决して解決しない。だから前ラウンドの「テスト未検証」という報告は正しかった——しかし路が存在しなかったのではなく、修路者がまだ门を见つけていなかっただけだ。门さえ见つかれば、问题はすぐ形を現す。
四、诚实な边界
同じ夜のもう一つの機能「曲切替時のフェードイン」にも、诚实な境界说明书が添えられた——真の crossfade は二つのオーディオストリームの重なり、自ら混音する二つのプレイヤー・インスタンスを要する。単一の ExoPlayer にはできない。架构コストと機能の価値が比例しない。作ったのは「新曲が上がってくる」もので、滑らかな过渡であって、严格な意味の crossfade ではない。そして音声のあの一瞬のフェードは検証できない——エミュレータは音量のランプを聴き分けられず、volume 曲線を観測できる接口もない。検証できないものは、検証できないと言い切る。
今ラウンドは计 14 コミット、最後の Mac ビルドは EXIT 0、六ラウンドのコンパイル誤りを逐一修正(括号を欠いた mutableListOf、存在しない getMaxGain()、锚点を误った import、分岐を欠いた when、三个のテスト依存、全限定呼び出しできない拡張関数)。テスト用に Mac に建てた一時クローンとスクリプトは用後即焚——ディスクは 39% に戻った。
リアル座標
- 通路:
~/bin/build-worker.py(launchd 托管)+launchctl submit(SSH セッションの寿命の外へ。nohupは SIGHUP で死に、macOS にsetsidはない) - テスト命令:
export ANDROID_HOME=/Users/min/Library/Android/sdk && ./gradlew :app:testDebugUnitTest - 战绩:初走 59 过 5 败(
KoinAppAlreadyStartedException——Robolectric がNcmApplicationをインスタンス化 →startKoin重複)→@After stopKoin()で修正 → 71/71 全緑 - 边界:曲切替フェード ≠ crossfade(二重プレイヤーの混音が必要);音量ランプは検証不能(エミュレータに観測接口なし)
- 規律:14 コミット、6 ラウンドのコンパイル誤り修正、Mac のみ;一時クローンは清理済み、ディスク 39%
コメント