Slide 1

Slide 1 text

ktlintカスタムルールのパッケージ化と再利用
 2021/8/12(Thu) 
 potatotips #75
 株式会社ZOZOテクノロジーズ
 ZOZOTOWN本部 ZOZOアプリ部 Androidチーム
 テックリード 堀江 亮介 Copyright © ZOZO Technologies, Inc.

Slide 2

Slide 2 text

© ZOZO Technologies, Inc. 株式会社ZOZOテクノロジーズ
 ZOZOTOWN本部 ZOZOアプリ部 Androidチーム
 テックリード 堀江 亮介
 ● 自動化とビールが好き ● @Horie1024 
 2

Slide 3

Slide 3 text

© ZOZO Technologies, Inc. https://zozo.jp/
 3 ● 日本最大級のファッション通販サイト
 ● 1,400以上のショップ、8,200以上のブランドの取り扱い(ともに2021年3月 末時点)
 ● 常時83万点以上の商品アイテム数と毎日平均2,900点以上の新着 商品 を掲載
 ● コスメ専門モール「ZOZOCOSME」や靴の専門モール
 「ZOZOSHOES」、ラグジュアリー&デザイナーズゾーン
 「ZOZOVILLA」を展開
 ● 即日配送サービス
 ● ギフトラッピングサービス
 ● ツケ払い など


Slide 4

Slide 4 text

© ZOZO Technologies, Inc. 4 最近の業務内容
 ● ZOZOTOWNと並行して新規事業のAndroidアプリ開発
 ● Jetpack Composeでの開発を検討中
 2021年3月期 決算説明会補足資料 - 株式会社ZOZO, https://d31ex0fa3i203z.cloudfront.net/assets/ja/ir/pdf/webup_fy20204q_j.pdf

Slide 5

Slide 5 text

© ZOZO Technologies, Inc. 5 ● Androidアプリ開発でコードスタイルチェックにktlintを使用
 ● ktlintはカスタムルールを作成可能
 ● カスタムルールを複数のプロジェクトで再利用できると嬉しい
 今日話す内容


Slide 6

Slide 6 text

© ZOZO Technologies, Inc. 6 ● Kotlinの静的コード解析ツール(linter)
 ● CIへの組み込みも簡単
 ● カスタムルールを作成可能
 ○ 自分達独自のコーディング規約に沿っているかをチェックできる
 ktlint


Slide 7

Slide 7 text

© ZOZO Technologies, Inc. 7 ● 複数のプロジェクトでカスタムルールを再利用できると便利
 ○ 例: 社内Aプロジェクトと社内Bプロジェクトで使いたい
 ● ktlintカスタムルールをパッケージ化して公開
 ● 各プロジェクトはパッケージからカスタムルールを利用
 ktlintカスタムルールの再利用


Slide 8

Slide 8 text

© ZOZO Technologies, Inc. カスタムルールの作成とパッケージ化
 8

Slide 9

Slide 9 text

© ZOZO Technologies, Inc. 9 ● カスタムルール開発用のプロジェクトとRepositoryを作成
 ● カスタムルールを配置するGradleモジュールを作成
 ● カスタムルールの開発はこのcustom-rulesモジュールで行う
 カスタムルールの作成


Slide 10

Slide 10 text

© ZOZO Technologies, Inc. 10 カスタムルールの作成: モジュール内の構成
 ● javaディレクトリ
 ○ 作成したルールを配置
 ● testsディレクトリ
 ○ ルールのテストコードを配置
 ● resourcesディレクトリ
 ○ プロバイダ構成ファイルを配置


Slide 11

Slide 11 text

© ZOZO Technologies, Inc. 11 カスタムルールの作成: カスタムルールの実装
 class NoVarRule : Rule("no-var") { override fun visit( node: ASTNode, autoCorrect: Boolean, emit: (offset: Int, errorMessage: String, canBeAutoCorrected: Boolean) -> Unit ) { if (node.elementType == ElementType.VAR_KEYWORD) { emit(node.startOffset, "😱 Unexpected var, use val instead 🏄 ", false) } } } ● com.pinterest.ktlint.core.Ruleを継承
 ● ktlintのktlint-ruleset-templateにある「NoVarRule」
 ● 今回ルールの実装方法については紹介しない


Slide 12

Slide 12 text

