LoginSignup
8
4

コードレビューには時間がかかる

コードレビューはソフトウェア開発プロセスにおいて重要なステップです。コードの品質を確保し、バグを未然に防ぐために欠かせません。しかし、人によるコードレビューには時間がかかるという課題があります。特に大規模なプロジェクトでは、レビュー対象のコード量が膨大になることがあり、レビュアーの負担も大きくなります。レビューの質を保ちながら効率を上げるためには、マージリクエストの概要を知ることができたり、問題のあるコードを検出できたり、コードの改善案が提示されたりすると良いと考えました。

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の値を入力します。
TriggerCommentsMerge request eventsにチェックを入れて、webhookを作成します。
スクリーンショット 2024-05-29 17.05.54.png

動作確認

マージリクエストを開いた時やマージリクエスト内で/improveとコメントしてみて、PR-Agentの反応があるかを確認してください。うまくいくとこのように反応があります。

スクリーンショット 2024-05-29 17.12.56.png

便利なコマンド一覧

最後に、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コードレビューを導入してから、レビューが効率的に進むようになったと感じています。皆様の導入のきっかけになれば幸いです。

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4