Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ktlintカスタムルールのパッケージ化と再利用/Package and reuse ktlint custom rules

ktlintカスタムルールのパッケージ化と再利用/Package and reuse ktlint custom rules

Dbab5e5a1fd54531e1119ede6b3b9e65?s=128

Ryosuke Horie

August 11, 2021
Tweet

Transcript

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

    堀江 亮介 Copyright © ZOZO Technologies, Inc.
  2. © ZOZO Technologies, Inc. 株式会社ZOZOテクノロジーズ
 ZOZOTOWN本部 ZOZOアプリ部 Androidチーム
 テックリード 堀江

    亮介
 • 自動化とビールが好き • @Horie1024 
 2
  3. © ZOZO Technologies, Inc. https://zozo.jp/
 3 • 日本最大級のファッション通販サイト
 • 1,400以上のショップ、8,200以上のブランドの取り扱い(ともに2021年3月

    末時点)
 • 常時83万点以上の商品アイテム数と毎日平均2,900点以上の新着 商品 を掲載
 • コスメ専門モール「ZOZOCOSME」や靴の専門モール
 「ZOZOSHOES」、ラグジュアリー&デザイナーズゾーン
 「ZOZOVILLA」を展開
 • 即日配送サービス
 • ギフトラッピングサービス
 • ツケ払い など

  4. © ZOZO Technologies, Inc. 4 最近の業務内容
 • ZOZOTOWNと並行して新規事業のAndroidアプリ開発
 • Jetpack

    Composeでの開発を検討中
 2021年3月期 決算説明会補足資料 - 株式会社ZOZO, https://d31ex0fa3i203z.cloudfront.net/assets/ja/ir/pdf/webup_fy20204q_j.pdf
  5. © ZOZO Technologies, Inc. 5 • Androidアプリ開発でコードスタイルチェックにktlintを使用
 • ktlintはカスタムルールを作成可能
 •

    カスタムルールを複数のプロジェクトで再利用できると嬉しい
 今日話す内容

  6. © ZOZO Technologies, Inc. 6 • Kotlinの静的コード解析ツール(linter)
 • CIへの組み込みも簡単
 •

    カスタムルールを作成可能
 ◦ 自分達独自のコーディング規約に沿っているかをチェックできる
 ktlint

  7. © ZOZO Technologies, Inc. 7 • 複数のプロジェクトでカスタムルールを再利用できると便利
 ◦ 例: 社内Aプロジェクトと社内Bプロジェクトで使いたい


    • ktlintカスタムルールをパッケージ化して公開
 • 各プロジェクトはパッケージからカスタムルールを利用
 ktlintカスタムルールの再利用

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

  9. © ZOZO Technologies, Inc. 9 • カスタムルール開発用のプロジェクトとRepositoryを作成
 • カスタムルールを配置するGradleモジュールを作成
 •

    カスタムルールの開発はこのcustom-rulesモジュールで行う
 カスタムルールの作成

  10. © ZOZO Technologies, Inc. 10 カスタムルールの作成: モジュール内の構成
 • javaディレクトリ
 ◦

    作成したルールを配置
 • testsディレクトリ
 ◦ ルールのテストコードを配置
 • resourcesディレクトリ
 ◦ プロバイダ構成ファイルを配置

  11. © 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」
 • 今回ルールの実装方法については紹介しない

  12. © ZOZO Technologies, Inc. 12 カスタムルールの作成: CustomRuleSetProviderへの登録
 class CustomRuleSetProvider: RuleSetProvider

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

  13. © ZOZO Technologies, Inc. 13 カスタムルールの作成: プロバイダ構成ファイルの作成
 com.horie1024.custom_rules.CustomRuleSetProvider • ktlintはMETA-INF/services/com.pinterest.ktlint.coreを識別


    • ktlintのRuleSetsLoader.ktでカスタムルールがロード
 • 作成したCustomRuleSetProviderへのパスを記述

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


  15. © 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でパッケージ化

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

  17. © 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") } } } }
  18. © 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
  19. © ZOZO Technologies, Inc. 19

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

  21. © 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" ... }
  22. © 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' }
  23. © 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 } } }
  24. © 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
 
 動作確認環境とサンプルコード

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

    GitHub Actions + Packagesで公開を自動化すると楽
 まとめ

  26. None