Hubot

Jenkins(+Nginx) - Hipchat - Hubot 環境構築メモ

タイトルの通りの環境を作ってみたのでメモを残しておきます。

(昨日やったことを思い出しながら書いているので参考までに)

この環境でできることは

1.HipchatからHubotに命令する。
2.HubotがJenkinsのJOB実行APIを叩く
3.JenkinsがJOBを実行する
4.JenkinsがHipchatに結果を通知する

ができるようになりました。

0.目次

  • 1.Hipchatの設定
  • 2.EC2インスタンスの準備
  • 3.Jenkinsのインストール
  • 4.Jenkinsの初期設定とプラグインのインストール
  • 5.Hubotのインストール
  • 6.HipchatからHubot経由でJenkinsのJOBを実行する

1.Hipchatの設定

参考にしたのはこちらの記事
-> Jenkins+HipChat+Hubotをチーム開発に導入してお手軽CI

やることは以下の2つです。

  • Hubot用のJenkinsユーザー作成をGroupAdminから作成します。
  • 通知用のAPIトークンを生成しておく。

あとでこのAPIや、作成したユーザーのJabber IDが必要になります。
ユーザー登録時にEメール設定が必要で、gmailの拡張エイリアスを使って <メールアドレス>+jenkins@gmail.comとしておいた。
作成したユーザーをhubotを呼びたいルームに招待しておく。

2.EC2インスタンスの準備

参考にしたのはこの記事
-> EC2にJenkinsによるCI環境を作成する

Amazon Linux AMI (64bit)をM3.Mediumで作成。

必要そうなモジュールのインストールと初期起動設定

インスタンスができたらEC2-userでログインして、yumで必要そうなモジュール追加
実際の順序は異なったり、平行してRuby環境も作ってたのでJenkinsには不要なものもあるかもしれないけど
Node.jsのビルドや、Hubotの実行やらなんやらで以下のものがhisoryコマンドの結果にありました。

sudo yum update
sudo yum -y install git
sudo yum -y install build-essential
sudo yum -y install make glibc-devel gcc
sudo yum -y install openssl
sudo yum -y install openssl-devel
sudo yum -y install libicu-devel
sudo yum -y install nginx
sudo yum -y install httpd-tools
sudo yum --enablerepo=epel install redis
 
sudo /etc/init.d/redis start
sudo /sbin/chkconfig --levels 235 redis on
 
sudo /etc/init.d/nginx start
sudo  /sbin/chkconfig --levels 235 nginx on

3.Jenkinsのインストール

まずはJavaのインストール。

今回はJava8にしてみた。Oracleからダウンロードするには以下のコマンドでOK

wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u25-b17/jdk-8u25-linux-x64.rpm -q -O /tmp/jdk-8u25-linux-x64.rpm
sudo yum localinstall /tmp/jdk-8u25-linux-x64.rpm
sudo update-alternatives --install /usr/bin/java java /usr/java/default/bin/java 200000
ll /usr/java/jdk1.8.0_25/bin/
sudo update-alternatives --install "/usr/bin/java" "java" "/usr/java/jdk1.8.0_25/bin/java" 1

Jenkinsはyumでインストール

sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
sudo yum install jenkins
sudo service jenkins start
sudo  /sbin/chkconfig --levels 235 jenkins on

これでとりあえずJenkinsは動く。

4.Jenkinsの初期設定とプラグインのインストール

初期ユーザー設定

あとで少し変更するがEC2にJenkinsによるCI環境を作成するにそって、アドミン権限的なユーザーを作成しておく。

プラグインのインストール

Manage Jenkins > Manage Plugins から必要そうなのと使いそうなプラグインを選んでインストールして再起動
いま確認したら以下のプラグインが有効になってた。

  • Ant Plugin 1.2
  • Build With Parameters 1.1
  • Config File Provider Plugin 2.7.5
  • Confluence Publisher 1.8
  • Credentials Plugin 1.18
  • External Monitor Job Type Plugin 1.2
  • GIT client plugin 1.11.0
  • GIT plugin 2.2.7
  • GitBucket Plugin 0.5.1
  • Gradle plugin 1.24
  • HipChat Plugin 0.1.8
  • Ivy Plugin 1.24
  • Javadoc Plugin 1.2
  • JDK Parameter Plugin 1.0
  • JUnit Plugin 1.1
  • Mailer Plugin 1.11
  • Matrix Authorization Strategy Plugin 1.2
  • Matrix Project Plugin 1.4
  • Maven Integration plugin 2.7
  • NodeJS Plugin 0.2.1
  • OWASP Markup Formatter Plugin 1.2
  • PAM Authentication plugin 1.2
  • Rake plugin 1.8.0
  • rbenv plugin 0.0.16
  • ruby-runtime 0.12
  • RubyMetrics plugin for Jenkins 1.6.2
  • sbt plugin 1.4
  • Scala JUnit Name Decoder 1.0
  • SCM API Plugin 0.2
  • SSH Credentials Plugin 1.10
  • SSH Slaves plugin 1.8
  • TestFairy 1.0
  • Testflight Plugin 1.3.9
  • Token Macro Plugin 1.10
  • Translation Assistance plugin 1.11
  • Windows Slaves Plugin 1.0
  • Xcode integration 1.4.2

プラグインの設定

インストールしたプラグインの設定をManage Jenkins > Configure System から行う。
ビルドツール系のパスの設定などを行う。
Hipchatプラグインの設定はこちらの記事のキャプチャにあるとおり
-> Jenkinsのビルド結果をHipChatで通知する方法