© ZOZO Technologies, Inc. 12 カスタムルールの作成: CustomRuleSetProviderへの登録
 class CustomRuleSetProvider: RuleSetProvider { override fun get(): RuleSet = RuleSet( "custom-rules", NoVarRule(),// 作成したカスタムルールを登録 ) } ● com.pinterest.ktlint.core.RuleSetProviderを継承
 ● RuleSetクラスに作成したルールのインスタンスを登録
 ● コンストラクタの第一引数はid、第二引数以降がルール


Slide 13

Slide 13 text

© ZOZO Technologies, Inc. 13 カスタムルールの作成: プロバイダ構成ファイルの作成
 com.horie1024.custom_rules.CustomRuleSetProvider ● ktlintはMETA-INF/services/com.pinterest.ktlint.coreを識別
 ● ktlintのRuleSetsLoader.ktでカスタムルールがロード
 ● 作成したCustomRuleSetProviderへのパスを記述


Slide 14

Slide 14 text

© ZOZO Technologies, Inc. 14 カスタムルールの作成: カスタムルールでの指摘例


Slide 15

Slide 15 text

© ZOZO Technologies, Inc. 15 カスタムルールのパッケージ化
 publishing { publications { maven(MavenPublication) { groupId "com.horie1024" artifactId "custom-ktlint-rules" version "$VERSION" artifact sourceJar artifact "$buildDir/libs/custom-rules.jar" // include any transitive dependencies pom {...} } } } ● maven-publishプラグインを使用
 ● cusutom-rulesのbuild.gradle(or gradle.kts)に設定を記述
 ● ./gradlew build publishでパッケージ化


Slide 16

Slide 16 text

© ZOZO Technologies, Inc. 作成したパッケージの公開
 16

Slide 17

Slide 17 text

© ZOZO Technologies, Inc. 17 作成したパッケージの公開
 ● 一度公開すれば複数プロジェクトからの再利用が簡単
 ● 今回はGitHub Packagesを利用
 ● cusutom-rulesのbuild.gradleに設定を追加
 publishing { publications {...} repositories { maven { name = "GitHubPackages" url = uri("https://maven.pkg.github.com/horie1024/custom-ktlint-rules") credentials { username = project.findProperty("gpr.user") ?: System.getenv("USERNAME") password = project.findProperty("gpr.token") ?: System.getenv("TOKEN") } } } }

Slide 18

Slide 18 text

© ZOZO Technologies, Inc. 18 パッケージ化と公開の自動化
 ● パッケージ化と公開をGitHub Actionsで実行
 name: "Publish custom ktlint rules to the GitHub Packages" on: push: branches: - main paths: - 'custom-rules/src/main/java/com/horie1024/custom_rules/**.kt' jobs: publish: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Publish custom ktlint rules env: USERNAME: horie1024 TOKEN: ${{ secrets.GITHUB_TOKEN }} run: ./gradlew build publish

Slide 19

Slide 19 text

© ZOZO Technologies, Inc. 19

Slide 20

Slide 20 text

© ZOZO Technologies, Inc. プロジェクトからのパッケージの利用
 20

Slide 21

Slide 21 text

© ZOZO Technologies, Inc. 21 プロジェクトからのパッケージの利用: ktlintのセットアップ
 ● JLLeitschuh/ktlint-gradleを使用するのが簡単
 ● ./gradlew ktlintCheck で実行
 plugins { id "org.jlleitschuh.gradle.ktlint" version "10.1.0" } android {...} ktlint { version = "0.42.0" ... }

Slide 22

Slide 22 text

© ZOZO Technologies, Inc. 22 プロジェクトからのパッケージの利用: カスタムルールの読み込み
 ● dependenciesセクションにktlintRulesetを追加
 ● ktlintRulesetに公開したパッケージを指定
 ● プロジェクトからカスタムルールが利用可能
 plugins { id "org.jlleitschuh.gradle.ktlint" version "10.1.0" } android {...} ktlint { version = "0.42.0" ... } dependencies { ktlintRuleset 'com.horie1024:custom-ktlint-rules:1.0.0' }

Slide 23

Slide 23 text

© ZOZO Technologies, Inc. 23 GitHub Packagesからパッケージを利用するための認証設定
 ● パッケージの利用には認証が必要
 ● publicなrepositoryの場合でも認証が必要
 ● passwordにはread:packages権限を持つTokenを指定
 repositories { maven { name = "GitHubPackages" url = uri("https://maven.pkg.github.com/horie1024/custom-ktlint-rule") credentials { username = 'horie1024' // GitHubのユーザ名 password = 'YOUR_PERSONAL_ACCESS_TOKEN' // Access Token } } }

Slide 24

Slide 24 text

© ZOZO Technologies, Inc. 24 ● 動作確認環境
 ○ Android Studio Arctic Fox | 2020.3.1x86_64
 ○ JLLeitschuh/ktlint-gradle 10.1.0
 ○ ktlint 0.42.0
 ● サンプルコード
 ○ https://github.com/horie1024/custom-ktlint-rules
 
 動作確認環境とサンプルコード


Slide 25

Slide 25 text

© ZOZO Technologies, Inc. 25 ● ktlintのカスタムルールを複数のプロジェクトで再利用したい
 ● ライブラリ化して公開することで簡単に再利用可能
 ● GitHub Actions + Packagesで公開を自動化すると楽
 まとめ


Slide 26

Slide 26 text

No content