🔎

たった1行追加するだけでyarn.lockの更新忘れを自動で検出する方法

2024/04/10に公開

普段の業務において、パッケージ管理しているライブラリのバージョンを手作業で変更した際、yarn.lockを更新し忘れていることにレビューで気がつくことが何回かありました。
そこで、yarn.lockの更新忘れを自動で検出できないか調べていたところ、たった1行追加するだけで実現できたので紹介します。

更新忘れによって発生する問題

yarn.lockの更新忘れによって実際に発生していた問題としては、以下2つの例があります。

更新忘れがレビューで止まる場合

  1. yarn.lockの更新忘れにレビュアーが気づく
  2. レビュイーに伝える
  3. レビュイーがyarn.lockを更新してpush

更新忘れがレビューで止まらなかった場合

  1. yarn.lockが更新されていない状態で、developブランチなど開発の主軸となるブランチに反映される
  2. 他の作業者が1の変更を取り込む
  3. 依存関係をインストールする
  4. yarn.lockに差分が発生して異常に気がつく
  5. yarn.lockを更新し忘れた作業者を探して確認をとる
  6. yarn.lockを更新するためだけのプルリクエストを作成

どちらの例も、更新忘れによって、手直しや確認といったムダな作業やコミュニケーションが発生していました。
このような、更新忘れによって発生するムダな作業やコミュニケーションをなくすため、yarn.lockの更新忘れを自動で検出できる仕組みを作ることにしました。

環境

yarnのv1を使っています。

"yarn": "1.22.19"

追加するコードは1行だけ

以下のコードをCI/CDのワークフローに組み込むことで、yarn.lockの更新忘れを自動で検出できます。

- run: "! git diff --name-only | grep yarn.lock"

ちなみに、こちらのコードはyarnissue上でのやりとりを参考にしています。
https://github.com/yarnpkg/yarn/issues/4098#issuecomment-610990058

各コマンドの解説

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の更新忘れを自動で検出し、開発者に通知することができます。

build.yaml
- name: Install dependencies
  run: yarn install

- run: "! git diff --name-only | grep yarn.lock"

また、yarn.lockの更新忘れを検出するステップに名前をつけることで、どのステップでエラーになったのかが、より明確になります。

build.yaml
- name: Check yarn.lock
  run: "! git diff --name-only | grep yarn.lock"

まとめ

たった1行追加するだけでyarn.lockの更新忘れを自動で検出することができました。
とはいえ、Dependabotで依存関係を自動で更新している場合ではyarn.lockの更新忘れの心配はありません。
ですが、Dependabotを導入していなかったり、特定のバージョンに依存して手動でライブラリを更新する必要がある場合など、手動でpackage.jsonを変更してyarn.lockの更新を忘れてしまうことは意外とありえるのかなとも感じています。

そのため、同じような問題を抱えている方の参考になれば幸いです。

最後まで読んでいただきありがとうございました。

Discussion