コードレビューには時間がかかる
コードレビューはソフトウェア開発プロセスにおいて重要なステップです。コードの品質を確保し、バグを未然に防ぐために欠かせません。しかし、人によるコードレビューには時間がかかるという課題があります。特に大規模なプロジェクトでは、レビュー対象のコード量が膨大になることがあり、レビュアーの負担も大きくなります。レビューの質を保ちながら効率を上げるためには、マージリクエストの概要を知ることができたり、問題のあるコードを検出できたり、コードの改善案が提示されたりすると良いと考えました。
GitLab DuoというサービスがあるけれどセルフホストのGitLabでは制限が多い
GitLab DuoはGitLabが提供するGitHub Copilotのようなものです。しかし、現時点ではセルフホストのGitLabには使えない機能も多く、特にマージリクエストの概要の生成や、脆弱性の指摘ができない点を不満に思いました。
オープンソースのコードレビューエージェントに注目した
そこで注目するのがPR-Agentというツールです。これをセルフホストすることで、より柔軟でカスタマイズ可能なコードレビュー環境を構築できます。また、セキュリティの観点でも安心して使用できます。
PR-Agentとは
PR-Agentは、CodiumAI社によって開発された、マージリクエストのレビューをより高速かつ効率的にするためのツールです。GitHubやGitLabなどのリポジトリ管理サービスと連携して動作します。GPT-4を使用して、PRの内容に基づいた様々なフィードバックを提供します。フィードバックには、説明の生成、レビュー、内容に対する質問への応答、コードの改善などが含まれます。
PR-Agentの使用方法としては、Dockerイメージの使用、ソースからの実行、GitHub Actionsとしての実行、Polling serverとしての実行、GitHub Appとしての実行、AWS Lambda Functionでのデプロイ、AWS CodeCommit、GitHub webhook serverでの実行、Bitbucketパイプラインとしての実行などがあります。
今回はソースからの実行方法を紹介します。
GitLabにPR-Agentを導入するための設定
GitLabにPR-Agentを導入するための手順を紹介していきます。
リポジトリのクローンとライブラリのインストール
GitHubリポジトリから最新のPR-Agentをダウンロードします。
git clone https://github.com/Codium-ai/pr-agent.git
/pr-agent
フォルダにすすみ、ライブラリをインストールします。
pip install -e .
シークレットファイルの設定
シークレットファイルをコピーし中身を書き換えます。
cp pr_agent/settings/.secrets_template.toml pr_agent/settings/.secrets.toml
最低限必要な箇所は、OpenAIキーと、パーソナルアクセストークンとシェアドシークレットです。
personal_access_token
はGitLabの「Preferences > Access Token」から取得できます。スコープapi
にチェックを入れて作ってください。
shared_secret
はテンプレートに含まれていませんが、Webhookの際の認証に使うので入れてください。
[openai]
key = "**********"
[gitlab]
personal_access_token = "**********"
shared_secret = "**********"
shared_secret
は任意の文字列です。生成は以下のコマンドでできます。
python -c "import secrets; print(secrets.token_hex(10))"
configuration.toml
ファイルの設定
pr-agent/pr_agent/settings/configuration.toml
にも設定する箇所があります。
[config]
git_provider = "gitlab"
git_provider
をgitlabにします。コードレビューの日本語化のためextra_instructions
に以下の英文を追加します。[pr_description]
・[pr_code_suggestions]
などにもextra_instructions
がありますので、全て設定してください。
[pr_reviewer]
extra_instructions = "Please use Japanese in descriptions."
Webhookを待ち受けるサーバープログラムを立ち上げる
PR-Agentを実行するための以下のプログラムを実行します。
python pr-agent/pr_agent/servers/gitlab_webhook.py
そうするとポート3000番でサーバーが起動します。
次にサーバーの公開URLを得る必要があります。今回は説明のため簡略化してngrokなどのローカルトンネルを立ち上げます。
ngrok http 3000
そうすると以下のようにURLを得ることができます。
Forwarding https://example.ngrok-free.app -> http://localhost:3000
GitLabのWebhook設定
GitLab上でWebhook設定を行い、マージリクエストが作成された際にPR-Agentが自動的にレビューを開始できるようにします。
対象のリポジトリにパーソナルアクセストークンを取得したユーザーがアクセスできるように招待しておきましょう。対象のリポジトリを開き、左側のメニューから「Settings > Webhooks」を開きます。
「Add New Webhook」を押し、URLは先ほど取得したURLに/webhook
と付けた値、ここではhttps://example.ngrok-free.app/webhook
を指定します。
Secret tokenには、シークレットファイルに設定したshared_secret
の値を入力します。
TriggerはComments
とMerge request events
にチェックを入れて、webhookを作成します。
動作確認
マージリクエストを開いた時やマージリクエスト内で/improve
とコメントしてみて、PR-Agentの反応があるかを確認してください。うまくいくとこのように反応があります。
便利なコマンド一覧
最後に、PR-Agentで使えるコマンド一覧を載せておきます。
/describe
マージリクエストの説明
説明 (タイトル、タイプ、概要、コードウォークスルー、ラベル) を自動的に生成します。
/review
自動レビュー
マージリクエスト、考えられる問題、セキュリティ上の懸念、レビュー作業などに関するフィードバックをします。
/improve
コードの提案
マージリクエストを改善するためのコードの提案をします。
/ask ...
質問への回答
マージリクエストに関する自由記述の質問に回答します。
/update_changelog
Changelog の更新
マージリクエストの変更を使用して CHANGELOG.md
ファイルを自動的に更新します。
/similar_issue
類似イシューの検索
類似のイシューを自動的に検索して提示します。
/add_docs
ドキュメントの追加
マージリクエストで変更されたメソッド/関数/クラスにドキュメントを生成します。
/generate_labels
カスタム ラベルの生成
ユーザーが定義した特定のガイドラインに基づいて、マージリクエスト のカスタム ラベルを生成します。
/analyze
分析
マージリクエストで変更されたコード コンポーネントを特定し、各コンポーネントのテスト、ドキュメント、およびコードの提案を対話的に生成できるようにします。
/custom_prompt
カスタム プロンプト
ユーザーが定義した特定のガイドラインに基づいて、PR コードを改善するためのカスタム提案を自動的に生成します。
/test component_name
テストの生成
コードの変更に基づいて、選択したコンポーネントの単体テストを生成します。
/checks ci_job
CI フィードバック
失敗した CI ジョブのフィードバックと分析を自動的に生成します。
/find_similar_component
類似コード
組織のコードベース内またはオープンソース コードから最も類似したコード コンポーネントを取得します。
まとめ
以上がPR-AgentをGitLabに導入する手順でした。AIコードレビューを導入してから、レビューが効率的に進むようになったと感じています。皆様の導入のきっかけになれば幸いです。