たった1行追加するだけでyarn.lockの更新忘れを自動で検出する方法
普段の業務において、パッケージ管理しているライブラリのバージョンを手作業で変更した際、yarn.lock
を更新し忘れていることにレビューで気がつくことが何回かありました。
そこで、yarn.lock
の更新忘れを自動で検出できないか調べていたところ、たった1行追加するだけで実現できたので紹介します。
更新忘れによって発生する問題
yarn.lock
の更新忘れによって実際に発生していた問題としては、以下2つの例があります。
更新忘れがレビューで止まる場合
-
yarn.lock
の更新忘れにレビュアーが気づく - レビュイーに伝える
- レビュイーが
yarn.lock
を更新してpush
更新忘れがレビューで止まらなかった場合
-
yarn.lock
が更新されていない状態で、develop
ブランチなど開発の主軸となるブランチに反映される - 他の作業者が1の変更を取り込む
- 依存関係をインストールする
-
yarn.lock
に差分が発生して異常に気がつく -
yarn.lock
を更新し忘れた作業者を探して確認をとる -
yarn.lock
を更新するためだけのプルリクエストを作成
どちらの例も、更新忘れによって、手直しや確認といったムダな作業やコミュニケーションが発生していました。
このような、更新忘れによって発生するムダな作業やコミュニケーションをなくすため、yarn.lock
の更新忘れを自動で検出できる仕組みを作ることにしました。
環境
yarnのv1
を使っています。
"yarn": "1.22.19"
追加するコードは1行だけ
以下のコードをCI/CDのワークフローに組み込むことで、yarn.lock
の更新忘れを自動で検出できます。
- run: "! git diff --name-only | grep yarn.lock"
ちなみに、こちらのコードはyarn
のissue
上でのやりとりを参考にしています。
各コマンドの解説
git diff --name-only
git diff
コマンドで変更されたファイルの差分を表示させます。
このとき、--name-only
オプションを付与することで、変更されたファイルの名前のみをリストアップすることができます。
$ git diff --name-only
yarn.lock
| grep yarn.lock
パイプ(|
)は、左側のコマンドの出力を右側のコマンドの入力として渡し、grep
コマンドで指定した文字列を検索しています。
つまり、git diff --name-only
からの出力に対して、grep
コマンドで指定したyarn.lock
が含まれているかどうかをチェックします。
!
コマンドの最初にエクストラメーションマークをつけることによって、結果を反転させています。
そのため、grep
コマンドで指定した文字列(yarn.lock)が見つからなかった場合は成功と見なされ、見つかった場合は失敗と見なされます。
実際の利用方法
yarn.lock
の更新忘れを検出するコマンドをCI/CDのワークフローに組み込んで、依存関係をインストールし終えた後に実行します。
これにより、プルリクエスト作成時など、レビューやマージする前の段階でyarn.lock
の更新忘れを自動で検出し、開発者に通知することができます。
- name: Install dependencies
run: yarn install
- run: "! git diff --name-only | grep yarn.lock"
また、yarn.lock
の更新忘れを検出するステップに名前をつけることで、どのステップでエラーになったのかが、より明確になります。
- name: Check yarn.lock
run: "! git diff --name-only | grep yarn.lock"
まとめ
たった1行追加するだけでyarn.lock
の更新忘れを自動で検出することができました。
とはいえ、Dependabotで依存関係を自動で更新している場合ではyarn.lock
の更新忘れの心配はありません。
ですが、Dependabot
を導入していなかったり、特定のバージョンに依存して手動でライブラリを更新する必要がある場合など、手動でpackage.json
を変更してyarn.lock
の更新を忘れてしまうことは意外とありえるのかなとも感じています。
そのため、同じような問題を抱えている方の参考になれば幸いです。
最後まで読んでいただきありがとうございました。
Discussion