☠️

CI で `--if-present` は絶対に使うな というお話

2024/06/04に公開

タイトルの通りです

はじめに「CI で --if-present は絶対に使うな」

事前知識

--if-present は npm script の実行時につけられるオプション。
もし npm script が無くても exit 0 扱いにしてエラーにしない。

https://docs.npmjs.com/cli/v6/commands/npm-run-script

You can use the --if-present flag to avoid exiting with a non-zero exit code when the script is undefined. This lets you run potentially undefined scripts without breaking the execution chain.

https://pnpm.io/cli/run#--if-present

You can use the --if-present flag to avoid exiting with a non-zero exit code when the script is undefined. This lets you run potentially undefined scripts without breaking the execution chain.

あっ、まったく同じ文章なんだな...

yarn には見つからなかったので npm と pnpm のみに存在する?

背景

下記のような step があった。

npm run lint --if-present

一見すると lint 通してそうですね。
でも、CI で通っているはずなのに、デプロイのステップで lint エラーが出現するという事態が起こったわけです。

問題

「もし lint のスクリプトが無くても CI 通るし、便利じゃん」
危険すぎます。

ケース1「npm script 書き換えよう」

チェック系の script まとめたいし、lint じゃなくて check:lint とかにしようかな?

はい、この変更以降、lintチェックは一切動いていないのに誰も気づきません。

ケース2「typo しちゃった」

npm run lnit --if-present

typo しちゃってるけど、CI 通ってるし大丈夫そうだね。

はい、何にも担保できてないステップで Action 時間だけ消費してるのに誰も気づきません。

結論「CI で --if-present は絶対に使うな」

補足

もちろん、定常的かつ確実性が必要なプロセスでなければ、--if-present は便利に使えるタイミングもあります。

npm run fix:format --if-present --workspaces

こんな感じで実行できれば、fix:format が定義されたものだけでしっかり フォーマット fix できたりします。

commit の hooks に入れてもいいかもしれないですね。

Discussion