無職です。はたらいてます。 旧ブログ: 1 Entry per Day

CIをスキップするコミットメッセージをよく間違えるのでcommitフックでチェックする

CIサービスを使っていて「このコミットはドキュメント変えただけだからCI走らせなくていいや」みたいない場合、コミットメッセージに[ci skip]と含めてあげると、CI実行をスキップしてくれます。

ただ、このマジックワードをうろ覚えなので、いつもskip-ciとか微妙にミスった内容でコミットしてしまうことがありました。

なので、gitのコミットフックでチェックしてみます。

以下の内容で .git/hooks/commit-msg というファイルを用意してあげればフックが動きます。ファイルに実行権限を付け忘れないように注意。

#!/usr/bin/env node

// Check typo for "[ci skip]".
// FYI: https://srz-zumix.blogspot.com/2018/03/ci-ci-20183.html
const fs = require("fs");
const msg = fs.readFileSync(process.argv[2], { encoding: "utf8" });
const regexp = /\[?(skip[\s-]ci|ci[\s-]skip)\]?/gmi;
const expected = ["[ci skip]", "[skip ci]"];
const matched = msg.match(regexp);
if (matched && matched.length > 0 && !expected.includes(matched[0])) {
  console.error("Not commited!");
  console.error(`Use "[ci skip]" instead of "${matched[0]}", because it's wrong or not generaly.`);
  process.exit(1);
}

正規表現でそれっぽい文字列を引っ掛けて、各CIサービスで対応しているマジックワード[ci skip] または [skip ci])ではなかったらエラー扱いでコミットさせません。

慣れているJavaScriptで書くためにNode.jsで実行するスクリプトにしましたが、普通のshやRubyとかPearlとか好きな言語で書いてもいいと思います。

参考