trap とは何か? シグナルと終了時にクリーンアップを実行する
trap は、シェルが特定のシグナルを受け取るか終了しようとするときに指定したコマンドを実行するシェルの仕組みで、クリーンアップに使われます。
スクリプトが中断されたり終了したりするとき、しばしばクリーンアップをしたくなります。一時ファイルの削除、バックグラウンドサーバーの停止、ロックの除去です。trap コマンドを使うと、それらのイベントで実行されるコードを登録できます。CI では、trap によって、ステップが失敗したり途中でキャンセルされたりしてもクリーンアップが確実に行われます。
trap とは
trap ビルトインは、コマンドを 1 つ以上のシグナル、または特別な EXIT イベントに関連付けます。そのシグナルが到来するかシェルが終了すると、trap されたコマンドが最初に実行されます。
基本的な例
trap 'rm -f "$tmpfile"' EXIT と書くと、スクリプトが終わるたびに、成功でも失敗でも中断でも、一時ファイルが確実に削除されます。クリーンアップが 1 か所に一元化されます。
一般的な trap のターゲット
- EXIT: 理由を問わず、シェルが終了するたびに実行される。
- SIGINT: Ctrl-C / 中断を処理する。
- SIGTERM: 丁寧な終了要求を処理する。
- ERR: コマンドが失敗したときに実行される (set -e とともに)。
trap が重要な理由
trap がないと、早い段階での失敗が一時ファイル、実行中のプロセス、ロックを残す可能性があります。trap は、スクリプトがどう終わろうと teardown ロジックが一度実行されることを保証し、環境をクリーンに保ちます。
CI における trap
バックグラウンドサービスを起動したり一時リソースを作成したりする CI ステップは、それらを解体するために EXIT を trap すべきです。job がキャンセルされるかタイムアウトすると、runner はシグナルを送ります。それを trap することで、環境が消える前にステップがログをフラッシュしたりサービスを停止したりできます。
managed runner でのクリーンな teardown
Latchkey runner では、プラットフォームは解体前に終了シグナルを送ります。EXIT や SIGTERM の trap は、実行が中断されたときにバックグラウンドサーバーを停止したり artifact をクリーンに保存したりする機会をステップに与えます。
重要なポイント
- trap は、シェルがシグナルを受け取るか終了するときにコマンドを実行します。
trap ... EXITは、スクリプトがどう終わろうと実行されるクリーンアップを一元化します。- CI では、trap により一時ファイルとバックグラウンドサービスが確実にクリーンアップされます。