OpenAI を使ってプルリクエストのレビューを自動化する

この記事は、[セゾン情報システムズ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/sisco) 18日目の記事です。

## はじめに
本記事では、OpenAI を使ってプルリクエストのレビューを自動化する方法を紹介していきます。

## PR-Agent
レビューの自動化には [PR-Agent](https://github.com/Codium-ai/pr-agent) という、Codium AI によってオープンソースで開発されている ChatGPT を使ったプルリクエストを便利にするための AI ツールを利用します。プルリクエストに関する様々な作業を自動化することができ、現時点で以下のような機能を持っています。
- プルリクエストの説明自動生成
- コードレビュー
- コードの提案
- コードコメントの自動生成
- CHANGELOG の自動生成
- カスタムラベルの生成

### PR-Agent の使用方法
ローカルでの実行、リモートリポジトリ上での実行どちらも可能です。
実行に必要なものは Open AI の API キーのみなので CI に簡単に導入できます。
今回は Github Actions を利用して実行していきます。
詳しい使い方は [こちら](https://github.com/Codium-ai/pr-agent/blob/main/INSTALL.md) を参照してみてください。

### 設定
まず `.github/workflows/pr-agent.yaml` に以下のようなワークフローを作成します。


```pr-agent.yaml
name: pr-agent

on:
  pull_request:
    types: [opened, reopened, synchronize]
  issue_comment:
    types: [created, edited]

permissions:
  pull-requests: write
  issues: write

jobs:
  pr_agent:
    runs-on: ubuntu-latest
    name: Run PR Agent
    if: ${{ github.event.sender.type != 'Bot' }}
    steps:
      - id: pr-agent
        uses: Codium-ai/pr-agent@main
        env:
          OPENAI_KEY: ${{ secrets.OPENAI_KEY }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PR_REVIEWER.EXTRA_INSTRUCTIONS: 'Please use Japanese in descriptions.'
          PR_DESCRIPTION.EXTRA_INSTRUCTIONS: 'Please use Japanese in descriptions. Titles should have prefix of commitlint pattern such as `feat:`, `fix:`, `perf:`, `refactor:`, `test:`, `chore:`, `ci:`, `docs:` etc'
```

PR-Agent は GitHub Actions のワークフローに環境変数を指定することでレビュー内容を日本語にしたり、プルリクエストのタイトルを commitlint 形式にしたりできます。env セクションに環境変数を追加することで設定値を調整できるようになっています。
各種機能の詳しい設定は [こちら](https://github.com/Codium-ai/pr-agent/tree/main/docs) をご確認ください。

次に GitHub リポジトリの Actions Secret に OPENAI_KEY を追加し、 OpenAI のAPIキーを登録します。
`Settings > Secrets and variables > Actions > New repository secret > Add secret`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286805/f2a22b5e-cb06-c916-6138-d99516b599e8.png)
設定は以上です。それでは PR-Agent 様にレビューしていただきましょう。

以下のような雑なプルリクエストを作っていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286805/6bb682e7-61d6-dc96-d079-49a596d67824.png)

変更内容はこんな感じです。
変更の意図としては、引用符の間に埋め込まれたユーザー提供のデータ自体に予期しないデータが含まれていないことをチェックするようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286805/fbf75faf-394b-ceb3-6e0d-5b9dc8c93fae.png)

プルリクエストを作成すると、すぐに以下のようなレビューを実施してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286805/eef12681-9c6a-10a6-6d9e-d9de2ba4e5f4.png)
プルリクエストの分析を行ってくれるとともに、フィードバックとして以下2点のコメントをいただきました。
1. テストを追加しろ
1. エラー原因を握りつぶさずに呼び元にちゃんとエラーを返せ

至極全うでごもっともなご意見です。
このレベルでファーストレビューしてもらえると、その後のレビューは捗るのではないでしょうか。

次に雑に作ったプルリクエストなので説明が空っぽ、タイトルも雑なので、タイトルと説明を生成してもらいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286805/609c0012-5382-1867-0618-89d222b5af82.png)

なんということでしょう、タイトルと説明を丁寧に記載してくれただけでなくラベルも設定してくれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286805/4977c7bc-2ad2-b4fb-336f-d32efd77603c.png)

Markers template という機能を使うことで、オリジナルの説明に PR-Agent が自動生成したコンテンツを簡単に統合できます。
プルリクエストをテンプレート化している場合には、以下のキーワードをテンプレートに入れておくと自動で置き換えてくれます。
- pr_agent:summary
- pr_agent:walkthrough

Markers template を有効にするための設定
```yaml
        env:
          PR_DESCRIPTION.USE_DESCRIPTION_MARKERS: 'true'
```

## 最後に
レビュー精度については、まだあまり高くないかも知れませんが、セルフチェックやドラフト段階でのレビューくらいには使えそうです。
また、サマライズ機能はレビュー負荷の低減に繋がりそうでいい感じです。レビュイーは、プルリクエストの詳細を書くことに時間を取られずにすみ、効率的に開発を進められます。レビュアーはどのファイルで、どういう変更があったのかの概要を把握してからレビューに入れるので、レビューの勘所も掴みやすくなっております。

先日開催された GitHub Universe 2023 の中で、GitHub Copilotの将来像となる「Copilot Workspace」が発表され話題になっています。
人間が自然言語で書いた Issue を起点に Copilot が Issue に対応した仕様を書き、実装計画を示し、それに沿ってコーディングや既存のコードの修正を行い、ビルドをしてエラーがあれば修正まで行うという、コーディングのほとんど全ての工程をCopilotが自動的に実行してくれる、というもののようです。
使えるようになったら、使用感などレポートしていきたいと思います。