Amazon CodeGuru Reviewer

- POCメモ

【参照情報】
https://docs.aws.amazon.com/codeguru/latest/reviewer-ug/tutorial-github-reviewer.html

デモ用のリポジトリを自分のリポジトリへフォークする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/1d856b87-1cde-3aa6-c2a7-aaf2eb1a31e9.png)

マネジメントコンソールにログインしてリポジトリの関連付けの設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/63183a1a-7749-09bf-dd4f-692eeabc8ca2.png)

関連付けされたリポジトリの確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/36d1be19-7cd6-dfcb-8f0c-3f63bf023b7d.png)

ローカルにソースコードをクローンし、ブランチ作成してテスト用のソースコードをコミットしてpushする。


```
C:\Users\gtoru>git clone https://github.com/t-hashi/amazon-codeguru-reviewer-sample-app.git
Cloning into 'amazon-codeguru-reviewer-sample-app'...
remote: Enumerating objects: 48, done.
remote: Counting objects: 100% (48/48), done.
remote: Compressing objects: 100% (35/35), done.
remote: Total 48 (delta 8), reused 38 (delta 5), pack-reused 0
Unpacking objects: 100% (48/48), 333.27 KiB | 233.00 KiB/s, done.
C:\Users\gtoru>cd amazon-codeguru-reviewer-sample-app
C:\Users\gtoru\amazon-codeguru-reviewer-sample-app>git switch -c develop
Switched to a new branch 'develop'
C:\Users\gtoru\amazon-codeguru-reviewer-sample-app>git add --all
```


エクスプローラでファイルコピー
コピーファイル： src/main/java/com/shipmentEvents/handlers/EventHandler.java 
コピー先：src/main/java/com/shipmentEvents/demo/

```
C:\Users\gtoru\amazon-codeguru-reviewer-sample-app>git commit -m "new demo file"
[develop 5172a56] new demo file
 1 file changed, 174 insertions(+)
 create mode 100644 src/main/java/com/shipmentEvents/demo/EventHandler.java
C:\Users\gtoru\amazon-codeguru-reviewer-sample-app>git push --set-upstream origin develop
Enumerating objects: 16, done.
Counting objects: 100% (16/16), done.
Delta compression using up to 8 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (9/9), 2.95 KiB | 1006.00 KiB/s, done.
Total 9 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
remote:
remote: Create a pull request for 'develop' on GitHub by visiting:
remote:      https://github.com/t-hashi/amazon-codeguru-reviewer-sample-app/pull/new/develop
remote:
To https://github.com/t-hashi/amazon-codeguru-reviewer-sample-app.git
 * [new branch]      develop -> develop
Branch 'develop' set up to track remote branch 'develop' from 'origin'.
```

gitでpullリクエストしてしばらくするとレビューが完了する。
しばらくすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/9064bea2-f6e4-270d-3a2e-d582a7ae3849.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/6ecae4bb-2616-8394-274a-c10c1f290c9f.png)

Git上の表示例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/b7c220ff-e4d7-3cb9-8960-f832b9814414.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/5937a7aa-31db-2fab-63b9-9bf015f8b5ce.png)

- AWS SDK以外のコード例
 - リソースリーク(DB)

```
package com.shipmentEvents.handlers;

import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class TestBean {

	public void doBusiness() {
		Connection con = null;
		try {
			Context initContext = new InitialContext();
			Context envContext  = (Context)initContext.lookup("java:/comp/env");
			DataSource ds = (DataSource)envContext.lookup("jdbc/oracle");
			con = ds.getConnection();
			Statement st = con.createStatement();
			ResultSet rs = st.executeQuery("select col1 from test where col1 = 1");
			int recordCount = 0;
			while (rs.next()) {
				System.out.println(rs.getInt("col1"));
				recordCount++;
			}
			System.out.println("recordCount:" + recordCount);
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			try {
				//con.close();　リソースリークさせるコードのため、わざと処理コードを省略している。
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/d166a1f3-210d-73c2-147f-25f6a8554f23.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/6b40e5f7-6057-d788-4259-3151f11d0a63.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/2107f50c-8b1a-4acf-82b9-f885c3582972.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/8360e9d5-59e9-4876-440d-5a9d7abbc4c7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/51138004-7f3c-8c8a-3b65-069a5fbc9259.png)


※finallyで処理コード漏れした点についてレコメンデーションしてくれた。
※実際にApache Tomcat/9.0.31で設定したコネクションプールでコネクション上限数以上は待ち状態となりSQL実行されない。

- AWS SDK以外のコード例
 - リソースリーク(ファイル)
 

```
package com.shipmentEvents.handlers;

import java.io.File;
import java.io.FileWriter;

public class TestBean2 {

	public void doBusiness() {
		
		try {
			File file = new File("c:¥¥temp¥¥test.txt");
			FileWriter fw = new FileWriter(file);
			fw.write("test");
			//fw.close();
		} catch (Exception ex) {
		}
	}
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/a7f7c468-3653-f4f1-df2a-3fd2c155255d.png)

※ファイルのリソースハンドリングについてのレコメンデーション。
※ただしこのレベルであれば次のようにEclipseで教えてくれる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/b803afa9-fa22-6ddd-0686-ce15a23be016.png)

2020/8/4追加機能（リポジトリの分析）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/bdb94525-7df2-96d4-7f71-4bd4a922dcde.png)

ブランチ指定した例は下記のとおり
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/50242e80-37c8-67e9-efd3-f9f28b404fb7.png)