- 個人サーバーの bare Git リポジトリに
post-receiveフックを追加し、テスト、ビルド、ファイル移動を自動化するシンプルな CI 構成 - 既存の CI は複雑な YAML 設定、遅い実行、難しいセルフホスティングがある一方で、完全なビルド分離やシークレット管理までは必要なかった
- フックで処理を直接実行すると、失敗時に push が拒否されたり完了が遅れたりするため、最小ジョブキュー
nqでバックグラウンド処理する - フックは
nqだけを呼び出し、ログはssh server nqtail -aで確認できるため、素早くシンプルに運用できる - 必要に応じて landdown・Podman でビルドを分離し、sops でシークレットを管理したり、Git のメールパッチ・
git-shell・git http-backendで開発方式を拡張できる
post-receive フックと nq の構成
- 個人サーバーで
ssh server git init --bare repoによりリポジトリを作成し、git clone server:repoで複製する - bare リポジトリの hooks ディレクトリにシェルスクリプト形式の
post-receiveフックを置き、push のたびに CI を開始する - 処理をフックで直接実行すると、2 つの問題が起きる
- スクリプトが失敗した場合、push が拒否される
- スクリプトの実行が遅いと、push の完了も一緒に遅れる
- フックでは最小ジョブキュー
nqを呼び出し、処理を バックグラウンドキュー に追加する- ログは
ssh server nqtail -aで確認する - 設定手順は短い チュートリアルで確認できる
- ログは
1件のコメント
Lobste.rs の意見
CI には少なくとも 2 つの問題がある
簡単な問題はコード変更時に
make testを実行することで、難しい問題は Linux、Windows、Mac のすべてでmake testを実行すること既存エンジンの開発者体験とデバッグ機能がいつも後回しなのが不満で、https://ci.pico.sh で CI システムを作っている。DSL も嫌いだし、階層的につながる YAML はじわじわと生命力を吸い取られる感じがする
これを gitolite 上に構築し、Temporal に渡してビルド工程を制限なく制御したことがある
実行失敗時に push を拒否することもできるが、通常はフックを通した後で失敗を別途処理しており、構成も単純で楽しかった
シェルスクリプト実行を中心にしたもう 1 つの最小 CI として laminar CI があり、Web UI も提供している
ずっと前、Windows 専用の企業環境で、チーム全体が使う ローカル CI サーバー として Mac mini を置いて iOS アプリをビルドしており、初期に試した Git 活用法の 1 つだった
https://mccd.space/git/ で見つけたが、stagit の fork を使っているようだ
数か月前まで Forgejo と Woodpecker を運用していたが、不要な機能が大半だったので両方とも削除し、これに似た より軽い構成 を探していた。次の課題が CI だったのでタイミングが良く、近く公開する小さなライブラリを SourceHut にミラーするか考えている
リポジトリは git-daemon で Web に読み取り専用公開しており、全体の構成方法は ここ にまとめてある
この投稿で
nqを初めて知ったが、おそらくsystemd-runを使うと思うほぼすべてのランナーで Nix を使っているので、
nix flake checkの結果を OTLP メトリクスとログとして公開すれば、CI 要件を監視システムで解決できそうだこのようなシンプルなセルフホスト開発プラットフォーム構成は気に入っている
CI 用には、軽量でシンプルなコンテナシステムである bubblewrap を簡単に設定して使える。ただ、
nqを使うと CI 失敗時の push 拒否 はできないように見えるが、どう処理しているのか気になるさらに分離が必要なら Podman、Docker、bubblewrap を追加できる。テストを実行する pre-commit フックを置かないのと同じ理由で、CI 失敗時に push を拒否していない。壊れた作業でもコミットや push が必要なときがあり、push が非常に遅くなることもあるためだ。拒否が必要なら
nqなしで CI を同期実行し、終了コードが 0 でないときに push を止めればよいあるいは main 以外のブランチ は
nqで実行し、main ブランチだけ同期実行することもできるlanddownリンク が壊れているようだ