好奇心の足跡

飽きっぽくすぐ他のことをしてしまうので、忘れないため・形にして頭に残すための備忘録。

使用しているOSSの一覧取得やライセンス確認を自動化/CI化したい話

製品やサービスを作って出荷・リリースする際に、中で使用しているOSSのライセンスをリストアップしたり確認したりするのって必須ですよね?
ただこの作業、人手でやるにはかなり面倒なところ。皆さんはどういうふうに使用しているOSSライセンスを確認されていますか?

OSSライセンスの種類や考え方、それぞれのライセンスで許可されていること・禁止されていることについての解説は下記などを参考にしていただくとして、
この記事では「じゃあ実際どうやって管理するの?」という点について書きたいと思います。

やりたいこと

サービスのリリース時に、使用しているOSSのライセンスが自分たちの使い方・情報提供方法で問題がないかを手軽に確認したい。特に、使用するOSSが全てpackage manager系のツールで管理されているようなプロジェクト において、手軽にOSSの一覧とそのライセンス形態がリストアップできないか?もしそれができるなら、OSSライセンスチェックをCIに組み込んで、想定外のライセンスが混入することを開発段階で防げないか?と思ったのが始まりでした。
会社によっては、実際のサービスインの前にOSS一覧を法務などに提出して、ちゃんと法的に問題ないか確認してもらうようなプロセスが整っているところもあるかと思います。そういったときも、前述の条件のような開発プロジェクトであれば、OSSとそのライセンスのリストアップくらいは自動でちゃちゃっとできるんじゃないかなーと。
また、CIで開発者が簡易的に確認しつつ、最終的にしっかり法務に確認してもらう、という両方でチェックができても良いかと思います。CIレベルで確認することによって、明らかに想定外のライセンスのOSSが混入している場合は、傷が浅いうちに気づくことができます。

f:id:kusuwada:20180907022515p:plain

ということで、これが実現できそうな「お手軽に使用しているOSS(とライセンス)の一覧を作れる」ツールを探しました。

OSSリストアップ・ライセンス確認ツールいろいろ

1. Github ライブラリ

github.com

githubからlicensedというライブラリが出ています。

紹介サイト(日本語)があったのでリンク。

OSSライブラリのライセンスをチェックしてくれるGitHub製ツール「licensed」 - Engineer's Way

特徴

  • npmやgemなどでインストールしたOSSライブラリのライセンスを集めてリストを作ってくれる。
  • 自分たちが許可してないライセンス(商用プロダクトにおけるGPLとか)が含まれていると教えてくれる。
  • 自分たちが直接使っているライブラリだけでなく、そのライブラリが依存している先のライブラリもどんどん掘り下げて集めてくれる。
  • GitHubの社内ツールがOSSとして公開されたもの。
  • rubyで書かれている。

ということでした。これが使えるなら、これを使うのが良さそう!
Github側のREADMEも見ましたが、現在対応しているSourceが下記とのこと。(2018年9月5日現在)

  • Bower
  • Bundler (rubygem)
  • Cabal
  • Go
  • Go Dep
  • Manifest lists
  • NPM
  • Pip

これらのパッケージでOSSを管理しているぜ!という場合は、このモジュールを使うのが良さそう。

2. Cookpad社のライブラリ

github.com

こちらの記事で紹介されていました。

オープンソースライセンスの管理を楽にする -Android アプリ編 - クックパッド開発者ブログ

特徴

こちらはAndroidアプリにおいて有用そうです。
また、これを改造した記事も見つけました。
オープンソースライセンスの管理をもっと楽にするために Cookpad のプラグインをフォークしてみた

3. ドンピシャの機能のライブラリが見つからなかったので作ってみた

Githubのlicensed、私が調査した時点ではまだPython(Pip)に対応していなかったたのと、問題のないOSSもライセンスやコード置き場へのリンクを含んだ情報をcsvでリストアップしたかったため、下記ツールを作成しました。

github.com

特徴

  • Github上のコードから、npmやgem,pipyなどのライブラリ管理ファイルをクロールしてOSS一覧を出力する
  • バージョン・ライセンス・著作者・ホームページ・ソースリポジトリなどの情報が出力できる
  • 現在対応しているのは gemfile (ruby gem), requirements.txt,
  • csv形式での出力に対応
  • 中身はpython

出力例

vuejs/vue リポジトリに対するクロール結果

f:id:kusuwada:20180905232834p:plain

本ツールの使用方法・その他のデモはこちらをご参照ください。

kusuwada.hatenablog.com

※ 自分の関わっている開発プロジェクト+αでの使い勝手のみ考慮して作成したので、対応言語が少なかったり機能も少ない状態です。プルリクエスト・issueなど歓迎しております。

解決手段 番外編

「お手軽に」とか、やりたかったこと、の開発プロジェクトの前提条件は無視して、とにかくOSSライセンスをしっかり確認・管理したいしたい場合の手段。

4. 有償ライセンス管理ソフトを使用する

これらが有名どころです。他のOSSライセンス管理と違い、OSSコードをコピーしてきたことが疑われるコードの検出機能がついていたり、パッケージ管理ファイルからのみの抽出ではなくソース自体を検査してくれるなど、他のOSSライブラリよりかなり手厚いライセンス管理が実現できます。
ただ、利用料が年額数万円以上とかなり高額になっており、小規模企業や個人開発には向かないという印象です。
製品開発の一部をまるっと外部に委託していて中に何がどう入っているかわからない状態のときは、こういったソフトを使うのが良いかと思います。

5. OSSライセンス管理ソフトを使用する

ライセンス管理ソフトを調査した差異、OSSのものはなかなかないな、という印象でした。そんな中で出会ったの下記になります。

特徴

  • 自サーバーもしくはPCにLocalServerを立ててGUIを起動して使用する
  • HP内製のライセンス文章抽出機能を使って、ソース中のライセンスと思われる表記を拾ってくる
  • 解析対象はソースコードなので、検出したいPackageが全て解析対象の中に本体が入っている必要がある
    • ※ package管理ファイルに記載されているだけではNG

ちょっと試しに利用してみましたが、文章抽出だからか、ソースによっては誤検出がかなり多かったです。また、解析対象にOSSコード本体を含んでいる必要があるため、package管理ファイルで管理しているライブラリもすべて取り込み済みの状態で解析に投げる必要があります。サーバーサイドで動作するようなコードだと特に、この状態になるのが実機上でのみだったりするので、そいういう用途では使用のハードルが若干高いように感じました。

まとめ

実はまだCIへの組み込みまではできていませんが、うまく回ったらまた記事を書きたいです。また「やりたいことが実現できそうなツールは他にもあるが、見つけられていないだけ」という可能性が高いので、見つけ次第この記事を更新していく予定です。

今回は開発した「ソースコード」のOSSライセンス確認に焦点を当てましたが、実際サーバーサイドで動作するようなサービスの場合は、動作環境に直接インストールされるようなOSSだったり、使用しているImageに予め入っているOSSだったりの確認も必要なのかな、と思ったりしています。このへんのライセンスに関する考え方はなかなかWeb上だけでは情報を集めづらく、専門家にお話を伺いたいところ。
この場合は利用するImageと、構築スクリプト内でinstallしているモジュールを拾ってこれれば同じようにCIに組み込めそうですね。

お硬い会社ではこの方法だけでOSSライセンスの確認OK!問題なし!とはならないと思いますが、開発の助けにはなるんじゃないかと思います。
個人開発の場合や、現在OSSライセンス確認できていないなぁというプロジェクトは、こういったツールをまずは導入してみるのが良いんじゃないでしょうか。