JavaプロジェクトをAWS CodeCommitのリポジトリで管理する

## 概要

Windows環境にて、JavaプロジェクトをAWS CodeCommitのリポジトリで管理する方法です。
AWS CodeCommitの準備やsshでの接続方法は、AWSの[Setting Up for AWS CodeCommit]  (http://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up.html)ページにある*For SSH Connections on Windows*の通りに進めました。

**記事編集中に誤ってオリジナルの記事を削除してしまいました。stockして頂いた方、申し訳ありません。この記事はバックアップから再度投稿したものになります。**

**環境**

* Windows10
* PuTTY 0.67 (一式)
* Git for Windows 2.9.0

**作業手順**

1. WindowsにGitやSSHクライアントなどをインストールします
2. Windows側でCodeCommitのリポジトリにアクセスするためのssh認証鍵を作成します
3. AWS側でCodeCommitのリポジトリにアクセスできるIAMユーザーを登録します
4. PuTTYを使ってsshで接続できるか確認します
5. AWS CodeCommitにリポジトリを作成します
6. Windows側でリポジトリで管理するプロジェクトを作成します
7. 作成したプロジェクトをGit化します
8. Git化(=ローカルリポジトリ)したプロジェクトをリモートリポジトリ(=CodeCommit)へpushします
9. ローカルリポジトリをeclipseに取り込みます
10. eclipseから修正したコードをcommit、pushします


### 準備

#### Git for Windowsのインストール

Git ClientとしてGit for Windowsを使用します。
[Git for Windows] (https://git-for-windows.github.io/)よりインストーラーを入手してインストールを行います。

```bash
$ git --version
git version 2.9.0.windows.1
```

インストールが終わったら、Git bashを実行して下記の初期設定を行います。

```bash
$ git config --global user.name "rubytomato"
$ git config --global user.email rubytomato@example.com
$ git config --global core.autoCRLF false
```

#### PuTTYのインストール

リポジトリへはsshで接続するのでSSHクライアントをインストールします。今回はPuTTYを使用するので[PuTTY] (http://www.chiark.greenend.org.uk/~sgtatham/putty/)よりWindows用のアーカイブファイルをダウンロードし適当な場所へ展開します。
PUTTY_HOMEという名前の環境変数にそのディレクトリを登録します。（必須ではないです）

```text:例
PUTTY_HOME : %HOME%\dev\putty
```

次にGit_SSHという環境変数にplink.exeへの絶対パスを登録します。（必要です）

```text:例
Git_SSH : %PUTTY_HOME%\plink.exe
```

* plink.exeはPuTTYに同梱されているsshコマンドのWindows版です。


#### PUTTYGENで秘密鍵を作成します

PUTTYGET.EXEを起動し2048bitのSSH-2 RSAで秘密鍵を作成します。（パスフレーズは設定しませんでした。）
画面上に表示されている公開鍵は、あとでAWSのIAMユーザーのSSH公開キーとして使用します。

![puttygen_02.png](https://qiita-image-store.s3.amazonaws.com/0/22772/32498756-9400-c0bd-cae4-87d49e8fb6ed.png)

#### registryの登録

適当な名前のregファイルを作成し下記の内容を貼り付けて保存します。（情報が更新されているかもしれませんので、必ず[AWSのSetup Steps for SSH Connections to AWS CodeCommit Repositories on Windows] (http://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-ssh-windows.html)を確認してください。）
regファイルをダブルクリックするとregistryに保存するか尋ねられるので「はい」で続けます。

```text:reg
Windows Registry Editor Version 5.00
  [HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys]
  "rsa2@22:git-codecommit.us-east-1.amazonaws.com"="AAAAB3NzaC1yc2EAAAADAQABAAABAQCdut7aOM5Zh16OJ+GOP75O7x5oyHKAiA1ieuySetj/hAq4VrAuZV5R2TypZJcKBaripOtTc/Sr0FOU4YvxUla40PPH8N1lbDp6Pnc4BexKsrt2kz++TqIKx5FHmUQV3mit16kxRwHey3dv030+qXBDo3WPQjm2+JLoq0XcadpnCAMCd3ChaBnDRM+51GZbuEFilpZsxUchUzl0gseC+shYOBd7TqxTlIhj/56d/YF1kq7RMZYrwBnyYdVhpLeUJCeYjyx/O6FPSezNTLiinz5jjioWZATgn+G8feL/hIsk8g+7JoIcb2muUlymdxs+8l2lS+8MXqT0q9ohT+Knhb2j"
```

#### CodeCommitにアクセスできるIAMの作成

AWS CONSOLEのIAMダッシュボードを開き、CodeCommitのアクセス権限を持つユーザーを登録します。

「アクセス許可」タブの管理ポリシーから「ポリシーのアタッチ」ボタンをクリックし、「AWSCodeCommitFullAccess」をアタッチします。

![c12.png](https://qiita-image-store.s3.amazonaws.com/0/22772/96add798-46b5-2bde-76f5-b0979e3ec61d.png)

![c13.png](https://qiita-image-store.s3.amazonaws.com/0/22772/a90bf9ba-01c1-e22b-0351-45c1522f030b.png)


次に「認証情報」タブのAWS CodeCommitのSSHキーから「SSH公開キーのアップロード」ボタンをクリックし、先ほど作成した公開鍵を貼り付けます。

![c09.png](https://qiita-image-store.s3.amazonaws.com/0/22772/206efcff-9585-d2ea-5c3d-d2274ec25052.png)

![c10.png](https://qiita-image-store.s3.amazonaws.com/0/22772/20084829-9d63-df20-5c85-33c274f2210c.png)

SSH公開キーが登録されるとSSHキーIDが発行されます。このSSHキーIDがWindowsからsshを使ってリポジトリへアクセスする際のユーザー名になります。

![c11.png](https://qiita-image-store.s3.amazonaws.com/0/22772/3df13a4c-5261-440c-3655-eba780be4408.png)

### 接続確認

#### pagent.exe

pagent.exeを起動し、上記で作成した秘密鍵を登録します。
(pagent.exeはPuTTYに同梱されている認証エージェントプログラムです。)

![pagent01.png](https://qiita-image-store.s3.amazonaws.com/0/22772/825e10d4-b6f7-6828-380e-63df9770e059.png)

登録したらcloseボタンを押して画面を閉じます。(pagent自体はバックグラウンドで実行し続けます。)

![pagent02.png](https://qiita-image-store.s3.amazonaws.com/0/22772/37657b5d-90eb-6359-878d-5a752e363c08.png)


#### plink.exeで接続テスト

コマンドプロンプトを開き次のコマンドを実行して、このメッセージが表示されることを確認します。
\<SSHキーID\>には、IAMに割り当てられているSSHキーIDを指定します。

```bat
> plink.exe -ssh <SSHキーID>@git-codecommit.us-east-1.amazonaws.com
Using username "<SSHキーID>".
You have successfully authenticated over SSH. You can use Git to interact with AWS CodeCommit. Interactive shells are not supported.FATAL ERROR: Server unexpectedly closed network
connection
```

### CodeCommitにリポジトリを作成

CodeCommitのダッシュボードよりリポジトリを作成します。

CodeCommitが利用できるリージョンは"米国東部（バージニア北部）"になります。

![c01.png](https://qiita-image-store.s3.amazonaws.com/0/22772/5a4e1a41-09c2-5872-ecdf-5b0e7799aef8.png)

リポジトリの名前は`my_repo_demo`としました。

![c03.png](https://qiita-image-store.s3.amazonaws.com/0/22772/9734c60c-ec57-fc6e-aeb1-e08596e25a12.png)

リポジトリの名前をクリックするとコードの確認や設定が行えます。

![c04.png](https://qiita-image-store.s3.amazonaws.com/0/22772/e0f10ef8-d807-a97b-d8e2-29a9e23a017d.png)

**Code**

![c05.png](https://qiita-image-store.s3.amazonaws.com/0/22772/34d9b5b6-9c62-5558-c3ed-c9c5017fc083.png)

**Settings**

Default branchの欄が空欄になっていますが、作成したばかりのリポジトリにはmasterを含め1つもブランチはありません。

![c06.png](https://qiita-image-store.s3.amazonaws.com/0/22772/8b2d7c88-35b8-0269-f953-d829e5ac0779.png)

Clone URLよりSSHのURLをコピーします。

![c08.png](https://qiita-image-store.s3.amazonaws.com/0/22772/3ef4451b-5899-f092-baa1-4ec3a85706de.png)


#### リポジトリで管理するJavaプロジェクトを作成

mavenでJavaプロジェクトのひな型を作成します。
今回はこれをそのままリポジトリへpushします。

```bat
> mvn archetype:generate -DgroupId=com.example.myrepodemo -DartifactId=my_repo_demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
```

```bat
> cd my_repo_demo
> mvn eclipse:eclipse
```

#### .gitignoreファイルを作成

プロジェクト内に.gitignoreファイルを作成しておきます。
とりあえず下記の内容で作成しました。

```text:gitignore
/target/
/.classpath
/.project
/.settings/
```

#### git化

このプロジェクトのディレクトリGit Bashで開き以下のコマンドを実行してgit化します。

```bash
$ git init
Initialized empty Git repository in D:/dev/eclipse-jee-mars-1-workspace/my_repo_demo/.git/
```

```bash
$ git status
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        .gitignore
        pom.xml
        src/

nothing added to commit but untracked files present (use "git add" to track)
```

```bash
$ git add .
```

```bash
$ git commit -m "first commit"
[master (root-commit) 0dc1248] first commit
 4 files changed, 173 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 pom.xml
 create mode 100644 src/main/java/com/example/myrepodemo/App.java
 create mode 100644 src/test/java/com/example/myrepodemo/AppTest.java
```

**リモートリポジトリを確認します**
リモートリポジトリはまだありません。

```bash
$ git remote -v

```

**リモートリポジトリを作成します。**

```bash
$ git remote add origin ssh://<SSHキーID>@git-codecommit.us-east-1.amazonaws.com/v1/repos/my_repo_demo
```

```text:構文
git remote add <name> <url>
```

* name : リモートリポジトリの短縮ショートカット
* url : リモートリポジトリのURL


**もう一度リモートリポジトリを確認します**

```bash
$ git remote -v
origin  ssh://<SSHキーID>@git-codecommit.us-east-1.amazonaws.com/v1/repos/my_repo_demo (fetch)
origin  ssh://<SSHキーID>@git-codecommit.us-east-1.amazonaws.com/v1/repos/my_repo_demo (push)
```

**ローカルリポジトリの内容をリモートリポジトリへプッシュします**

```bash
$ git push -u origin master
Counting objects: 21, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (10/10), done.
Writing objects: 100% (21/21), 2.76 KiB | 0 bytes/s, done.
Total 21 (delta 0), reused 0 (delta 0)
remote:
To ssh://<SSHキーID>@git-codecommit.us-east-1.amazonaws.com/v1/repos/my_repo_demo
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.
```

```text:構文
git push <remote> <branch>
```

* remote : リモートリポジトリの短縮ショートカット名
* branch : ローカルリポジトリのブランチ名

オプション `-u`については[`git push -u` オプションの意味] (http://qiita.com/ironsand/items/6c301fef730d53f35bc3)


#### AWS CodeCommitのダッシュボードで確認

この時点でプロジェクトのソースコードがダッシュボードで確認できるようになっています。

![c14.png](https://qiita-image-store.s3.amazonaws.com/0/22772/325f41af-1df1-c304-6a6b-754d90101419.png)

### eclipseにプロジェクトをインポートする

eclipseを立ち上げ、"Add an existing local Git Repository to this view"をクリックしローカルリポジトリをインポートします。
なおeclipseから接続する際にも、pagentが起動している必要があります。

![e01.png](https://qiita-image-store.s3.amazonaws.com/0/22772/9373ac73-3919-aa9d-1832-3d88ef6dd9e8.png)

上記で作成したローカルリポジトリの場所を指定します。

![e02.png](https://qiita-image-store.s3.amazonaws.com/0/22772/e1c95603-76a7-c3e8-81dd-7ec1f670d684.png)

インポート直後の状態です。

![e09.png](https://qiita-image-store.s3.amazonaws.com/0/22772/0f35759b-e8e1-abac-8e37-5c9ae767593b.png)

#### eclipseからファイルを更新する

例としてプロジェクトにREADME.MDファイルを追加しました。
"Add to Index"、"Commit"後に"Push to Upstream"でCodeCommitのリポジトリへコミットをpushします。

![e10.png](https://qiita-image-store.s3.amazonaws.com/0/22772/4e24ee4b-9dfe-8f15-2364-3a49a01c3253.png)

![e11.png](https://qiita-image-store.s3.amazonaws.com/0/22772/ca0fd3ae-d94f-84c8-e62b-a90b58271390.png)