初めてのAmazonEC2 + trac + svn + maven + jenkins + tomcat + MySQL

やりたいこと

定期的に新しいソースを取ってきて、テストして、コンパイルして、デプロイして最新バージョンのアプリを常に起動していたい
(要はCI環境構築)

詳細化してみる
・アプリケーションを動かしたい
・デプロイしたい
・テストしたい
コンパイルしたい
・最新ソースを取りたい
・EC2にログインしたい

前提

サーバー(EC2)WindowsServer、ubuntu

今までの経験

EC2(初)
trac(プロジェクトで使ってた)
svn(プロジェクトで使ってた)
maven(ほぼ初。maven2が出たばかりのときに少し試してみただけ)
jenkins(hudsonセットアップ1回だけ)
tomcat(プロジェクトで使ってた)
MySQL(ほぼ初)
ubuntu(家のサーバーがubuntuだったので、2年か3年前trac入れてみたことがある程度)
linux(Cのプロジェクトでサーバーでしかコンパイルできない悲しい状況だったことがある程度。3ヶ月くらいかな。)

サーバーの使い分け

WindowsServer:TracLightning(trac,svn)、maven3
ubuntu:tomcatMySQL

私が使ったPC

WindowsXP
MacBookAir


サーバーに対してすでにやってあること

Tomcatのインストール
MySQLのインストール
TracLightningのインストール
Javaのインストール

EC2にログインしたい

ubuntuSSHでログインする

EC2の管理者は上司様。
キーファイルをありがたく頂戴する。
SSHポートを空けてもらう。
ログインしてみる。

> ssh -i keyfile.pem IPアドレス
Permission denied (publickey).

へ?
上司様に聞く。

> ssh -i keyfile.pem ほげほげ.ap-northeast-1.compute.amazonaws.com

つながった!

WindowsServerにログインする

WindowsXPからリモートデスクトップで接続。
ユーザーとパスワードを上司様に聞く。
ログインできた!

最新ソースを取りたい

TracLightningが入っているので、svnはある。
Tracの画面からユーザーと権限をサーバー用に作成。
適当なディレクトリにチェックアウトしてみる。
できた。

コンパイルしたい

ここではじめてのMaven3を使ってみる。
本とGoogle先生にご教授願う。

apache-maven-3.0.3-bin.zip をダウンロード
http://maven.apache.org/download.html


zipを解凍。Cドライブの下におく。
C:\apache-maven-3.0.3

pathを通す。
mvnコマンドが使えるかためすために、バージョンを確認してみる。

> mvn --version
Apache Maven 3.0.3 (r1075438; 2011-03-01 02:31:09+0900)
Maven home: C:\apache-maven-3.0.3\bin\..
Java version: 1.6.0_24, vendor: Sun Microsystems Inc.
Java home: C:\Program Files\Java\jdk1.6.0_24\jre
Default locale: ja_JP, platform encoding: MS932
OS name: "windows xp", version: "5.1", arch: "x86", family: "windows"

きた!


チェックアウトしたプロジェクトの直下に初めてのpom.xmlを書く。
Maven Centralで使用するjarを検索しつつ、dependencyを追加していく。
http://search.maven.org/

provided コンパイルにも、warにも追加。
compile コンパイルだけ、warには含まない。


org.apache.struts
struts2-core
2.2.1.1
compile

...

など。使用するjarをすべて記述。
忘れずに、jarからwarに変える。

war


Mavenを使ってコンパイルしてみる。pom.xmlのあるディレクトリまで移動し、

C:\project\hello_world>mvn compile
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building hello_world 0.0.1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.4.3:resources (default-resources) @ hello_world ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:\project\hello_world\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ hello_world ---
[INFO] No sources to compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.703s
[INFO] Finished at: Mon Jun 06 10:50:24 JST 2011
[INFO] Final Memory: 3M/15M
[INFO] ------------------------------------------------------------------------

きた!

warを作ってみる。

C:\project\hello_world>mvn package
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building hello_world 0.0.1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.4.3:resources (default-resources) @ hello_world ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:\project\hello_world\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ hello_world ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-resources-plugin:2.4.3:testResources (default-testResources) @ hello_world ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:\project\hello_world\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:2.3.2:testCompile (default-testCompile) @ hello_world ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-surefire-plugin:2.7.2:test (default-test) @ hello_world ---
[INFO] No tests to run.
[INFO] Surefire report directory: C:\project\hello_world\target\surefire-reports

                                                                                                            • -

