機械学習でコードレビューを自動化 ! Amazon CodeGuru 3 分間クッキング

2020-07-02
デベロッパーのためのクラウド活用方法

Author : 金杉 有見子

アプリケーション開発に携わっている方であれば、誰もがコードレビューを実施する、あるいはコードレビューを受けるという立場として、コードレビューを経験したことがあるのではないでしょうか。コードレビューのプロセスは、プロダクトの欠陥を無くすという観点と、組織としてのエンジニアリング力を維持するという観点で不可欠です。

しかし、コードレビューを行う人材の確保が難しいケースも存在すると思います。レビューを行うにあたっての知識を備えていることがまず前提としてあり、更にプロダクト全体に対する理解も必要とされます。そして、いざコードレビューとなると、時間を確保する必要があります。開発が活発なほどコードレビューの時間も比例して増えてしまうので、レビュアーの負担増にも繋がります。コードレビューがネックになってリリースが遅延してしまうのでは本末転倒ですよね。よって、コードレビューの自動化はこれまでも非常に注目を集めてきた分野です。

本日は、そんなお悩み解決に役立つ Amazon CodeGuru Reviewer について紹介したいと思います。先日一般公開となり、東京リージョンでも利用可能になりました🎉 

このクラウドレシピ (ハンズオン記事) を無料でお試しいただけます »

毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。 


Amazon CodeGuru とは

Amazon CodeGuru は、自動化されたコードレビューとアプリケーションパフォーマンスの推奨事項を提供する機械学習をベースとしたサービスです。プロダクトとしては、CodeGuru Reviewer と Codeguru Profiler の二つに分かれており、本日のテーマはコードレビューのサービス CodeGuru Reviewer の方になります。まずは一般的な開発フローにおける CodeGuru の立ち位置を見てみましょう。

図の 3 番で示されている部分が CodeGuru Reviewer が登場する箇所です。事前にリポジトリを CodeGuru Reviewer と関連付けておくと、デベロッパーがリポジトリにコードを push し、pull request を作成したタイミングで CodeGuru Reviewer が自動的に pull request にレコメンデーションを残してくれます。なお、執筆時点で対応しているソースリポジトリは AWS CodeCommit、GitHub、GitHub Enterprise、および BitBucket です。言語は Java です。それでは早速試してみましょう。


GitHub リポジトリを Amazon CodeGuru Reviewer と関連付ける

今回はサンプルのリポジトリを fork し、CodeGuru Reviewer と関連付けてみます。こちらのリンクから GitHub リポジトリへ遷移し、右上の Fork をクリックします。ちなみに、このサンプルは CodeGuru Profiler のテスト用途にも使えるものです。

クリックすると拡大します

続いて、AWS コンソールにログインし、Amazon CodeGuru サービスのページに移動します。Getting started のプルダウンから CodeGuru Reviewer を選択します。 

Source Provider は GitHub を選択し、Connect to GitHub をクリックして CodeGuru Reviewer のアクセスを許可します。後ほど CodeGuru Reviewer はこの時点でログインしているユーザーで pull request にコメントするので、本番では区別がつくよう事前に CodeGuru 専用の GitHub ユーザーを作成と良いです。リポジトリを選んだら、Associate を選択します。これで準備は完了です。


コードに変更を加えてみる

ここからは、手元にリポジトリを clone し、新たに test ブランチを作成してファイルを 1 つ追加してみます。私は AWS Cloud9 を使いました。

git clone https://github.com/<your-userid>/aws-codeguru-profiler-sample-application.git
cd aws-codeguru-profiler-sample-application
git branch test
git checkout test
cd src/main/java/com/company/sample/application/
curl -O https://awsdemoworkshops.s3.us-east-2.amazonaws.com/codeguru/Downloads/EventHandler.java
git add .
git commit -m "Adding EventHandler.java file"
cd ../../../../../../
ls src/main/java/com/company/sample/application/

これでブランチ test がローカルに作成され、変更が加えられました。コードを push します。

git status
git push --set-upstream origin test

ここで、上記で新たに追加したファイルに加え、CodeGuru Reviewer に指摘されるコードを追加してみます。好みのエディタで "src/main/java/com/company/sample/application/CreateOrderThread.java" を開き、63 行目以降に 4 行 (コメント含む) のコードを追加してみます。変更後は以下のようになります。

SalesSystem.orders.put(orderDate, order);
//Check if the Order entered and present
if (SalesSystem.orders.containsKey(orderDate)) {
        System.out.println("New order verified to be present in hashmap: " + SalesSystem.orders.get(orderDate)); 
}
id++;

これもリポジトリに push しましょう。 

git add .
git commit -s -m "Introducing new code that is potentially thread unsafe and inefficient"
git push origin test

Pull Request 作成

ここからは、自分の GitHub リポジトリの画面で pull request を作成してみます。Pull request が作成されると、CodeGuru Reviewer に通知され、コードのスキャンが始まります。Pull requests 画面から、New pull request を選択します。

クリックすると拡大します

Base がサンプルリポジトリになっているので、自分のアカウントの master ブランチになるよう変更します。また、compare 対象は、今回新たに作成した test ブランチにします。これで、Create pull request を選択します。

クリックすると拡大します

通常、pull request が作成されてから約 15 分ほどで CodeGuru Reviewer がコメントを残してくれます。もし待っても来ないな・・と思った場合は、CodeGuru からの指摘がなかったということになります。AWS コンソールからも pull request ごとの状態を確認することができます。

さて、先ほどの pull request に戻ってみると、CodeGuru Reviewer が指摘事項を残してくれているのが確認できます。

一つ例をあげてみました。これは、S3 の ListObject API よりも ListObjectV2 API の方が推奨されているよ、という AWS のベストプラクティスに関する指摘です。

クリックすると拡大します

もう一つ例をピックアップしてみます。これは先ほどコードを書き換えた部分がスレッドセーフじゃないよ、という指摘事項です。マルチスレッドな処理を実装する時にはとても大事ですね。また、課題点だけでなく、どのように変更すれば良いのかの情報も合わせてコメントしてくれるのも親切です。

Emoji でリアクションしてあげると機械学習のモデルが更に賢くなるそうなので、正しい指摘はぜひ褒めてあげてください。

クリックすると拡大します


まとめ

サンプルコードを使用して、CodeGuru Reviewer がどのように動くのかをざっと試してみました。変更を加えずに既存のリポジトリと簡単に連携できる点や、AWS ベストプラクティスが含まれる点が魅力的ですね。ぜひお手元のコードでも試してみてください!


builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます

筆者プロフィール

金杉 有見子 (かなすぎ ゆみこ)
アマゾン ウェブ サービス ジャパン合同会社
ソリューションアーキテクト

インターネットメディアのお客様のクラウド活用をサポートするアーキテクト。旅とゲームが好き。

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する