GitLabにAIコードレビュー(PR-Agent)を導入する

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

## GitLab DuoというサービスがあるけれどセルフホストのGitLabでは制限が多い
https://about.gitlab.com/ja-jp/gitlab-duo/

GitLab DuoはGitLabが提供するGitHub Copilotのようなものです。しかし、現時点ではセルフホストのGitLabには使えない機能も多く、特にマージリクエストの概要の生成や、脆弱性の指摘ができない点を不満に思いました。

## オープンソースのコードレビューエージェントに注目した
そこで注目するのが[PR-Agent](https://github.com/Codium-ai/pr-agent)というツールです。これをセルフホストすることで、より柔軟でカスタマイズ可能なコードレビュー環境を構築できます。また、セキュリティの観点でも安心して使用できます。

# PR-Agentとは
https://github.com/Codium-ai/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を導入するための手順を紹介していきます。

https://pr-agent-docs.codium.ai/installation/locally/#run-from-source

### リポジトリのクローンとライブラリのインストール
GitHubリポジトリから最新のPR-Agentをダウンロードします。

```bash
git clone https://github.com/Codium-ai/pr-agent.git
```

`/pr-agent`フォルダにすすみ、ライブラリをインストールします。

```bash
pip install -e .
```

### シークレットファイルの設定
シークレットファイルをコピーし中身を書き換えます。
```bash
cp pr_agent/settings/.secrets_template.toml pr_agent/settings/.secrets.toml
```

最低限必要な箇所は、OpenAIキーと、パーソナルアクセストークンとシェアドシークレットです。
`personal_access_token`はGitLabの「Preferences > Access Token」から取得できます。スコープ`api`にチェックを入れて作ってください。
`shared_secret`はテンプレートに含まれていませんが、Webhookの際の認証に使うので入れてください。
```toml
[openai]
key = "**********"

[gitlab]
personal_access_token = "**********"
shared_secret = "**********"
```
`shared_secret`は任意の文字列です。生成は以下のコマンドでできます。
```bash
python -c "import secrets; print(secrets.token_hex(10))"
```

### `configuration.toml`ファイルの設定
`pr-agent/pr_agent/settings/configuration.toml`にも設定する箇所があります。
```toml
[config]
git_provider = "gitlab"
```
`git_provider`をgitlabにします。コードレビューの日本語化のため`extra_instructions`に以下の英文を追加します。**`[pr_description]`・`[pr_code_suggestions]`などにも`extra_instructions`がありますので、全て設定してください。**
```toml
[pr_reviewer]
extra_instructions = "Please use Japanese in descriptions."
```

### Webhookを待ち受けるサーバープログラムを立ち上げる
PR-Agentを実行するための以下のプログラムを実行します。
```bash
python pr-agent/pr_agent/servers/gitlab_webhook.py
```
そうするとポート3000番でサーバーが起動します。
次にサーバーの公開URLを得る必要があります。今回は説明のため簡略化してngrokなどのローカルトンネルを立ち上げます。
```bash
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を作成します。
![スクリーンショット 2024-05-29 17.05.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2503518/f1ff0db6-3818-6f7a-005c-3fe6ec960a9c.png)

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

![スクリーンショット 2024-05-29 17.12.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2503518/9c0b92a3-7042-468c-13c7-d495e3c293dc.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コードレビューを導入してから、レビューが効率的に進むようになったと感じています。皆様の導入のきっかけになれば幸いです。