LibertyによるWebサービスアプリ開発メモ: (6)Eclipse-GitHub連携

# はじめに
Webサービス(REST)アプリを開発してLiberty上で動かすまでの流れについて、試したことを備忘録として記載していきます。
今回はEclipse-GitHub連携について。
今回使用しているEclipse Oxygenでは、Git用のプラグインはデフォルトで入っているようなので、特に追加も必要無さそうです。

## 関連記事
[LibertyによるWebサービスアプリ開発メモ: (1)環境構築](https://qiita.com/tomotagwork/items/3a63ac7955d053a4feb4)
[LibertyによるWebサービスアプリ開発メモ: (2)MavenプロジェクトによるJAX-RSアプリ開発](https://qiita.com/tomotagwork/items/80b2030d625b6d329a27)
[LibertyによるWebサービスアプリ開発メモ: (3)JPA経由でのDBアクセス](https://qiita.com/tomotagwork/items/2391a79f4fe36449f2a4)
[LibertyによるWebサービスアプリ開発メモ: (4)ロギング](https://qiita.com/tomotagwork/items/30e07835c009cea53dd7)
[LibertyによるWebサービスアプリ開発メモ: (5)JUnitによる単体テスト](https://qiita.com/tomotagwork/items/e35d4984df285307fd2b)
[LibertyによるWebサービスアプリ開発メモ: (6)Eclipse-GitHub連携](https://qiita.com/tomotagwork/items/63a1c75be844f28a0582)

# 準備
## GitHubリポジトリ準備
ソースを管理するGitHubのリポジトリが無いと話にならにので、それは事前に用意してきましょう。新規に作成するならこの辺参考に...
[GitHub Home](https://github.com/)
[GitHub 入門](https://qiita.com/ay3/items/8d758ebde41d256a32dc)
[【GitHub超初心者入門】この前初めてGitHubを使い始めたエンジニア見習いが書くGitHubの使い方と実践～とりあえず一緒に動かしてみようぜ！～](https://qiita.com/nnahito/items/565f8755e70c51532459)

## SSH設定
EclipseからGitHub連携を行う際SSH接続じゃないとPushなどの操作が制限されるようなので、Eclipse - GitHub間でSSH接続を行えるよう設定をしておきます。

### キーペア作成
SSH接続を行う際公開鍵認証を使うので、公開鍵-秘密鍵のペア(キーペア)を作成する必要があります。

https://help.github.com/enterprise/2.8/user/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/#platform-windows

LinuxとかだとOpenSSHとか割と標準で入っているので問題ないのですが、Windows上だと標準機能としては提供されていないようなので、他のツールなどの力を借りる必要があります。

MinGW + MSYS だとWindowsでUnixライクな機能を色々使えるので、そこでSSH関連の機能を追加すると、キーペア作成用のssh-keygenコマンドが使えます。
参考:
[MinGW+MSYSインストール メモ](http://y-ishida.hatenablog.com/entry/2015/10/26/102749)
[マルチ・プラットフォームを扱うインフラ屋さんのための連携技術: SSH編](https://qiita.com/tomotagwork/items/b35aa09c1aa1acb3d554)

もしくは、gitをインストールするとssh-keygenコマンドが使えるらしい。
参考:
[秘密鍵・公開鍵を作成する（Win）](https://qiita.com/reflet/items/5c6ba6e29fe8436c3185#_reference-2f17f186cd1024b8d2b0)
[GitHub Help: Generating a new SSH key and adding it to the ssh-agent](https://help.github.com/enterprise/2.8/user/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/#platform-windows)

### 秘密鍵をEclipseに指定
EclipseからSSHを使用する際に使用する秘密鍵として、上で作成した秘密鍵を設定します。
EclipseのメニューからWindow - Preferenceで以下のように秘密鍵を指定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/1bc3d2f2-fd18-b068-113d-ae467007041f.png)

### 公開鍵をGitHubの自分のプロファイルに登録
GitHubのアカウントのプロファイルに、上で作成した公開鍵を設定します。
参考:
[Adding a new SSH key to your GitHub account](https://help.github.com/enterprise/2.8/user/articles/adding-a-new-ssh-key-to-your-github-account/)

Settingを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/6276ea2f-ed90-901f-ee6b-eb08cde94cd8.png)

SSH and GPG keysを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/b4156bb8-78f8-197a-b2d7-e28c1608daee.png)

New SSH Keyボタンを押して、任意のTitleを指定し、Keyに生成された公開鍵の中身(テキスト)をコピペして Add SSH Keyを押す！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/3b6229c1-1024-305a-0b23-e0d7ce3322dd.png)

登録されればOK。


# Eclipse - GitHub 連携をはじめる

## 新規にプロジェクトを作成してそれをGitHubに登録する

GitHubを使ってソース管理を行う場合、複数メンバーで開発を進めるケースが多いと思います。その場合、スタート地点としては以下の2つが考えられます。

* 最初に自分でEclipse上に作成したプロジェクトをGitHubに新規に登録してそれを他のメンバーに公開する
* 既にGitHub上に誰かが作ってくれたものをベースに、それを取り込んで使う

ここでは前者の、最初にプロジェクトを作成して公開するというのをやってみます。

参考: 
[Eclipse 上から新規プロジェクトを Github に Push する方法](https://qiita.com/cotrpepe/items/7cafaacb538425a78f1f)

### GitHubリポジトリーのクローン
まず、GitHubリポジトリーのクローンを行います。ここでは新規に作成したGitHubリポジトリーを対象にしているので、リポジトリーは今の所カラの状態です。
クローンしたいGitHubのリポジトリーのURI(SSH経由)を確認しておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/d41365f1-96d8-da69-0397-bcf5f96e6d70.png)

Gitパースペクティブ - Git Repositoriesビューで、"Clone a Git Repository and add the clone to this view"ボタンをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/dbec88d1-dc16-1faa-5e66-0cde29df5839.png)

上で確認したおいたURIを指定して、プロトコルとしてsshを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/4b37b7c9-577e-9f2b-f3b5-7698e3553bcc.png)

Next
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/64d89a19-a169-ec6b-28d7-508d19e295c9.png)

ローカルのリポジトリのディレクトリを指定してFinish
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/1882865d-b0ec-0703-eefc-e78595e68f2b.png)

### プロジェクトを作成してGitHubにPush

まず適当にEclipse上でプロジェクト作成します。ここでは前の記事で作成したMavenLibertyTest01というプロジェクトをGitHubで管理することを想定します。
JavaEEパースペクティブのEnterprise Explorerビューで、プロジェクト名を右クリックし、Team - Share Projectを選択
Configure Git Repositoryというウィンドウが開くので、先ほどクローンしたリポジトリと公開するプロジェクトを選択してFinish
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/ee37389f-0e41-d3b7-4338-3137de056ea3.png)

プロジェクトに「>」マークが付きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/f0db0d03-8bea-9b42-d19c-0bc240c3b23e.png)

プロジェクトを右クリック - Team - Commitを選択すると、Git Stagingビューが開くので、このビューの左上にあるUnstaged Changesの全項目を左下のStaged Changesに全てドラッグ&ドロップし、Commit Messageにコメントを記載して、Commit and Pushボタンを押す
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/e8b3b72b-1f70-4c3a-ff90-2f887854b27a.png)

Next
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/edc019f0-1986-be8a-e338-66c992afb7b6.png)

Finish
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/76d3368c-ba32-cebe-8a5d-d23d9609c385.png)

OK
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/3b619189-3bfc-dc8b-7227-4afcbb701a1c.png)

