GitHub
AWS
hadoop
Jenkins
AsakusaFramework

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

More than 3 years have passed since last update.

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

ビルド対象としては、Hadoop上のバッチを記述するためのフレームワーク、"Asakusa Framework"で構築したサンプルプロジェクト。

フレームワークのバージョンが上がり、以前は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と通信できるようにするセキュリティグループ設定

以下2つの通信ができるように、AWSマネジメントコンソールで通信を許可する設定をしておく。

(1) GitHubからJenkinsへ通知する際の接続

 GitHubのIPアドレスからの接続を許可

(2) JenkinsのブラウザGUIへの接続(8080番ポート)

 ブラウザからJenkinsにアクセスするPCのパブリックIPアドレスからの接続を許可

例えば以下のようにセキュリティグループの設定をする。

スクリーンショット 2015-11-18 12.22.00.png

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


Dockerコンテナ上でJenkins起動

VMにsshでログイン。

Docker未導入の場合は以下のコマンドを入力すればDockerが導入される。


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のホームディレクトリとしてマウントしている。


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


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


GitHubと連携するJenkinsプロジェクト作成

GitHubとJenkinsを連携する方法はいくつかあるが、今回はJenkinsのプラグインのひとつ、「GitHub Plugin」を使う。


GitHub Pluginの導入

メニュ-から「Jenkinsの管理」>「プラグインの管理」と辿って「GitHub Plugin」をインストールするだけ。

スクリーンショット 2015-11-18 12.32.15.png

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

スクリーンショット 2015-11-18 12.33.01.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


GitHub側の設定

プロジェクトのトップ画面から「Settings」>「Webhooks & services」と辿って、"Add service"ボタンから"Jenkins(GitHub plugin)"を選択する。

スクリーンショット 2015-11-18 12.43.25.png


  • Jenkins hook url:http://[VMのパブリックIP]:8080/github-webhook/
    (※末尾に '/' を付け忘れると通らないので注意)

  • Activeにチェック
    スクリーンショット 2015-11-18 12.56.02.png


Jenkins-GitHubの連携チェック

「Test Service」を押すとJenkinsにテスト通知を送信する。

Jenkins側に通知が(ファイアウォール等でブロックされずに)到着していれば以下のように「GitHub Hook Log」に出力される。

スクリーンショット 2015-11-18 12.55.23.png


AsakusaFrameworkプロジェクトの自動ビルド

Asakusa Gradle Plugin 用プロジェクトテンプレートを使って作ったAsakusaFrameworkプロジェクトであれば、Gradleラッパー(gradlew)がデフォで入っているので、ビルド環境にGradleを入れなおす必要はない。

なので、Jenkinsではプロジェクトの「ビルド」に「シェルの実行」を追加して、以下記述するだけ。

./gradlew clean assemble

スクリーンショット 2015-11-18 13.17.21.png

あとはGitHubに変更がPushされると勝手にビルドが走る。

ただし、この例ではビルド環境にASAKUSA_HOMEの設定やAsakusaの環境を構築していないので、コンパイルのみでテスト(checkタスク)は不可。

スクリーンショット 2015-11-18 13.23.28.png