Slide 1

Slide 1 text

license-list-pluginを使って OSSライセンス画面を自動生成する 2020/07/10 (Fri) potatotips #70 @syarihu

Slide 2

Slide 2 text

Taichi Sato (@syarihu) ● Money Forward, Inc. ○ Android Engineer ● TechBooster

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

OSSライセンス画面を手軽に作るためのツール ● oss-licenses-plugin ○ Google Play Services ● LicenseToolsPlugin ○ cookpad ● license-list-plugin ○ jmatsu

Slide 5

Slide 5 text

OSSライセンス画面を作るためのツール ● oss-licenses-plugin ○ Google Play Services ● LicenseToolsPlugin ○ cookpad ● license-list-plugin ○ jmatsu

Slide 6

Slide 6 text

oss-licenses-plugin ● Googleが公式で提供している ● ライセンスリストを自動生成、特定のActivityを呼び出す だけ ○ カスタマイズはできない ○ UIはちょっと微妙 ● 一部ライセンスが表示されないなどの問題があった ○ 依存関係が多い場合に問題に気づきにくい

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

jmatsu/license-list-plugin ● ライセンスリストを自動生成し、yamlに定義ファイルを出 力 ○ 人が読みやすい形なので、ライセンスの追加/変更/削 除も簡単にできる ○ oss-license-pluginと違いライセンスリストが隠蔽され ていないため、差分も分かりやすい

Slide 9

Slide 9 text

license-list-plugin ● 定義ファイルを元に表示用のhtmlを自動生成したり、カス タマイズした画面を提供するために利用可能なjsonの出 力も可能 ● ローカルライブラリにも対応

Slide 10

Slide 10 text

license-list-plugin ● ライセンスリストから除外したいライブラリがある場合 は.artifactignoreに記述することで簡単に除外可能 ● cookpad/LicenseToolsPluginを使っている場合は cookpadのプラグインで利用するlicenses.ymlからの移 行も可能

Slide 11

Slide 11 text

RecyclerView HTML

Slide 12

Slide 12 text

license-list-pluginへの移行 ● oss-licenses-pluginは便利だが、UIが微妙だったり、一 部ライセンスが表示されないなどの問題があったことか ら、ライセンス定義ファイルを自分で管理できたり、機能 が充実しているlicense-list-pluginへ移行することにした

Slide 13

Slide 13 text

license-list-pluginをどうやって使っているか ● 定義ファイルからjsonに吐き出して、jsonを元に RecyclerViewで画面を構築 ○ 最初作るのは手間だが、アプリのテーマカラーに合わ せられるし、1回作ってしまえばその後は定義ファイル を更新するだけでOK

Slide 14

Slide 14 text

license-list-pluginをどうやって使っているか ● 依存関係の更新時にライセンスリストを更新するのを忘 れてしまう可能性がある ○ 依存関係を更新したら自動でライセンス定義ファイル を更新するPRを作成

Slide 15

Slide 15 text

ライセンス定義ファイルを自動で更新するPRを作成 ● 依存関係をまとめたファイルDep.ktが変更されたかを Dangerを使って検知 ○ 検知したらPRに特定のラベルをつける ● GitHub Actionsで特定のラベルがついたときに発火する ワークフローを作成 ○ ライセンスリストを更新して自動でPRを立てるジョブを 作る

Slide 16

Slide 16 text

Dangerfile - 依存関係が更新されている場合はラベルをつける begin target_branch = github.branch_for_base.match(/release|develop/) is_dependencies_updated = git.modified_files.grep(/.*Dep.kt/).empty? if target_branch && !is_dependencies_updated pr_number = github.pr_json["number"] auto_label.set(pr_number, "Update licenses", "#1d76db") end end

Slide 17

Slide 17 text

Dangerfile - 依存関係が更新されている場合はラベルをつける begin target_branch = github.branch_for_base.match(/release|develop/) is_dependencies_updated = git.modified_files.grep(/.*Dep.kt/).empty? if target_branch && !is_dependencies_updated pr_number = github.pr_json["number"] auto_label.set(pr_number, "Update licenses", "#1d76db") end end

Slide 18

Slide 18 text

Dangerfile - 依存関係が更新されている場合はラベルをつける begin target_branch = github.branch_for_base.match(/release|develop/) is_dependencies_updated = git.modified_files.grep(/.*Dep.kt/).empty? if target_branch && !is_dependencies_updated pr_number = github.pr_json["number"] auto_label.set(pr_number, "Update licenses", "#1d76db") end end

Slide 19

Slide 19 text

