CircleCI Advent Calendar 2021 25日目です(すっかり時間過ぎてしまった)
自分はandroidアプリ開発者でCircleCIを使う機会も多く、JetpackComposeのVRテスト周りをCircleCIでうまく回す方法について書くつもりでしたが想定以上にandroidの話ばっかになってしまったので題材を変更しました
Qodanaとは
QodanaとはJetbrains社が開発している静的解析ツールです
イメージとしてIDEAをはじめとするIDEに搭載されていた解析ツールをCI上で動かしやすくパッキングしたものです
現状jvm, android, php, python, javascriptに対応しており、コード最適化のsuggestやライセンスチェックをオシャンティーに解析して表示してくれます
Qodanaのターゲット
Qodanaのターゲットは現状
となっており、シュッとCircleCIで使用できません
ですがQodana自体はDocker Imageとして配布されており、そちらを利用することで静的解析自体は行えます
*https://www.jetbrains.com/help/qodana/docker-images.html
CircleCI上でのQodanaの動かし方
qodana自体はdockerイメージとして配布されているためCircleCI上では通常のdockerイメージを扱う要領で使用できます
docker hubのpull limitにかからないように認証を通してあげる必要があります
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が含まれていないため、コミットできないからです
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で実際に生成されているGitHub Pageを確認できます
(GitHub Actions使えばいいじゃんという火の玉ボールはやめて・・・・・)
ビルドアーティファクト
CircleCIには生成物を一時保存するビルドアーティファクトという仕組みがあります
こちらを利用すると一時的に配布するバイナリやhtmlの確認がスムーズに行える(30日間で消える)ため非常に重宝しています
永続的なプロジェクトの状態を示すページとして使わない(一般的なlint等に使用する)のであればこちらを利用するのが便利かなと思いました
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も表示してくれる)なのでもっと活用していきたいです
ワタシハサークルシーアイチョットデキルを身にまとえるようになりたいですね・・・・