GitHub Copilot code review in Visual Studio Code がパブリックプレビューになりました
こんにちは、製造ビジネステクノロジー部の若槻です。
先月末に開催された GitHub Universe 2024 では、GitHub Copilot Workspace をはじめとした、生成 AI を利用した開発支援機能に関する発表がいくつか行われました。
そしてそのうちの一つが GitHub Copilot code review in Visual Studio Code(以降、code review 機能)のパブリックプレビューの開始です。
ドキュメントも公開されています。
code review 機能は以下の 2 つから構成されており、現在ほとんどのユーザーが実際に利用できるのは Review selection の方となります。
Review selection | Review changes | |
---|---|---|
説明 | 選択されたコードへのフィードバックと変更のサジェスト | すべての変更 |
サポート言語 | すべての言語をサポート | C#, Go, Java, JavaScript, Markdown, Python, Ruby, TypeScript |
カスタムコーディングガイドラインのサポート | なし | あり |
利用可能な環境 | Visual Studio Code | Visual Studio Code および GitHub.com |
利用可能なユーザー | すべての GitHub Copolot ユーザー | ウェイトリストでアクセス権を得たユーザー |
試してみる
実際に code review 機能を試してみます。
使用したのは GitHub Copilot Business プランのユーザーです。
Review selection
こちらのコードで試してみます。
試したコード
import { Request } from 'express';
import * as zod from 'zod';
import { createCompanyService } from '@/lambda/domains/services/create-company';
import * as HttpUtil from '@/utils/http-response';
import { logger } from '@/utils/logger';
const eventBodySchema = zod.object({
name: zod.string(),
});
export const createCompanyHandler = async (
event: Request
): Promise<HttpUtil.HttpResponse> => {
logger.info('event', { event });
try {
if (!event.body) {
logger.info('Validation error.', { body: event.body });
return HttpUtil.badRequest();
}
const body = eventBodySchema.safeParse(event.body);
if (!body.success) {
logger.info('Validation error.', body.error);
return HttpUtil.badRequest();
}
const { name } = body.data;
const createdCompany = await createCompanyService({ name: name });
return HttpUtil.created(JSON.stringify(createdCompany));
} catch (e) {
logger.error('error', e as Error);
return HttpUtil.internalServerError();
}
};
VS Code 上でレビューを受けたいコードを選択し、右クリックメニューを開くと Copilot > Review and Comment というメニューが利用可能になっているので選択します。
GitHub Copilot の処理が開始され、コード量によると思いますが、今回は数秒でレビューが完了しました。ポコポコポコとコメントが生えてきました。
上からコメントを見ていきます。
1 つ目は Request の import が他の third-party imports とグループ化されていないというコメントです。そのようなお作法があることは知りませんでした。このコメントに関しては、No change found to suggest というコメントがあり、変更点はないとのことです。
The import statement for Request should be grouped with other third-party imports for better readability.
No change found to suggest.
[Discard and Go to Next]をクリックすると次のコメントに進みます。
2 つ目は createCompanyService の import が他の project-specific imports とグループ化されていないというコメントです。グループ化を結構推してきますね。
The import statement for createCompanyService should be grouped with other project-specific imports for better readability.
Suggested change:
+ import * as HttpUtil from "@/utils/http-response";
+ import { logger } from "@/utils/logger";
サジェストの変更が他の import 文と重複しているのでは?と思いつつ、せっかくなので Apply をして変更を適用してみます。
やはりエラーとなりました。こういうこともあるようです。
3 つ目は zod のバリデーションメッセージに説明を追加することを提案しています。
The schema definition could be more descriptive by adding validation messages.
Suggested change:
- name: zod.string(),
+ name: zod.string().nonempty("Name is required."),
これは一見良さそうな提案ですね。Apply してみます。
惜しい!nonempty()
は deprecated のメソッドでした。代わりに min(1)
を使えば良さそうです。
的確なサジェストをしてくれるとは限らないようですが、どのような観点でコードを修正すれば良いかのヒントを得るには十分に役立つ機能だと感じました。
Review changes
こちらはまだ試すことができなかったので、下記からウェイトリストに登録するに留まりました。
他の GitHub サービスと同様に Organization を選択して申し込むことができます。
ルールセットの条件に利用可能
まだ機能自体は利用可能になっていませんが、ルールセット(ブランチ保護ルール)には GitHub Copilot によるレビュー条件のメニューがすでに追加されていました。これを有効化することにより、新規プルリクエスト作成時に GitHub Copilot によるレビューが自動で行われるようになるとのことです。
カスタムコーディングガイドライン
チームやプロジェクトごとにコーディングガイドラインを策定することは多いと思いますが、GitHub Copilot によるレビューにもそれに従わせることができるのはとても嬉しい機能ではないでしょうか。
ドキュメント中の例によると以下のようなカスタムコーディングガイドラインを設定することができるようです。
- マジックナンバーを使用しないこと
- SQL クエリで
SELECT *
を使用しないこと - HTTP リクエストには
fetch
を使用すること - 現在の環境では常にメトリクスにタグを付けること
おわりに
GitHub Copilot code review in Visual Studio Code がパブリックプレビューになったのでご紹介しました。
GitHub Copilot Workspace や Copilot Edits など目を引く機能が登場した中で、こちらもかなり注目的な機能だと思います。一般利用可能になる日が待ち遠しいですね。
ちなみに code review 機能は以前までは GitHub Next において「Copilot for Pull Requests」という名前で将来的な機能概念として紹介されていました。
Copilot for Pull Requests を下記のブログで紹介した時には実際に使えるようになるのはもっと先になるだろうと思っていましたが、たった 1 年半後にパブリックプレビューでありながら使えるようになってしまいました。
技術の進化速度がより加速し、また AI サービス提供企業間の激しい競争によるサービスの早期リリースが進んでいるのを感じます。置いていかれないように引き続きキャッチアップしていきたいです。
以上