PythonライブラリのライセンスチェックをCIに組み込みたい[pip-licenses , GitHub Actions]
エレベーターピッチ
- CIの一環としてライセンスのチェックを追加
- ライブラリのライセンスがホワイトリストかブラックリストに入っているかを確認
- 今まで無かったライセンスや受け入れられないライセンスを検知
- GitHub Actionsとして実行
- 無課金で実施可能
概要
Pythonの強みはライブラリの充実!!……であるがゆえに、誰もがついつい考えなしにライセンスを確認せずにライブラリをプロダクトに組み込んでしまう経験があるのではないでしょうか?
しかし当然ながら、私達開発者はライセンスの認める範疇でライブラリを使用しなくてはなりません。
特にプロダクトをリリースする際には細心の注意を払わなければなりません。
しかし、プロダクトのリリース時にアプリケーションのコア部分にいつの間に、受け入れがたい条項を含んだライセンスが組み込まれていた場合、その対応が辛いことになるのは火を見るよりも明らかです。場合によっては製品を公開出来なくなるリスクすら発生します。
特にGPLに感染しているのはあるあるです。
そうした状況を回避するためには、常日頃から新たに追加したライブラリのライセンスを監視し続けなければなりません。
……まぁ口で言うのは簡単ですよね。実際はライセンスをチェックしていくのはそれなりにしんどい&めんどくさい作業です。正直私は続けていける自信はありません。
そこで今回は、pip-licenses
というライブラリを使用し、ライセンスチェック作業の一部を自動化しGitHub ActionsのCIに組み込む方法をお伝えします。
pip-licenses
の使い方
インストール
pip-licenses
はpoetryやpipなど多くの環境で使用可能です。
ひとまず、pipとpoetryでのインストールは以下のコマンドを入力してください。
pip install pip-licenses
poetry add pip-licenses --dev
ライセンス一覧の取得
それでは早速ライセンスの一覧を取得しながら、インストールの成否を確認していきましょう。
以下のコマンドを入力すると、インストールされているライブラリとライセンスの一覧がソートして表示されるはずです。
pip-licenses --order=license
ホワイトリストによるライセンスチェック
次にCIのために、ホワイトリストによるチェックを行います。
やり方としては極めて単純で--allow-only
オプションに許可したいライセンスを ; 区切りで追加していきます。
例えば、MIT LicenseとBSD Licenseを許可する場合以下のコマンドを入力してください。
pip-licenses --allow-only="MIT License;BSD License;"
--allow-only
オプション以外にも出力形式や無視するライブラリの追加など様々なオプションがあります。今回のCIにはそこまで重要ではないのでいったん無視します。
GitHub Actionsでの実行
ここまで解説すれば、やりたいことは伝わっていると思います。後はGitHub ActionsにCIとして組み込めば完成です。
ホワイトリストによって一度目を通して問題がないライセンスに関してはいちいちライセンスに目を通す必要はなく、それ以外の未知のライセンスが追加された場合にアクションが失敗するように作っていきます。(ブラックリストも同様です)
失敗後は問題がないのであれば、許可リストに追加することが必要になります。
とはいえ、pip-licenses
とライブラリをインストールして、オプションをつけてチェックを一度実行するだけです。
出来上がったものは以下の通りです。
name: license-check
on:
push:
jobs:
license-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v3
with:
python-version: "3.9"
- name: Upgrade pip
run: |
pip install --upgrade pip
- name: Install Poetry
run: |
pip install -r requirements.txt
- name: Run Licenses Check
run: >
pip-licenses
--with-system
--allow-only="
MIT License;
BSD License;
"
現状ではホワイトリストを別ファイルに切り出すことができませんので、コマンドを改行してリスト化しています。
まとめ
以上pip-licenses
をCIに組み込む方法でした。
そこまで難しいものではないかもしれませんが、コピー&ペーストで作れるに越したことはないとは思いますのでよろしければお使いください。
Discussion