これでGitHubのリポジトリーに、masterブランチが作成されて、指定したプロジェクトがPushされた状態となる。

gitパースペクティブのGit Repositoriesビューはこんな感じになってます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/42ebe5ad-0bc8-76fb-3f68-59cab8b7836e.png)

ブラウザからGitHubのリポジトリを参照するとこんな感じになっています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/ae229275-4cba-1311-424e-24219ee7c059.png)

## GitHub上のプロジェクトを取り込む

次に、「既にGitHub上に誰かが作ってくれたものをベースに、それを取り込んで使う」というケースをやってみます。最初に登録してた人とは別のメンバーが、GitHubに上がっているものをローカルに取り込んで作業を開始するイメージです。

### GitHubリポジトリーのクローン
ここは途中まで上の手順と同じです。

クローンしたいGitHubのリポジトリーのURI(SSH経由)を確認しておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/d41365f1-96d8-da69-0397-bcf5f96e6d70.png)

Gitパースペクティブ - Git Repositoriesビューで、"Clone a Git Repository and add the clone to this view"ボタンをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/dbec88d1-dc16-1faa-5e66-0cde29df5839.png)

上で確認したおいたURIを指定して、プロトコルとしてsshを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/4b37b7c9-577e-9f2b-f3b5-7698e3553bcc.png)

クローンしたいブランチ(この例ではmasterのみ)を選択してNext
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/85619d32-b5ed-02aa-ae36-35ae50f9f541.png)


ローカルのリポジトリのディレクトリを指定してFinish
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/74d80bc5-8b0f-dacb-150c-55bdcefe66c7.png)

リポジトリのクローンが作成される
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/e2455b69-7cc2-c744-db00-fd797fde48b8.png)

### ローカルリポジトリからプロジェクトをインポート

