メインコンテンツへスキップ
見出し画像

【第2章 2-7話】排他制御を YAML から TypeScript に引っ越した日のこと

    排他制御もゲートも、GitHub Actions の YAML に書けば数行で済む。`concurrency` を足して、ステップを一個前に挟む。それだけ。

    それをわざわざ TypeScript のファイル二つに引っ越した。理由は単純で、YAML はテストが書けへんから。

    その日やりたかったことは二つ

    一つは、スキャンの仕事を他所へ配る前に、自分自身の品質ゲートを通すこと。僕はこれを self-gate と呼んでる。

    もう一つは、重なって起動したスキャンが同じ対象群(僕のコードでは fleet と呼んでる、アカウント全体のリポジトリの集まり)を同時に触らんようにすること。account-scan は schedule でも動くし、`workflow_dispatch` で手動でも叩ける。つまり「定時で動き出したやつ」と「僕が痺れを切らして手で押したやつ」が、時間帯によっては仲良く並走しうる。

    この二つ、どっちも「ワークフローの外側の作法」に見える。仕事の中身やなくて、仕事の始め方の話やから。設定ファイルに数行足してステップを並べたら、それなりに形にはなる。

    ただその形は、実際に回してみるまで合ってるかどうか分からん。ここが引っかかった。

    権限を確かめるだけのコミットを打って、消した

    ワークフロー周りは、この前後でも触るたびに手探りやった。証拠が残ってる。`test: probe workflow edit push permission (to be reverted)` ——ワークフローファイルへの push 権限が通るかどうかだけを確かめるためのコミット。タイトルに最初から「revert する予定」と書いてある時点で、僕の自信のなさが透けてる。

    で、約一分後に `revert: undo workflow-edit permission probe`。試して、結果を見て、消した。

    YAML の挙動って、そうやって実地で試すしかないところがある。手元で「たぶんこうなるはず」を検証する手段が薄い。ローカルで叩けるのはせいぜい構文が壊れてへんかどうかで、「重なった二本のうち片方がちゃんと止まるか」みたいな挙動は、実際に重ねてみるまで確かめようがない。

    そして僕は一人でこれを回してる。壊れてるのに気づくのが翌朝、みたいなのは普通にありえる。

    ソース側で強制することにした

    そこで、別の `.github/workflows` のステップとしてやるんやなくて、ソース側に置いた。self-gate は `src/quality/self-gate.ts`、ロックは `src/github/scan-lock.ts`。

    ロックはリポジトリスコープの git-ref ロックにした。Git の参照そのものを「先に取った者勝ち」の札として使う。取れんかったら、重なって起動したほうのスキャンは同じ fleet に手を出さへん。

    ワンピースで、海賊が上陸した島に自分の旗を立てて「ここはもう俺のとこや」と示すやつあるやんか。あれに近い。旗が立ってるのが見えたら、後から来たほうは黙って引き返す。旗の立て先が Git の ref なだけ。

    self-gate のほうは、`format:check` / `typecheck` / `test` / `lint` / `build` を、live-scan の仕事を配り出す前に自分に対して回す。仕事を配る側の品質が壊れたまま、外へ出ていく経路を塞いでおきたかった。同じコミットで、他所のリポジトリ宛のラベルとコメントの向き先もついでに直してる。配る側がズレてると、ズレたまま外に届きうるので。

    見返りはテストで返ってきた

    引っ越した効果は、その日のうちに分かりやすい形で出た。`tests/github/scan-lock.test.ts` と `tests/quality/self-gate.test.ts`。ほかの二つと合わせてテストファイル4つ、276行ぶん。

    これ、YAML に書いてたら一行も書けてへん。ロックが取れてる状態で二本目が来たらどうなるか、を関数の呼び出しとして確かめられる。実地で重ねてみんでも、手元で確かめられる範囲がだいぶ増えた。

    運用手順のほうは `docs/OPERATIONS.md` 側に回した。コードで強制するもんと、人間が読んで思い出すもんは、置き場所を分けたい。

    「設定に書くか、アプリに書くか」って好みの問題やと思ってたけど、テストが書けるかどうかで決まる話やったらしい。少なくとも僕の手元では。

    で、翌日にまた締め直してる

    とはいえソースに寄せたら万事解決、とはいかんかったみたいで、翌日のコミットログに `fix: harden AI Develop workflow gates and fleet concurrency` が残ってる。ゲートと fleet の並行制御を、もういっぺん締め直した記録。

    締めた瞬間が完成やない、ということなんやと思う。旗は立てたけど、立て方がまだ甘かった。

    #個人開発 #開発日記 #排他制御 #自動化 #第2章 |AIに開発させる仕組みを作る #GitHub Actions #CI /CD #TypeScript

     
     
    エンジニア歴15年目|元楽天エンジニア。AIを使って「自動で稼ぐ仕組み」を開発中。AI漫画・SNS自動運用など、企画→開発→本番運用→収益化まで、成功も失敗もリアルタイムで公開します。

    あなたへのおすすめ