🤖
1分で出来る Android Lint と GitHub code scanning の連動
やり方
build.gradle.kts
app/build.gradle.kts
android {
  ...
  lint {
    sarifReport = true
    checkDependencies = true
  }
}
SARIF フォーマットでレポートを出力するようにします。マルチモジュール構成であっても、ルートの Android application プロジェクトで checkDependencies = true を設定(デフォルトは false)すれば、依存するサブモジュールについても解析され、結果もルートのプロジェクトの一つのレポートに含まれるようになります。
CI(GitHub Actions)
.github/workflows/android-lint.yml
name: Android Lint
on:
  pull_request:
  push:
    branches: [main]
jobs:
  lint:
    runs-on: ubuntu-latest
    permissions:
      security-events: write
      actions: read
      contents: read
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-java@v3
        with:
          distribution: 'zulu'
          java-version: 17
      - run: ./gradlew app:lintDebug
        continue-on-error: true
      - uses: github/codeql-action/upload-sarif@v3
        with:
          sarif_file: app/build/reports/lint-results-debug.sarif
SARIF ファイルをアップロードします。ちなみに private リポジトリで GitHub code scanning が有効になっていないと github/codeql-action/upload-sarif@v3 がエラーを吐きます。
continue-on-error の箇所は、lint のオプションで abortOnError を false にするか、もしくは ./gradlew app:lintDebug || true のように異常終了を握りつぶしてもよいです。
何が起こるの?
プルリクで自身が変更した行に Android Lint の指摘があれば annotation の形でコメントされます。

検出した問題はチケット化され、code scanning のビューで一覧の表示や追跡ができます。問題を修正したコードがマージされた場合は、チケットは自動的にクローズされます。

参考
- GitHub の code scanning のドキュメント
- Android Lint and Detekt warnings in GitHub pull requests
- Android Gradle Plugin 8.1 の Lint のドキュメント
- 1分で出来るモバイルアプリのセキュリティ向上
宣伝
来週(2024/1/31) こちらのイベントで話しますので、よろしければ。Android Lint に関しては今回の投稿のように特別に何かする必要がないので、それ以外のツールや code scanning を利用しない方法についてお話する予定です。




Discussion