適当なビルドJOBを作成して、
[HipChat Notifications]のところでルーム名を指定すればビルド開始や完了時にHipchatに通知が届くようになりました。

5.Hubotのインストール

次はHubotを使ってHipchatからJenkinsへのリクエストを行えるようにします。
参考にしたのは公式doc
-> Getting Started With Hubot

Node.jsはnodebrewを使って準備

wget -O git.io/nodebrew
perl nodebrew setup
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH"' >> ~/.bash_profile
source ~/.bashrc
nodebrew install v0.10.32
nodebrew alias default v0.10.32
nodebrew use default
npm install -g hubot coffee-script

Hubotのワークディレクトリの作成

次のReadMEを参考に
-> hipchat/hubot-hipchat

ただし、この記事はHerokuで動かす前提で書かれているのでProcfileとかは不要です。

hubot --create jenkins
npm install
npm install --save hubot-hipchat
git add .
git commit -m "Initial commit"

hubotに渡す変数は全て環境変数経由のようなので、bin/hubotを修正します。
あと、PORT番号をJenkinsとぶつからないように変更します。

#!/bin/sh 
 
set -e
 
npm install
export PATH="node_modules/.bin:node_modules/hubot/node_modules/.bin:$PATH"
 
export HUBOT_HIPCHAT_JID="<作成したHipchatユーザーのJobberID>"
export HUBOT_HIPCHAT_PASSWORD="<作成したHipchatユーザーのログインパスワード>"
 
# ここはあとで設定する 
# export HUBOT_JENKINS_URL="<JenkinsのURL>" 
# export HUBOT_JENKINS_AUTH="<Jenkinsのベーシック認証ユーザ>:<Jenkinsのベーシック認証パスワード>" 
 
 
export PORT="8081"
 
exec node_modules/.bin/hubot "$@" --adapter hipchat

この状態でHubotを起動(start-stopデーモンがうまく動かなかったのでとりあえずnohupでバックグランド起動)すると、

nohup bin/hubot &

以下のようなログがでていればOK

[Mon Oct 20 2014 09:49:46 GMT+0000 (UTC)] INFO Connected to hipchat.com as @<Hubotユーザー名>
[Mon Oct 20 2014 09:49:46 GMT+0000 (UTC)] INFO Data for hubot brain retrieved from Redis
[Mon Oct 20 2014 09:49:47 GMT+0000 (UTC)] INFO Joining <ルームID>@conf.hipchat.com

hipchatのhubotユーザーがルームに入ってきます。

@<Hubotユーザー名> hi
@<Hubotユーザー名> translate me こんにちは

みたいなhubotのデフォルトのスクリプトに反応してくれるようになります。

6.HipchatからHubot経由でJenkinsのJOBを実行する

jenkins用hubotコマンドの入手

さて、最後はHubotに命令することでJenkinsのJOBが実行できるようにします。
Jenkinsを起動するスクリプトはこれ
github/hubot-scriptsにはほかにもたくさん便利コマンドがありそうなので、いろいろ試してみたい。

使いたいコマンドをscriptsディレクトリに保存します。

wget -O https://raw.githubusercontent.com/github/hubot-scripts/master/src/scripts/jenkins.coffee

jenkins.coffeeのヘッダーコメントにあるように、このコマンドに必要な引数を
bin/hubot内で環境変数にセットします。

export HUBOT_JENKINS_URL="<JenkinsのURL>"
export HUBOT_JENKINS_AUTH="<Jenkinsのベーシック認証ユーザ>:<Jenkinsのベーシック認証パスワード>"

一度hubotを止めて、bin/hubotで再度起動します。

Jenkinsのベーシック認証設定

Jenkinsに対してリモートからHTTPリクエストを投げる場合は、Jenkinsの認証はベーシック認証で行う必要があるようです。
ググるとJenkins単体でベーシック認証をするのではなく、ApacheやNginxで行うのが一般的なようでした。

参考にしたのはこの記事
-> JenkinsサーバのSSL対応とBasic認証

今回はSSL化は行いませんでしたが、SSL設定はJenkinsはあまり関係なく、keyとcertファイルを用意してNginxだけでやれば良さそうです。
Nginxでリバースプロキシします。
今回EC2のセキュリティグループで8080しかポートを開けていなかったのでNginxで8080をListenしてJenkinsは別のポートを使うように
/etc/sysconfig/jenkinsを修正する必要がありました。

sudo su - root
cd /etc/nginx/conf.d
cp virtual.conf jenkins.conf
vi jenkins.conf
htpasswd -c /etc/nginx/.htpasswd jenkins_admin
cp -rp /etc/sysconfig/jenkins /etc/sysconfig/jenkins.bak
vi /etc/sysconfig/jenkins
service nginx stop
service jenkins restart
service nginx start

/etc/sysconfig/jenkinsでPORTを8090に変更して、
jenkins.confは以下の通りにしました。

server {
    listen       8080;
    server_name  jenkins;
 
    location / {
      proxy_pass http://127.0.0.1:8090/;
      auth_basic "jenkins server";
      auth_basic_user_file /etc/nginx/.htpasswd;
      proxy_set_header Authorization "";
    }
}

これでHipchatからhubotに対してjenkins build ジョブ名と語りかけると指定したジョブが実行されます。
ビルド結果はJenkinsから直接Hipchatに対して通知されます。


今後は、JIRA,bitbucket連携を進めていきたいです。