2014年2月19日水曜日

Google Compute Engine(CentOS6)にGoのCI環境を作る

今日、少し時間があったので、Google Compute Engine(以下、GCE)上でJenkinsを動かしてビルドとテストを行う環境を作ってみました。
GCEは、DebianとCentOS6が選べるのですが、私はCentOS6を選びました。

GCEのインスタンスを起動するには、Google Cloud Consoleからインスタンスを起動するのですが、まず、前提として、「課金設定をする」必要があります。(課金設定をしないと、GCEの初期化が成功しない。)インスタンスを生成して、起動するところまでのメモは以前投稿しているのでそちらをごらんください。Google Cloud SDKもダウンロード済みだということにします。(私は忘れていたけど…)

ファイアウォールの設定


まず、GCEのファイアウォールの設定を行います。これは、iptablesではなく、GCEのインスタンスに対するファイアウォールの設定です。Cloud Consoleからでもできますが、以下のコマンドを実行しました。ポートを8888を許可する設定にしていますが、Jenkinsのデフォルトポートをそのまま使えると思うので、デフォルトのポートを使う場合は、tcp:8080にしてください。
$ gcutil addfirewall [インスタンス名] --description="Jenkins用のポート" --allowed="tcp:8888"

そして、sshでログインして、iptablesを切る。(GCEのファイアウォールに委ねるので。これに気がつくのに時間がかかってしまいました…。二重にブロックされるので結構うっとうしい…。)

$ sudo service iptables save
$ sudo service iptables stop
$ sudo chkconfig iptables off

次回の起動でiptablesが動いてくれると困るので、chkconfigでoffにしておきます。

Javaのインストール


Javaもyumで入れましたが、公式のものが入れられなかった(多分、ブラウザでアクセスして、利用規約に同意のチェックがいる?)のでopenjdkを入れました。Jenkinsが動けば問題は無いので、細かいことは無視しました。
$ sudo yum search jdk

java-1.7.0-openjdk.x86_64 : OpenJDK Runtime Environment
java-1.7.0-openjdk-demo.x86_64 : OpenJDK Demos
java-1.7.0-openjdk-devel.x86_64 : OpenJDK Development Environment
java-1.7.0-openjdk-javadoc.noarch : OpenJDK API Documentation
java-1.7.0-openjdk-src.x86_64 : OpenJDK Source Bundle
ldapjdk-javadoc.x86_64 : Javadoc for ldapjdk
icedtea-web.x86_64 : Additional Java components for OpenJDK - Java browser plug-in : and Web Start implementation
ldapjdk.x86_64 : The Mozilla LDAP Java SDK

$ sudo yum install java-1.7.0-openjdk-devel.x86_64

Jenkinsのインストール

Jenkinsをインストールします。Jenkinsのrpm版が提供されていたのでもしかしたら?と思ったら、yumでインストールも可能だったので、yumにKeyを登録してインストールしています。

$ 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

Jenkinsの設定とサービスの登録

PORTを8888に変更する。(デフォルトが8080なので、そのままでもいいと思いますが)
$ sudo vi /etc/sysconfig/jenkins
JENKINS_PORT="8888"

Jenkinsのchkconfigをon
$ sudo chkconfig jenkins on

Jenkinsを起動させる。(初回だけ)
$ sudo service jenkins start

Jenkinsの起動確認


ブラウザで、http://[VM InstanceのEXTERNAL ADDRSSのipアドレス]:8888/
にアクセスしてJenkinsが表示されれば、成功です。

Gitも忘れずにインストールしておきましょう
Gitのインストール

$ sudo yum install git


Goをソースからインストールする。

私はこれしかしたことがないので(?)、今回もソースからGoをインストールしました。
Goをコンパイルするために、gccとmakeを、ソースコードをダウンロードするためにmercurialをインストールしました。

$ sudo yum install mercurial-hgk.x86_64

$ sudo yum install gcc

$ sudo yum install make

$ hg clone -u release https://code.google.com/p/go

$ cd go/src

$ ./all.bash

GCE上でGoのコンパイルをしてみたのですが、意外と早くて、1分30秒程度で終わったような気がします。そこからtestが始まりましたが、testはもう少しかかったかも?
で、喜んでいたら、一般ユーザのディレクトリでビルドしてしまったので、Jenkinsからコマンドを実行しようと思うと、Permissionで弾かれてしまいますから、これも良くないのですが、/home/ユーザのディレクトリにchmod o+rxしてしまいました。
次回以降は気をつけようと思います。基本は/usr/local以下ですかね。

Jenkinsのプロジェクト設定

Jenkinsにgitプラグインを入れたのですが、よく考えると、Goの場合は、go getでダウンロードしてからgo testですので、gitプラグインは無くても大丈夫です。
したがって、ビルドの設定の「シェルの実行」のところに、コマンドをいくつか書きました。

export GOPATH=${WORKSPACE}
/home/yokoyama/go/bin/go get github.com/taknb2nch/go-pop3

cd ${WORKSPACE}/
/home/yokoyama/go/bin/go test 

ポイントは、GOPATH変数を都度exportしているところでしょうか。go get/go testコマンドを実行しようと思うと、GOPATHに入れておかないといけませんからこのような形になります。
リポジトリは、+Takanobu Haginoさんが作られた、POP3のライブラリを対象にしてみました。(私のリポジトリにしようかと思いましたが、私のはどれもレガシーコードですので…w)

結果


ちゃんと、PASSの文字が輝いております。
Started by user anonymous
Building in workspace /var/lib/jenkins/jobs/Sample/workspace
[workspace] $ /bin/sh -xe /tmp/hudson5366985436882835859.sh
+ export GOPATH=/var/lib/jenkins/jobs/Sample/workspace
+ GOPATH=/var/lib/jenkins/jobs/Sample/workspace
+ /home/yokoyama/go/bin/go get github.com/taknb2nch/go-pop3
+ cd /var/lib/jenkins/jobs/Sample/workspace/
+ /home/yokoyama/go/bin/go test
PASS
ok   _/var/lib/jenkins/jobs/Sample/workspace 0.003s
Finished: SUCCESS

今回は、「手動実行」まででとどめました。常時起動するほどテストをすることがないということと、課金の問題があるので、無駄に起動しておくのはまずい。ということが大きな理由です。これで、GCEについてのノウハウが少しずつ貯めていけそうです。

参考サイト

https://developers.google.com/compute/docs/quickstart#centos
http://d.hatena.ne.jp/katsuren/20121030/1351569655
http://d.hatena.ne.jp/okinaka/20120404/1333524730