無人パイプラインを駐車中のブランチから救い出す作業ルート設計
今回やったこと
画像生成と記事処理を自動化すると、生成物の品質だけでなく「どのチェックアウトに書き込んだか」が成果物の回収可否を左右します。作業者がたまたまチェックアウトしていた本体リポジトリへ画像や状態ファイルを書き込む構成では、処理が成功しても、その成果が追跡されない場所に残る可能性があります。
この問題に対し、画像パイプラインの作業ルートを実行時に渡せるようにし、画像ドレイン側では origin/main から作った一時作業領域を明示的に指定する設計へ改めました。対象コードは scripts/image_pipeline.py と scripts/run_image_drain.sh です。この記事では媒体名や接続先ではなく、作業ルートを明示的に指定する考え方に絞ります。
駐車ブランチで起きること
「本体リポジトリ」と呼ばれる場所が、常に最新のmainを指しているとは限りません。人間の作業や別の自動処理がブランチをチェックアウトしたままになっていると、無人ジョブがそこへコミットしても、そのコミットは自動配備の履歴から外れます。mainに直接書けば別の運用ルール違反になり、ブランチに書けば成果が孤立する、という二重の問題になります。
画像処理は、本文のコミットより後に動くことがあります。すると、原稿側の変更が先に取り込まれていても、raw/ の画像や状態ファイルだけが別の場所に残ります。生成APIの成否を見ているだけでは、この「成果物はあるが、次の工程から見えない」状態を検知できません。
作業ルートを呼び出し側から渡す
実装では、パイプラインが画像を探す場所と、Git操作を行う場所を WORK_ROOT としてまとめています。環境変数で上書きできるため、通常の本体checkoutを暗黙に使わず、ドレインが用意した一時作業領域を指定できます。
origin/main
↓
一時作業領域を作成
↓
画像生成・状態更新
↓
対象パスだけを add / commit
↓
呼び出し側で push・PR
コミット処理も対象パスを限定します。生成物の保存先を指定してから相対パスへ変換し、他の作業中ファイルをまとめてコミットしないようにしています。コミットが失敗した場合は警告を出し、生成物が未追跡のまま残っていることをログに示します。成功したふりをして次へ進まないことが重要です。
この設計は、画像係の都合にも対応します。画像がまだ無い記事を本文処理から切り離し、後段の画像ドレインが同じ作業ルートで生成物を追加できます。記事単位の失敗をバッチ全体へ広げない境界も必要で、処理対象が見つからない場合はその記事を次回へ残します。
運用で見るべき3つの状態
第一に、生成物が期待した raw/ に存在すること。第二に、そのパスが今回の作業ルートに属していること。第三に、コミットがpushとPRの対象になっていることです。ファイルの存在だけでなく、Gitの祖先と作業ルートを合わせて確認しなければなりません。
無人処理では「生成できた」だけでは完了ではありません。次の工程が同じファイルを見られ、履歴として回収でき、公開側が意図したコミットを受け取れるところまでが一つの状態遷移です。駐車中のブランチに成果を置かないというルールは、Gitの作法というより、生成物を失わないためのデータフロー設計です。
更新履歴
- 2026-08-12: 初稿。画像パイプラインの実装コメントと運用スクリプトをもとに整理。
訂正履歴
なし。