AsakusaFWのプロジェクトをGitHub+Jenkins on AWSで自動ビルド

CIの検証用としてAWS上のDockerコンテナ上にJenkinsの環境を立ち上げ、GitHubと連携して自動ビルドさせる。

ビルド対象としては、Hadoop上のバッチを記述するためのフレームワーク、["Asakusa Framework"](http://docs.asakusafw.com/latest/release/ja/html/index.html)で構築したサンプルプロジェクト。
フレームワークのバージョンが上がり、以前はMavenベースのビルド方式だったものがGradleベースに変更になっており、それに伴いJenkinsの書き方も変わったので手順メモ。

####備考
今回はGitHubとの連携の確認のため、Jenkinsを手っ取り早く動かす方法としてDockerコンテナを選択したが、色々な言語のビルド環境にすることを考えると、コンテナではなくJenkins専用のVMを用意した方が良いと思う

#Index
- 前提環境
- AWS上のVMとGitHubが通信できるようにするセキュリティグループ設定
- Dockerコンテナ上でJenkins起動
- GitHubと連携するJenkinsプロジェクト作成
- GitHub側の設定
- AsakusaFrameworkプロジェクトの自動ビルド

##前提環境
- AWS EC2 上のVM (Amazon Linux AMI 2015.03.1)
- Docker 1.7.1
- Jenkins 1.625.2 (Docker上のコンテナ）
- AWSへの登録や仮想マシン登録は終わっている前提
- GitHubのユーザ登録は終わっている前提

##AWS上のVMと通信できるようにするセキュリティグループ設定
以下２つの通信ができるように、[AWSマネジメントコンソール](https://aws.amazon.com/jp/console/)で通信を許可する設定をしておく。
(1) GitHubからJenkinsへ通知する際の接続
　GitHubのIPアドレスからの接続を許可
(2) JenkinsのブラウザGUIへの接続（8080番ポート）
　ブラウザからJenkinsにアクセスするPCのパブリックIPアドレスからの接続を許可
例えば以下のようにセキュリティグループの設定をする。
![スクリーンショット 2015-11-18 12.22.00.png](https://qiita-image-store.s3.amazonaws.com/0/100910/6c40379e-6af4-90bf-cb56-48e158d0abdd.png)

※"192.30.252.0/22"2015/11/18時点のGitHubのIPアドレス。 最新の情報はhttps://api.github.com/meta の "hooks"を参照すると分かる。

##Dockerコンテナ上でJenkins起動
VMにsshでログイン。
Docker未導入の場合は以下のコマンドを入力すればDockerが導入される。

```bash:docker導入～自動起動設定
sudo yum install -y docker
sudo /etc/init.d/docker start
sudo chkconfig docker on
sudo docker -v
 Docker version 1.7.1, build 786b29d/1.7.1
```

jenkinsはDockerHubで公式の環境構築済みイメージが配布されているため、これを使ってJenkinsコンテナを作る。
この例では、jenkinsのビルド結果を参照しやすくするため、'share_docker/jenkins'というディレクトリをjenkinsのホームディレクトリとしてマウントしている。

```bash:jenkinsコンテナ起動
mkdir -p /home/ec2-user/share_docker/jenkins
sudo docker run -d -h jenkinstest --name jenkinstest -p 8080:8080 -v /home/ec2-user/share_docker/jenkins:/var/jenkins_home:rw jenkins
```
```bash:docker起動パラメータ
-h jenkinstest
　>　生成するコンテナのホスト名を'jenkinstest'に設定
--name jenkinstest
　> コンテナ名を指定
-p 8080:8080
　> VMの8080番ポートへの接続をJenkinsの8080番にマッピング
-v /home/ec2-user/share_docker/jenkins:/var/jenkins_home:rw
　> VMのディレクトリをコンテナにマウントして共有
```
###Jenkins氏起動確認
イメージのダウンロードと起動処理でしばし待つ。追加の設定を特にしなくとも、Jenkinsが立ち上がり8080番ポートで待受するので、起動確認にはDockerが動作しているVMの8080版ポートにアクセスする。

なお、接続先はAWS上のVMのため、IPアドレスはVMに割り当てられた"パブリックIP"のアドレスとなる。AWSマネジメントコンソールの「インスタンス」の一覧から確認可能。
以下のような画面が出れば起動は完了。
![スクリーンショット 2015-11-18 11.19.56.png](https://qiita-image-store.s3.amazonaws.com/0/100910/eb833433-42f7-6b32-9237-9f08a0878968.png)

##GitHubと連携するJenkinsプロジェクト作成
GitHubとJenkinsを連携する方法はいくつかあるが、今回はJenkinsのプラグインのひとつ、「GitHub Plugin」を使う。
###GitHub Pluginの導入
メニュ－から「Jenkinsの管理」＞「プラグインの管理」と辿って「GitHub Plugin」をインストールするだけ。
![スクリーンショット 2015-11-18 12.32.15.png](https://qiita-image-store.s3.amazonaws.com/0/100910/ec34f3fe-d001-9d30-fec1-54ca9aeb8b85.png)

依存関係のあるプラグインもまとめて入れてくれる。

![スクリーンショット 2015-11-18 12.33.01.png](https://qiita-image-store.s3.amazonaws.com/0/100910/dca098a7-89a4-5973-602b-8834751e3f88.png)

##GitHubから最新版を取得するJenkinsプロジェクトを作成
Jenkinsの新規ジョブを作って保存する。ポイントとしては以下。
-「フリースタイル・プロジェクトのビルド」
-「ソースコード管理」
　GitHub project：自分のプロジェクトのURL
　（GitHubのプロジェクトのページで、"HTTPS clone URL"と記載されているURL)
-ソースコード管理：Git
　Repository URL：自分のプロジェクトのURLの先頭を[https://～]から[git://～」に変更したURL
　Credentials：自分のgithubアカウントの情報を追加＆指定
- Branch Specifier (blank for 'any')：*/master
- ビルド・トリガの「Build when a change is pushed to GitHub」にチェック

![image1.png](https://qiita-image-store.s3.amazonaws.com/0/100910/5ca6249d-3b97-3853-b8b3-a0db97de9d31.png)

##GitHub側の設定
プロジェクトのトップ画面から「Settings」＞「Webhooks & services」と辿って、"Add service"ボタンから"Jenkins(GitHub plugin)"を選択する。
![スクリーンショット 2015-11-18 12.43.25.png](https://qiita-image-store.s3.amazonaws.com/0/100910/19c249c2-d6f7-0a66-2cd4-8cc46a663536.png)

- Jenkins hook url：http://[VMのパブリックIP]:8080/github-webhook/
  (※末尾に '/' を付け忘れると通らないので注意)
- Activeにチェック
![スクリーンショット 2015-11-18 12.56.02.png](https://qiita-image-store.s3.amazonaws.com/0/100910/89c26cbd-cc27-8a2b-daac-0368cb288fb1.png)

###Jenkins-GitHubの連携チェック
「Test Service」を押すとJenkinsにテスト通知を送信する。
Jenkins側に通知が（ファイアウォール等でブロックされずに）到着していれば以下のように「GitHub Hook Log」に出力される。
![スクリーンショット 2015-11-18 12.55.23.png](https://qiita-image-store.s3.amazonaws.com/0/100910/c66858cc-a368-3e74-8d53-c138af4758be.png)

##AsakusaFrameworkプロジェクトの自動ビルド
[Asakusa Gradle Plugin 用プロジェクトテンプレート](http://docs.asakusafw.com/latest/release/ja/html/application/gradle-plugin.html)を使って作ったAsakusaFrameworkプロジェクトであれば、Gradleラッパー（gradlew）がデフォで入っているので、ビルド環境にGradleを入れなおす必要はない。
なので、Jenkinsではプロジェクトの「ビルド」に「シェルの実行」を追加して、以下記述するだけ。
```./gradlew clean assemble```

![スクリーンショット 2015-11-18 13.17.21.png](https://qiita-image-store.s3.amazonaws.com/0/100910/5ad77a6c-a6b8-c37d-1d05-e06c0e08ff04.png)

あとはGitHubに変更がPushされると勝手にビルドが走る。
ただし、この例ではビルド環境にASAKUSA_HOMEの設定やAsakusaの環境を構築していないので、コンパイルのみでテスト（checkタスク）は不可。
![スクリーンショット 2015-11-18 13.23.28.png](https://qiita-image-store.s3.amazonaws.com/0/100910/bd8a1735-d9b3-7ac7-bc0b-69b6395cb488.png)