サービスリリース

静的解析ツール「ruleman」をオープンソースとして公開しました

株式会社コードベースは、社内で開発したリポジトリ静的解析ツール「ruleman(ルールマン)」を、MITライセンスのオープンソースソフトウェアとして公開しました。npm経由で誰でもご利用いただけます。

rulemanは、リポジトリが満たすべき条件を設定ファイルに宣言的に記述し、それを自動で検証するコマンドラインツールです。「このファイルが存在すること」「設定ファイルのこの項目がこの値であること」といったルールをJSON形式で書いておくと、CI上でその逸脱を検出できます。

開発の背景

当社は業務システムを中心に、複数のクラウドサービスを開発・運営しています。それぞれ対象とする業界や業務は異なりますが、開発を効率化するため、コードベースの構成は意図的に共通化しています。ディレクトリ構造、設定ファイルの配置、CIの構成といった土台を揃えることで、担当するサービスが変わっても開発者がすぐに立ち上がれる状態を保つことが目的です。

一方で、サービスの数が増えるにつれて、この「揃えているはずの構成」を維持することそのものにコストがかかるようになりました。新しく追加されたリポジトリに必要な設定ファイルが用意されていない、共通のはずの設定値がいつの間にか一部のサービスだけ異なっている、といった小さなずれが積み重なると、共通化によって得ていた効率が少しずつ失われていきます。

こうしたずれは、レビューで気づけることもありますが、人の注意力に依存する方法では確実性がありません。構成の規律は、機械的に検証されるべきものだと考え、そのための道具としてrulemanを開発しました。当社では全リポジトリで共通利用しているCIワークフローにrulemanを組み込み、規約の検証を各サービスへ順次適用しています。

rulemanの主な機能

宣言的なルール定義

検査したい内容は、設定ファイルにルールとして列挙します。用意しているルールは次の4種類です。

  • ファイルの存在・不在の検査。必須ファイルが揃っていること、逆に混入してはいけないファイルがないことを検証します
  • ディレクトリの存在・不在の検査。空であること・空でないことも指定できます
  • 設定ファイルの内容の検査。JSON・YAML・TOMLに対応し、指定した項目が期待する値であることを検証します。完全一致のほか、部分一致や正規表現による検査も行えます
  • ファイルのハッシュ値の検査。意図しない変更が入っていないことを検証します

パスの指定にはワイルドカードが使えるため、「すべてのパッケージのpackage.jsonでライセンス表記が揃っていること」のような、リポジトリ全体にまたがる規約も1つのルールで表現できます。

組織をまたいだルールの共有

ルールをまとめた設定ファイルは、npmパッケージとして配布し、複数のリポジトリから参照できます。当社のように構成を共通化した多数のリポジトリを運用する場合、組織としての規約を一箇所で定義し、各リポジトリはそれを参照するだけという運用が可能になります。

CIへの組み込み

GitHub Actions上で実行すると、検出結果が該当ファイルへのアノテーションとして表示されます。CI以外の環境ではプレーンテキストで出力し、JSON形式での出力にも対応しているため、エディタや他のツールと組み合わせることもできます。

導入のしやすさ

Rustで実装した単一の実行ファイルとして動作し、Linux・macOS・Windowsそれぞれにビルド済みのバイナリを配布しています。Rustの開発環境を用意する必要はなく、npmでインストールするだけで利用できます。

オープンソースとして公開した理由

rulemanが解決しようとしている「複数のリポジトリで構成の規律を保つ」という課題は、当社に固有のものではないと考えています。同じ悩みを持つ開発現場で役立つ場面があるのではないかと考え、公開することにしました。

当社の開発は、数多くのオープンソースソフトウェアの上に成り立っています。日々享受している恩恵に対して、自分たちが作ったもので少しでも還元できる部分があれば、それは自然なことだと考えています。rulemanは今後も社内で使い続けるツールであり、実際の運用で見つかった改善は継続して反映していきます。ご意見やご要望は、GitHubのIssueでお気軽にお寄せください。

関連リンク