T E S T S

                                                                                                            • -

There are no tests to run.

Results :

Tests run: 0, Failures: 0, Errors: 0, Skipped: 0

[INFO]
[INFO] --- maven-jar-plugin:2.3.1:jar (default-jar) @ hello_world ---
[WARNING] JAR will be empty - no content was marked for inclusion!
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.750s
[INFO] Finished at: Mon Jun 06 10:52:41 JST 2011
[INFO] Final Memory: 4M/15M
[INFO] ------------------------------------------------------------------------

きた!
targetディレクトリができて、warファイルがそのなかにできている!
しかもテストも実行されている!
よしよし。

デプロイしたい

これまではWindowsServer内だけだったけど、これからubuntuにあるtomcatにデプロイする。
ここでjenkinsを使う。
TracLightningに同梱されているjenkinsを使う。
C:\TracLightning\project\hudson\.hudson\jenkins.xml
を修正する。(ポートやプレフィックスを指定)

-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8080 --prefix=/jenkins

サービスから起動。
http://localhost:8080/jenkins/
へアクセス。
(ポートを8080に変更したので、httpd.confも修正しておく。)

デプロイプラグインを追加する。
Jenkinsの管理>プラグインの管理>利用可能タブ>Deploy Plugin をインストールして、サービスの再起動。


プロジェクトの設定で、Tomcatへのデプロイを設定する。


SVNの設定も入れておく。


JavaMavenはインストールしたものを使う。(Tracのは使わないので設定変更)
Jenkinsの管理>システムの設定


ビルド実行リンクを押下!


アプリケーションを動かしたい

MySQLにdatabaseを作る。

> mysql -u root
> create database データベース名
> show databases;

作成したデータベース名が表示されていることを確認。

> use データベース名

あ、ddlサーバーにおくらなあかんのやった。
というわけで、ftpを使う。

> apt-get install vsftpd

/etc/vsftpd.confのアスキー設定とか、書き込み設定を許可する。

write_enable=YES
ascii_upload_enable=YES
ascii_download_enable=YES

再起動

> /etc/init.d/vsftpd restart

ffftpでファイルを送ってみる。
MySQLddlを実行。

> mysql database < text_file

私がはまったポイント

Tomcatが入っているところに、さらにTomcatをインストールして、EC2が応答しなくなった。
ftpサーバーを立てるのをやったことなくて、インストールしたけどつながらないなーとか思いつつ、ポートが閉じてるのか?とか考えた結果、ufwをinactiveからactiveに変更してしまった結果、sshポートを空けてなくてつなげることができなくなってしまった。
jenkinsの画面がポートを変えているせいで、外から見えなかった。
MySQLがすでにインストールされていることを知らず、インストールし、rootのパスワードを設定したのに設定と違っていてえーんってなった。
Javaをインストールしたのに、バージョンが違ってえ(ry
Tomcatのlibに入っているjarとwarに入っているjarがかぶっていて、以下のようなエラーがでた。

Unable to load configuration. - bean - jar:file:ほげほげ/WEB-INF/lib/struts2-core-2.2.1.1.jar!/struts-default.xml:29:72
at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:69)
at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:371)
at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:415)

ビルド環境から、つくったwarをローカルにコピーして、Tomcat managerでデプロイしようとしたら、以下のようなエラーがでた。
(ビルド環境からそのままデプロイしたら、エラーにならなかった。なぜかしら?)

SEVERE: Exception fixing docBase for context [/Training2011WebApp-1.0-SNAPSHOT]
java.util.zip.ZipException: error in opening zip file
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.(ZipFile.java:114)
at java.util.jar.JarFile.(JarFile.java:135)
at java.util.jar.JarFile.(JarFile.java:72)
at sun.net.www.protocol.jar.URLJarFile.(URLJarFile.java:72)
at sun.net.www.protocol.jar.URLJarFile.getJarFile(URLJarFile.java:48)

ビルドは正常終了するのに、デプロイされない><
(warファイルのありかをJenkinsのワークスペースから指定しなきゃいけないのに、できてなかった。)
EC2が応答しなくなった(壊した///)ときは、上司様にお願いして、インスタンスをターミナルして新しいインスタンスをバックアップしておいたAMIから起動してもらう。
Maven3ってのがでてるんだーとつぶやいたら、Maven2と互換性高いという情報をいただきましたので、Maven2の本で学習しました。
(E和の@koicさん、@ryhmrtさんありがとうございます。)


うーん、はまりすぎ。