android向けQodanaをCircleCIで動かしてよしなに公開する

CircleCI Advent Calendar 2021 25日目です(すっかり時間過ぎてしまった)

自分はandroidアプリ開発者でCircleCIを使う機会も多く、JetpackComposeのVRテスト周りをCircleCIでうまく回す方法について書くつもりでしたが想定以上にandroidの話ばっかになってしまったので題材を変更しました


# Qodanaとは

[Qodana](https://www.jetbrains.com/qodana/)とはJetbrains社が開発している静的解析ツールです
イメージとしてIDEAをはじめとするIDEに搭載されていた解析ツールをCI上で動かしやすくパッキングしたものです
現状jvm, android, php, python, javascriptに対応しており、コード最適化のsuggestやライセンスチェックをオシャンティーに解析して表示してくれます



![sample](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608715/f735dfa9-91cd-f8ec-c170-90c62cdfb958.png)


# Qodanaのターゲット

Qodanaのターゲットは現状

- [GitHub Actions](https://www.jetbrains.com/help/qodana/github-actions.html)
- [GitHub App](https://www.jetbrains.com/help/qodana/qodana-github-application.html)
- [GitLab CI](https://www.jetbrains.com/help/qodana/gitlab.html)
- [Qodana TeamCity Plugin](https://www.jetbrains.com/help/qodana/qodana-teamcity-plugin.html)
- [Jenkins](https://www.jetbrains.com/help/qodana/jenkins.html)

となっており、シュッとCircleCIで使用できません
ですがQodana自体はDocker Imageとして配布されており、そちらを利用することで静的解析自体は行えます

*https://www.jetbrains.com/help/qodana/docker-images.html

# CircleCI上でのQodanaの動かし方

qodana自体はdockerイメージとして配布されているためCircleCI上では通常のdockerイメージを扱う要領で使用できます

docker hubのpull limitにかからないように認証を通してあげる必要があります

```yaml
job:
  page-generate:
    docker:
      - image: jetbrains/qodana-jvm-android
        auth:
          username: $DOCKERHUB_USERNAME
          password: $DOCKERHUB_PASSWORD
    steps:
      - checkout
      - run:
          name: run qodana
          command: |
            qodana --save-report -r docs
      - persist_to_workspace:
          root: .
          paths:
            - ./docs
```

# Qodanaの成果物の配布方法
Qodanaの成果物は静的htmlとして配布できます
そこでgithub pagesに公開する、もしくはCircleCIのビルドアーティファクトとして一時的に公開するのが現状のCircleCIでの使い方かなと考えました


# GitHub Page

先述のjobで生成したhtmlファイルをワークスペース経由で取り込み、github page用のブランチをチェックアウトしてそちらにコミットするだけです

ワークスペース経由でhtmlファイルをやり取りしている理由はqodanaのdockerイメージにはgitが含まれていないため、コミットできないからです

```yaml
jobs:
  page-deploy:
    docker:
      - image: cimg/base:2021.12
    steps:
      # githubページへの公開はwrite権限のあるdeploy keyが必要
      - ssh_key_setup
      - checkout
      - run:
          name: setup git
          command: |
            git config --global user.name "Circle CI"
            git config --global user.email "<>"
      - run:
          name: setup page branch
          command: |
            git pull origin main
            git fetch origin page
            git checkout page
            # ページ用ブランチのpushでCIが走らないようにコメントを設定
            git merge -m "[skip ci] tracking main" main
            rm -rf ./docs
      - attach_workspace:
          at: .
      - run:
          name: github page publish
          command: |
            git add .
            git commit -m "[skip ci] update qodana page"
            git push
```

こちらは[Sample](https://ryunen344.github.io/compose-regression/)で実際に生成されているGitHub Pageを確認できます
(GitHub Actions使えばいいじゃんという火の玉ボールはやめて・・・・・)


# ビルドアーティファクト
CircleCIには生成物を一時保存する[ビルドアーティファクト](https://circleci.com/docs/ja/2.0/artifacts/)という仕組みがあります

こちらを利用すると一時的に配布するバイナリやhtmlの確認がスムーズに行える(30日間で消える)ため非常に重宝しています

永続的なプロジェクトの状態を示すページとして使わない(一般的なlint等に使用する)のであればこちらを利用するのが便利かなと思いました

```yaml
orbs:
  gh: circleci/github-cli@1.1.0

jobs:
  page-store:
    docker:
      - image: cimg/base:2021.12
    steps:
      - attach_workspace:
          at: .
      - store_artifacts:
          path: .
      - gh/setup
      - run:
          name: comment to pr
          command: |
            if [ -n "${CI_PULL_REQUEST}" ]; then
              gh pr comment $CI_PULL_REQUEST -b ${CIRCLE_BUILD_URL}/artifacts/0/docs/index.html
            fi
```

先述の用途として使用する際にCircleCIのWebをいちいち開いてartifactのタブを開いて、というのは大変だと思うのでgithubであればプル陸のコメントにトップページへのリンクをコメントするようにしてあげると便利になりそうです

# おわりに

CircleCIのビルドアーティファクトは本当に便利(認証制御、htmlも表示してくれる)なのでもっと活用していきたいです
ﾜﾀｼﾊｻｰｸﾙｼｰｱｲﾁｮｯﾄﾃﾞｷﾙを身にまとえるようになりたいですね・・・・