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

Ryosuke Horie

August 11, 2021
Tweet

More Decks by Ryosuke Horie

Other Decks in Programming

Transcript

  1. ktlintカスタムルールのパッケージ化と再利用

    2021/8/12(Thu) 

    potatotips #75

    株式会社ZOZOテクノロジーズ

    ZOZOTOWN本部 ZOZOアプリ部 Androidチーム

    テックリード 堀江 亮介
    Copyright © ZOZO Technologies, Inc.

    View full-size slide

  2. © ZOZO Technologies, Inc.
    株式会社ZOZOテクノロジーズ

    ZOZOTOWN本部 ZOZOアプリ部 Androidチーム

    テックリード
    堀江 亮介

    ● 自動化とビールが好き
    ● @Horie1024

    2

    View full-size slide

  3. © ZOZO Technologies, Inc.
    https://zozo.jp/

    3
    ● 日本最大級のファッション通販サイト

    ● 1,400以上のショップ、8,200以上のブランドの取り扱い(ともに2021年3月
    末時点)

    ● 常時83万点以上の商品アイテム数と毎日平均2,900点以上の新着 商品
    を掲載

    ● コスメ専門モール「ZOZOCOSME」や靴の専門モール

    「ZOZOSHOES」、ラグジュアリー&デザイナーズゾーン

    「ZOZOVILLA」を展開

    ● 即日配送サービス

    ● ギフトラッピングサービス

    ● ツケ払い など


    View full-size slide

  4. © ZOZO Technologies, Inc.
    4
    最近の業務内容

    ● ZOZOTOWNと並行して新規事業のAndroidアプリ開発

    ● Jetpack Composeでの開発を検討中

    2021年3月期 決算説明会補足資料 - 株式会社ZOZO, https://d31ex0fa3i203z.cloudfront.net/assets/ja/ir/pdf/webup_fy20204q_j.pdf

    View full-size slide

  5. © ZOZO Technologies, Inc.
    5
    ● Androidアプリ開発でコードスタイルチェックにktlintを使用

    ● ktlintはカスタムルールを作成可能

    ● カスタムルールを複数のプロジェクトで再利用できると嬉しい

    今日話す内容


    View full-size slide

  6. © ZOZO Technologies, Inc.
    6
    ● Kotlinの静的コード解析ツール(linter)

    ● CIへの組み込みも簡単

    ● カスタムルールを作成可能

    ○ 自分達独自のコーディング規約に沿っているかをチェックできる

    ktlint


    View full-size slide

  7. © ZOZO Technologies, Inc.
    7
    ● 複数のプロジェクトでカスタムルールを再利用できると便利

    ○ 例: 社内Aプロジェクトと社内Bプロジェクトで使いたい

    ● ktlintカスタムルールをパッケージ化して公開

    ● 各プロジェクトはパッケージからカスタムルールを利用

    ktlintカスタムルールの再利用


    View full-size slide

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

    8

    View full-size slide

  9. © ZOZO Technologies, Inc.
    9
    ● カスタムルール開発用のプロジェクトとRepositoryを作成

    ● カスタムルールを配置するGradleモジュールを作成

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

    カスタムルールの作成


    View full-size slide

  10. © ZOZO Technologies, Inc.
    10
    カスタムルールの作成: モジュール内の構成

    ● javaディレクトリ

    ○ 作成したルールを配置

    ● testsディレクトリ

    ○ ルールのテストコードを配置

    ● resourcesディレクトリ

    ○ プロバイダ構成ファイルを配置


    View full-size slide

  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」

    ● 今回ルールの実装方法については紹介しない


    View full-size slide

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

    class CustomRuleSetProvider: RuleSetProvider {
    override fun get(): RuleSet = RuleSet(
    "custom-rules",
    NoVarRule(),// 作成したカスタムルールを登録
    )
    }
    ● com.pinterest.ktlint.core.RuleSetProviderを継承

    ● RuleSetクラスに作成したルールのインスタンスを登録

    ● コンストラクタの第一引数はid、第二引数以降がルール


    View full-size slide

  13. © ZOZO Technologies, Inc.
    13
    カスタムルールの作成: プロバイダ構成ファイルの作成

    com.horie1024.custom_rules.CustomRuleSetProvider
    ● ktlintはMETA-INF/services/com.pinterest.ktlint.coreを識別

    ● ktlintのRuleSetsLoader.ktでカスタムルールがロード

    ● 作成したCustomRuleSetProviderへのパスを記述


    View full-size slide

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


    View full-size slide

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


    View full-size slide

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

    16

    View full-size slide

  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")
    }
    }
    }
    }

    View full-size slide

  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

    View full-size slide

  19. © ZOZO Technologies, Inc.
    19

    View full-size slide

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

    20

    View full-size slide

  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"
    ...
    }

    View full-size slide

  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'
    }

    View full-size slide

  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
    }
    }
    }

    View full-size slide

  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


    動作確認環境とサンプルコード


    View full-size slide

  25. © ZOZO Technologies, Inc.
    25
    ● ktlintのカスタムルールを複数のプロジェクトで再利用したい

    ● ライブラリ化して公開することで簡単に再利用可能

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

    まとめ


    View full-size slide