記事を公開するときに、次の 1 行を実行している。
./deploy.sh && g add . && gen-commit-msg.sh --commit && ./push-and-watch.shこの 1 行が何をしているのか、整理してみた。
全体の流れ#
4 つのコマンドを && でつないだ一連の流れで、内容は次のとおり。
- 公開用ファイルの整形とビルド確認
- 全部ステージ
- AI にコミットメッセージを書かせてコミット
- push して公開を見届ける
どれか 1 つでも失敗すると、そこで止まって次には進まない。
flowchart LR
A["./deploy.sh
整形とビルド確認"] --> B["g add .
全変更をステージ"]
B --> C["gen-commit-msg.sh --commit
AI がメッセージを書いてコミット"]
C --> D["./push-and-watch.sh
push して Actions を監視"]
D --> E["https://www.ty07.net/ 更新"]
./deploy.sh#
deploy.sh は、公開前の準備とビルド確認だけを行う。コミットも push もしない(ファイル冒頭のコメントに明記してある)。
prepare-content.shを呼ぶ。実行内容は次の 3 つ。content/post/の存在確認と、iCloud の同期競合コピー(index 2.mdのような名前)の検出- 記事ごとの画像の同期
- カバー画像の自動配置
hugo --minifyを一時ディレクトリに出力して、ビルドが通るか確認する。ショートコードの閉じ忘れなどを、push の前に見つけるためである。- 最後に、手動で行う手順を表示して終わる。
g add .#
g は git のエイリアスである。カレントディレクトリ以下の変更を、すべてステージする。
gen-commit-msg.sh –commit#
~/.local/bin/gen-commit-msg.sh は、ステージ済みの diff( git diff --cached )を claude -p に渡し、Conventional Commits 形式のメッセージを作る。 --commit を付けているので、そのままコミットまで行う。
- モデルは既定で
haikuである。 - 生成結果の 1 行目が
type(scope): 要約の形式でなければ、--commitを付けていてもコミットせずエラーで止まる。
./push-and-watch.sh#
push-and-watch.sh は、 git push の後に GitHub Actions のデプロイを最後まで見届ける。
git pushを実行する。出力に “Everything up-to-date” があれば、push するものが無かったとして終了する。
HEADの SHA に一致するpages.ymlの実行を最大 60 秒(2 秒おきに 30 回)探す。見つかったら
gh run watch --exit-statusで完了まで監視する。成功すれば「サイトが更新されているはず」と表示し、失敗すれば
gh run view ... --log-failedの案内を出して異常終了する。git pushが成功しても、Actions 側のビルドが失敗して、サイトが更新されなかったことがあった。それを防ぐためのスクリプトである。
注意点#
all-posts.orgを直しただけでは、サイトは変わらない。deploy.shはcontent/post/が生成済みであることを前提にしている(prepare-content.shの冒頭コメント)。先に Emacs で ox-hugo のエクスポートを行い、content/post/を更新しておく。更新していなければ、Actions が古いcontent/をビルドするだけである。g add .は広く拾う。deploy.shが案内する手順はgit add contentで、範囲が狭くなっている。作業中の無関係なファイルが混ざっていないか、git statusで確認してからのほうが安全である。- diff が外部の API に送られる。
gen-commit-msg.shは、ステージした diff を Anthropic API に送る(スクリプトのコメントにも記載がある)。ブログの記事が中心なので問題は小さいが、機密ファイルをステージしていないか注意する。ANTHROPIC_API_KEYが設定されている必要もある。
途中で失敗した場合は、次のようになる。
| 失敗した場所 | 状態 |
|---|---|
| deploy.sh | ビルドエラーで、何も変更されていない |
| gen-commit-msg.sh | ステージだけが済んだ状態で止まっている |
| push-and-watch.sh | すでにコミットされている。push 済みか Actions の失敗かは表示で分かる |
読んでいない部分#
gen-commit-msg.sh は 271 行ある。この記事では、ロックファイルによる排他などの後半部分は読んでいない。



