チームでライブラリバージョンを最新に保つには?! ライブラリガーデニングのすゝめ

はじめに

こんにちは!Product Unit SINIS for Instagram開発チームでテックリードをしています工藤@metalic_kudo_hです。

現代のソフトウェア開発では、外部のライブラリの利用が一般的になっています。しかし、これらのライブラリのバージョンを最新に保つことは重要であるにもかかわらず、しばしば見過ごされがちです。皆さんのプロジェクトでは、最後にライブラリを更新したのはいつでしょうか?

私たちのチームでは、この問題に対応するために「ライブラリガーデニング」(以下ガーデニング)という活動を行っています。 これは、定期的に依存ライブラリを確認し、必要に応じて更新するプロセスです。 今回はそんなガーデニングをするメリットや方法についてご紹介しようと思います!

ライブラリバージョンを定期的に上げるメリット

バージョンが最新であることの恩恵

ライブラリを最新に保つことで、新機能の利用やシステムパフォーマンスの向上が期待できます。 また新しいバージョンでは既知の脆弱性が修正されていることがほとんどのため、セキュリティリスクの軽減にも繋がります。

ビックバンアップデートによる信頼性の低下を防ぐ

ライブラリのバージョンを定期的に上げてない場合、いざバージョンを上げるとなった際には複数のバージョンを跨ぐような大きなアップデートとなり、変更内容や影響範囲が広く、スケジュールの確保も難しくなります。

ライブラリのバージョンが古いことは典型的な技術負債でもあるため、小さく頻度多く対応することが対策の基本となります。

参考:技術的負債とどうやって戦うか #JavaScript - Qiita

ライブラリガーデニングの仕方

弊社では毎週火曜日にガーデニングをしています。 今回はComposerのガーデニングを例にしていますが、npmやpip等他のパッケージ管理ツールでも同様のことができます。

方法1:dependabot

1つめの方法はdependabotによるガーデニングで、特別な理由がなければこちらがオススメです。 下記dependabot設定ファイルは「毎週火曜日の日本時間10:00にGitHub WorkflowとComposerを対象に依存関係の更新をチェックし、更新可能なものがあればPRを作成する」というものです。

dependabotの有効化方法と詳細な構成ファイルについてはドキュメントをご確認ください Dependabot クイックスタート ガイド - GitHub Docs

version: 2
updates:
  - package-ecosystem: "github-actions"
    directory: ".github/workflows/"
    schedule:
      interval: "weekly"
      day: "tuesday"
      time: "10:00"
      timezone: "Asia/Tokyo"

  - package-ecosystem: "composer"
    directory: "/"
    schedule:
      interval: "weekly"
      day: "tuesday"
      time: "10:00"
      timezone: "Asia/Tokyo"

設定すると毎週dependabotが自動でPRを作成してくれます。 規模にもよりますが、1週間で1PRも作成されていない場合はdependabotが停止していないか確認したほうがよいです。dependabotがpnpm-lock.yamlのrebaseに失敗していて停止されていたこともありました。

PRの確認観点としてオススメなのは下記のような部分です。 変更内容の全てを確認するのは大変なため、dependabotが要約してくれた内容を確認するのが効率的です。

  • Release noteとChange Logで、破壊的変更 (Breaking Change)・非推奨 (Deprecated) による影響を受けていないか
  • 課題意識のあった実装や機能が、新たに追加された機能により解消していないか

方法2:outdatedコマンド

2つめの方法はoutdatedコマンドを使う方法です。 outdatedコマンドと言っていますが、ライブラリの最新バージョンを確認することができればなんでもOKです。

手順としては、まずはどのパッケージがアップデート可能な状態なのかを確認するためcomposer outdatedでアップデート可能なバージョンの一覧を確認し、その後composer requireで先ほどのバージョンを指定して個別にアップデートします。

その後アップデートした内容をPRで作成するのですが、その際にアップデート内容をGitHubのReleasesやChange logから確認し要約してdescriptionに記載すると、レビュワーの人が楽になります。

この方法でやっていることとしては、dependabotの手動版となるため、可能であればdependabotがオススメとなります。 ただ、dependabotの調子が悪くて利用できない時や、非推奨のライブラリが含まれていてdependabotでは解決できない時もあるため、その際はoutdatedコマンドを利用することになります。

おまけ:Slackbotで担当者決めをしよう

ガーデニングの対象リポジトリが増えると1人で保守していくのが大変になります。 そんな時は当番制にしましょう!

当番表のようなものを作るのも良いですが、毎回こちらから見にいくのは面倒という方はSlackbotにリマンドしてもらうのがオススメです。

最後に

ライブラリガーデニングはもともと同僚の方が前職から輸入し広まった文化です。 良い開発文化は輸入も輸出もしていきたいですね

面白い文化があればぜひ教えてください!


テテマーチでは、一緒にサービスを作り上げてくれる仲間を募集中です。ご興味のある方は、以下のリンクからぜひご応募ください! herp.careers

エンジニアチームガイドはこちら! tetemarche01.notion.site