
プロダクト開発本部でバックエンドエンジニアをしている渡辺です。
本記事では、kickflowで導入していたCode Climate QualityというサービスをQltyというサービスに移行したことについて紹介します。
- 移行の経緯
- なぜQltyなのか?
- kickflowにおける静的解析の運用
- 移行手順とqlty.tomlの設定
- Qlty Cloud連携
- カバレッジ計測の刷新と並列実行への対応
- GitHub Actionsの実装
- 動作確認とまとめ
- We are hiring!
移行の経緯
kickflowプロジェクトでは、これまでコード品質の可視化に Code Climate Quality を利用してきました。 しかし、同サービスの終了と新会社 Qlty Software へのスピンアウトに伴い、私たちも正式にQltyへの移行を決定しました。
なぜQltyなのか?
移行作業に入る前に、Qltyの魅力について少し触れておきたいと思います。単なるCode Climateの後継というだけでなく、現代の開発フローに合わせた強力なアップデートが施されています。
爆速で動作するRust製CLI: QltyのエンジンはRustで書かれており、非常に高速です。最大のメリットは 「ローカル環境でCIと同じ解析が簡単に、一瞬で実行できる」 点です。
qlty checkコマンドを叩くだけで、手元の環境で静的解析や重複検知を実行できるため、「プッシュしてCIが落ちるのを待つ」という無駄な時間を削減できます。All-in-One の静的解析プラットフォーム: Linter、Formatter、セキュリティ診断、そしてカバレッジ計測までを一つのツールで完結できます。 kickflowで利用しているRuboCopやESLintなども、Qltyはプラグインとしてネイティブにサポートしています。 今回の移行ではまずは既存の構成を踏襲しましたが、将来的にはこれらの設定をQltyに一元化し、CI設定をシンプルにしていくことも可能です。
AIによる修正提案 (AI Autofix): Qltyはモダンなツールらしく、検知した問題に対してAIによる修正提案を行ってくれます。これにより、単に「悪いコード」を指摘されるだけでなく、修正のサイクルを高速に回すことができます。
kickflowにおける静的解析の運用
移行作業に入る前に、kickflowでの静的解析の運用スタイルについて触れておきます。
私たちはCode Climate Qualityを 「保守性・複雑度の可視化」 と 「カバレッジの集計」 に特化して利用していました。
Code Climate Qualityの役割:
- 複雑度(Complexity)の計測
- 行数が多すぎるファイル/メソッドの検知
- 重複コードの検知
- テストカバレッジの可視化
CI (GitHub Actions) の役割:
- Linter (RuboCop, ESLint) によるスタイルチェック
- テストの実行
Code Climate QualityではMaintainabilityやTest Coverageを管理しており、今回のQlty移行でもこの構成を踏襲する方針で設定を進めました。
移行手順とqlty.tomlの設定
Qlty公式のMigration Guideによると、Code Climate Qualityからの移行には標準的なフローが用意されています。基本的にはこのガイドに従いつつ、kickflowのプロジェクト構成に合わせたチューニングを行いました。
CLIの導入と既存設定の引き継ぎ
まず、ローカル環境で検証を行うために Qlty CLI をインストールします。
次に、既存の .codeclimate.yml をベースに設定ファイルのひな形を作成します。Qltyには qlty config migrate というコマンドが用意されており、これを実行することで Code Climate Quality の設定を読み取り、Qlty用の設定ファイル(.qlty/qlty.toml)へ自動変換してくれます。
# Code Climate Qualityの設定を読み取り、qlty.tomlを生成 $ qlty config migrate
これにより、これまで活用してきたCode Climate Qualityの設定を無駄にすることなく引き継ぐことができました。
重複検知設定の検証
Code Climate Qualityでは similar-code や identical-code という項目で重複検知を管理していましたが、Qltyでは [smells.duplication] がこれに該当します。
公式ドキュメントによると、すべての smells 設定はデフォルトで有効化されています。 移行元の .codeclimate.yml でもデフォルト値を使用していたことから、今回は qlty.toml への記述を省略し、Qltyのデフォルト設定をそのまま利用することにしました。
Qlty Cloud連携
ローカルでの設定が完了したら、次は Qlty Cloud との連携です。 Code Climate Quality時代はトークンを手動で発行してCIに埋め込む作業が必要でしたが、QltyはGitHub Appベースで連携するため、導入が非常にスムーズでした。
手順は以下の通りです。
- Qlty.sh にアクセスし、GitHubアカウントでサインイン
- 「Add a GitHub Installation」から、kickflow Organizationを選択してアプリをインストール
- アクセス対象として kickflow リポジトリを選択
- ダッシュボードで「Add Project」をクリックし、リポジトリを追加
これで無事に連携が完了しました。
カバレッジ計測の刷新と並列実行への対応
今回の移行における最大の技術的課題は、「並列で実行されるCIのカバレッジをどう統合するか」でした。
Code Climate Qualityのサービス終了(EOL)に伴い、カバレッジ計測の仕組みについても、Qltyが提供する最新の方法に合わせて刷新することにしました。
1. SimpleCov JSONをそのまま利用
QltyはRuby標準の SimpleCov が出力する .resultset.json をネイティブにサポートしています。
以前はカバレッジ送信のために専用のバイナリツール(cc-test-reporter)をインストールし、フォーマット変換やファイルの結合をCI上で行う必要がありましたが、これにより、フォーマット変換用のGemやスクリプトが不要になり、既存のファイルをそのまま送信するだけで良くなりました。
2. Server-Side Merging(サーバーサイドマージ)
kickflowのCI(GitHub Actions)はRSpecを並列で実行しています。 通常、並列実行のカバレッジを統合するには、アーティファクトを経由してファイルをかき集める複雑なジョブが必要ですが、Qltyは「Server-Side Merging」という機能を提供しています。
これは、「分割されたデータをとりあえずサーバーに送り、最後に『完了』の合図を送ることでサーバー側で結合してもらう」という仕組みです。
私たちは、ドキュメントで推奨されている「Incomplete + Complete Signal」方式を採用しました。
GitHub Actionsの実装
具体的な作業として、.github/workflows 以下のファイルを更新し、以下のフローを構築しました。
GitHub Secrets の登録 Qlty Cloud のプロジェクト設定画面から発行したカバレッジ用トークンを、GitHub Secrets に登録しました。ここではキー名を
QLTY_TOKENとしています。並列ジョブ側の修正 並列で動くテストジョブの最後に、カバレッジを「不完全(incomplete)」な状態で送信するステップを追加しました。
# ci.yaml (テスト実行ジョブ) steps: # ... (RSpec実行) ... # Qltyへ送信(incompleteフラグを付与) # カバレッジファイルが存在する場合のみ実行する条件を追加推奨 - name: Upload coverage to Qlty if: always() && hashFiles('coverage/.resultset.json') != '' uses: qltysh/qlty-action/coverage@v2 with: token: ${{ secrets.QLTY_TOKEN }} files: coverage/.resultset.json incomplete: true
- 完了シグナル用ジョブの追加 すべての並列ジョブが成功した後に実行されるジョブを追加し、「完了(complete)」の合図を送ります。
# ci.yaml (完了シグナル用ジョブ) coverage_complete: needs: test_backend runs-on: ubuntu-latest # テストジョブが成功した時のみ実行する if: always() && needs.test_backend.result == 'success' steps: - name: Send complete signal uses: qltysh/qlty-action/coverage@v2 with: command: complete token: ${{ secrets.QLTY_TOKEN }}
- Code Climate Quality設定の削除 最後に、Code Climate Qualityへの送信に使っていた環境変数や、ダウンロードスクリプトを呼び出している箇所をソースコードから完全に削除し、リポジトリをクリーンな状態にしました。
動作確認とまとめ
修正用のブランチを作成してCIを実行したところ、並列テストの実行からアップロード、完了シグナルの送信までエラーなく完了することを確認できました。
なお、Qlty Cloudの仕様上、メインのダッシュボードにカバレッジ集計が反映されるのは「デフォルトブランチ(main/develop)」での実行時となるようです。今回の作業ブランチでの実行結果はダッシュボードには即時反映されませんでしたが、PRのマージ後に正式な数値が表示されました。
移行を終えて
今回の移行作業を通じて、以下の成果が得られました。
- カバレッジ計測の復旧: サーバーサイドマージにより、並列テスト環境でも正確なカバレッジ計測が可能になった。
- 並列集計フローの簡素化: 以前は各ノードのカバレッジファイルをアーティファクト経由で集めて結合する必要があったが、Qltyは各ノードから直接サーバーに送信するだけで良いため、CIの構成がシンプルになった。
- 解析速度の向上: 不要なディレクトリを除外設定で徹底的に弾いたことや、Rust製CLIの恩恵により、ローカルでの確認も高速化した。
Code Climate Qualityは、2025年7月18日をもってサービスを終了しました。
本来であればその日までに移行を完了させておくべきでしたが、正直なところ「プロダクトの稼働に直結しないし…」と油断して、対応をつい後回しにしてしまいました。
ぜひこの記事を読んでいるみなさんは、EOLのアナウンスが来たら(まだ動いているうちに!)余裕を持って対応することをおすすめします。やっぱり「夏休みの宿題」は早めにやるに限りますね(自戒)。
We are hiring!
kickflow(キックフロー)は、運用・メンテナンスの課題を解決する「圧倒的に使いやすい」クラウドワークフローです。
kickflowでは、今回ご紹介したようなモダンな開発ツールの導入や、エンジニアの生産性を最大化するための環境改善に日々取り組んでいます。
私たちと一緒に、最高の開発体験を追求していきませんか? 少しでも興味を持ってくださった方は、ぜひ採用サイトをご覧ください。