Dangerfile - 依存関係が更新されている場合はラベルをつける begin target_branch = github.branch_for_base.match(/release|develop/) is_dependencies_updated = git.modified_files.grep(/.*Dep.kt/).empty? if target_branch && !is_dependencies_updated pr_number = github.pr_json["number"] auto_label.set(pr_number, "Update licenses", "#1d76db") end end

Slide 20

Slide 20 text

.github/workflow.yml - ラベルがついたら発火する name: Update license list on: pull_request: types: - labeled

Slide 21

Slide 21 text

.github/workflow.yml - 特定のラベルのみジョブを実行する jobs: build: runs-on: ubuntu-latest if: github.event.label.name == 'Update licenses' steps: - uses: actions/checkout@v2 with: ref: ${{ github.head_ref }} - name: set up JDK 1.8 uses: actions/setup-java@v1 with: java-version: 1.8

Slide 22

Slide 22 text

.github/workflow.yml - 特定のラベルのみジョブを実行する jobs: build: runs-on: ubuntu-latest if: github.event.label.name == 'Update licenses' steps: - uses: actions/checkout@v2 with: ref: ${{ github.head_ref }} - name: set up JDK 1.8 uses: actions/setup-java@v1 with: java-version: 1.8

Slide 23

Slide 23 text

.github/workflow.yml - ライセンス定義ファイルを更新する - name: Update license list run: | # ライセンス定義ファイルの差分を更新 ./gradlew mergeReleaseLicenseList # 定義ファイルを元にjsonを更新 ./gradlew visualizeReleaseLicenseList

Slide 24

Slide 24 text

.github/workflow.yml - ライセンス定義ファイルを更新する - name: Update license list run: | # ライセンス定義ファイルの差分を更新 ./gradlew mergeReleaseLicenseList # 定義ファイルを元にjsonを更新 ./gradlew visualizeReleaseLicenseList

Slide 25

Slide 25 text

.github/workflow.yml - ライセンス定義ファイルを更新する - name: Update license list run: | # ライセンス定義ファイルの差分を更新 ./gradlew mergeReleaseLicenseList # 定義ファイルを元にjsonを更新 ./gradlew visualizeReleaseLicenseList

Slide 26

Slide 26 text

.github/workflow.yml - 自動でPRを作成する - name: Create Pull Request uses: peter-evans/create-pull-request@v2 with: token: ${{ secrets.REPO_ACCESS_TOKEN }} commit-message: Updated license by license-list-plugin committer: syarihu author: syarihu title: Update license body: | This PR has been auto-generated branch: update-license-list branch-suffix: short-commit-hash

Slide 27

Slide 27 text

.github/workflow.yml - 自動でPRを作成する - name: Create Pull Request uses: peter-evans/create-pull-request@v2 with: token: ${{ secrets.REPO_ACCESS_TOKEN }} commit-message: Updated license by license-list-plugin committer: syarihu author: syarihu title: Update license body: | This PR has been auto-generated branch: update-license-list branch-suffix: short-commit-hash

Slide 28

Slide 28 text

.github/workflow.yml - 自動でPRを作成する - name: Create Pull Request uses: peter-evans/create-pull-request@v2 with: token: ${{ secrets.REPO_ACCESS_TOKEN }} commit-message: Updated license by license-list-plugin committer: syarihu author: syarihu title: Update license body: | This PR has been auto-generated branch: update-license-list branch-suffix: short-commit-hash

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

ライセンス定義ファイルを自動で更新するPRを作成 ● これで依存関係を更新したときに自動でPRが作成される ようになったので、ライセンスの更新忘れも無くなり人間 の手間もほとんど無くなった ● コミット時に自動でDeployGateにアップロードしてPRに QRコードがコメントされるようにしているので、差分に問題 がない場合はこれで動作確認をするだけでよくなった。最 高!

Slide 32

Slide 32 text

まとめ ● license-list-pluginを使うと定義ファイルの管理が簡単に なる ● json出力すればアプリに合ったテーマのOSSライセンス 画面を構築可能 ● ライセンス定義ファイルを自動更新、自動PRすれば手間 も更新忘れも無くなる

Slide 33

Slide 33 text

参考資料 ● jmatsu/license-list-plugin: Gradle plugin to manage licenses of your Android app's dependencies. ○ https://github.com/jmatsu/license-list-plugin ● Including Open Source Notices ○ https://developers.google.com/android/guides/opensource ● cookpad/LicenseToolsPlugin: Gradle plugin to check library licenses and generate license pages for Android ○ https://github.com/cookpad/LicenseToolsPlugin

Slide 34

Slide 34 text

ありがとうございました