事前に、[こちら](https://qiita.com/tomotagwork/items/3a63ac7955d053a4feb4#liberty%E7%92%B0%E5%A2%83%E3%81%AE%E6%95%B4%E5%82%99)を参考に、Libertyサーバーの作成は実施しておく。

クローンしたローカルリポジトリからプロジェクトをインポートします。
JavaEEパースペクティブのEnterprise Explorerビューを右クリック-Import-Importを選択し、Projects from Gitを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/abe42b48-81a2-6a6b-626c-8572a6a18003.png)

Next
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/9d690c9c-1720-cd94-b912-3587f1dcae02.png)

Next
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/16c4f6b5-0a6c-827b-d5e1-c4b2fac02df5.png)

Next
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/78e90815-0b04-49b1-7d44-e28f4380858a.png)

プロジェクトを選択してFinish
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/7acb75dc-be71-d2d7-3ff6-7477bb181dfc.png)

こんな感じでmasterブランチに紐付いたプロジェクトとして認識されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/755c84f8-dd13-51e9-a1b3-838b7cd4304c.png)

あとはこのプロジェクトを普通に変更なりローカルでテストなりをしてきます。
ローカルでテストする場合の環境依存の設定などは変える必要があるかもしれません。
また、Mavenを使ったプロジェクトの場合、取り込んだ時にプロジェクトに赤×が付く場合がありますが、Mavenのメニューからアップデート(プロジェクト右クリック - Maven - Update Projectを選択)することで解消される場合があります。

# 操作例
とりあえず基本的なところだけ。

## Push
ローカルにクローンしたプロジェクトを編集して一通りテストが完了したら、その修正を確定させてgitHubのブランチにも反映します。

ここではあんまり意味は無いですが、コメント行を無駄に追加してみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/e26d4490-d4fe-4575-9891-1f236fa0454d.png)

変更している間に他のメンバーが同じブランチを編集している場合があるので、競合しないかチェックするために一度Pull(後述)してから実施するとよいでしょう。

gitパースペクティブのGit StagingビューのUnstaged Changesという所に、変更したソースのリストが表示されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/d8b834ab-764b-1262-06a1-36f5be5a2edb.png)

確定したいソースをStaged Changesにドラッグし、Commit Message欄に修正内容を記載します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/fee9477a-f766-b2a2-46b9-cdf2c755a862.png)

Commit and Pushボタンで、変更の確定とgitHubリポジトリへの変更反映が行われます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/c690e828-6702-f88e-c41a-a2f07e3ee1f0.png)

ブラウザでGitHubリポジトリの様子を見ると、最新の変更が反映されたことが分かります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/df9f47be-a9a0-ca75-166e-956c3f61e892.png)



## Pull
他の人が行った更新をローカル環境に反映させてみます。(上の反映を行った人とは別のメンバーがPullする想定)

ローカルのリポジトリーを右クリック-Pull...
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/d710528d-5c2f-c549-34d5-333e377cd508.png)

Finish
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/91793241-dd2a-88eb-e0da-2392a25ddd30.png)

変更内容確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/dc9ce299-3c9e-2426-2be7-1d7f3edc5e1e.png)

プロジェクトの該当ソースを開くと、先のコメントが追加されているのが確認できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/31d491a9-0a21-649c-fa04-ebd397e52cbe.png)

## ブランチ作成
最初に作られたmasterをベースに別のブランチを作成してみます。

Git RepositoryビューのLocalからベースとなるブランチを右クリック-Create Branch...を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/18469f1d-f161-33a5-eedb-966c3c97b190.png)

任意の名前をつけてFinish
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/2073a234-c796-766a-cfb6-7e0e37bc738d.png)

上でCheck out new branchにチェックをつけていたので、新しいブランチがcheck outされてそちらが有効になっています。
プロジェクト名の横にも新しいブランチ名が表示されているのが確認できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/5a080e61-62cb-4637-88c2-80707c740cbb.png)

これで、新しいブランチで開発作業を進めることができます。

先と同じように新しいブランチで変更をcommitしてGitHubにPushしてみます。
変更内容をCommit and Push
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/680aa186-71ce-5e02-7276-a10668f13fb8.png)

Next
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/c79bff1e-cc72-5ad6-b03c-4b3ca3ae8d45.png)

Finish
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/2fc50dfd-5b49-fc35-c6ba-704626554067.png)

ブラウザからGitHubリポジトリを見ても新しいブランチが作成されたことが分かります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/976d52a8-7391-48c3-0275-db76d171f6b8.png)

## ローカルの変更の破棄
ローカルで変更した内容をロールバックして元のブランチの状態に戻したい場合というのがありますのでそちらも補足を。

プロジェクトを右クリック - Replace With - HEAD Revisionで、最後にコミットした状態(コミットしてなければPullした状態)に戻ります
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/1962e983-11bb-66f9-b999-273ab7d45262.png)

Discard Changes
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132331/62d2bacb-6814-226e-48f9-b9d374a19892.png)