JenkinsでwarファイルをTomcatにデプロイする方法

Tomcatサーバーへのデプロイは手動で行ってきました。
Antでリリースパッケージを作成して、SCP or FTPでリリース。原始的な方法です。
ですがJenkinsにTomcatのデプロイ用のプラグインがあるので、最近はデプロイ作業もJenkinsで行っております。

構成はこんな感じです。

  • SCM:bitbucket
  • CI:Jenkins
  • AP:Tomcat7

ちなみに、Tomcatへのデプロイはコンテキスト形式ではなく、ROOTディレクトリしてデプロイします。
コンテキスト名で運用する必要もないのでROOTとしてデプロイします。

概要はこんな感じで考えています。

概要

f:id:beeete2:20160708233220p:plain

あと、今回はなるべく標準設定でおこないたかったのでTomcatへ8080ポートでアクセスします。
本運用はApacheなどをかませる場合があると思いますが、今回はそれを行っていません。
※ 2013/12/03追記 別途Apacheと連携する記事を書きました。
記事はこちらです。

Tomcat7の設定

Tomcatにリモートからデプロイできるようにするため、managerアプリケーションの設定を行います。

webapps以下のディレクトリ構成

今回のディレクトリ構造を以下のように考えています。 f:id:beeete2:20160708233349p:plain

TOMCAT_HOME/webappsディレクトリ以下に、Jenkins、manager、ROOTとすべて配置する予定です。
紛らわしいので、webapps/manager以外のディレクトリはすべて削除しておきました。

デプロイ用のユーザーを追加

TOMCAT_HOME/conf/tomcat-users.xmlを開き、デプロイ用のユーザーを追加します。

<user 
  username="username" 
  password="password" 
  roles="admin-gui,admin-script,manager-gui,manager-status,manager-script" />

rolesにはフルスペックを記載しましたが、適度に権限を絞ったほうがよいと思います。
GUIからアップロードするわけじゃないので、gui関連はいらないんじゃないかなーと思います。
もちろん、usernameとpasswordはしっかりと決めてください。

とりあえず、Tomcat側はこれで大丈夫です。

Jenkinsの設定

続いてJenkinsの設定です。

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

Jenkinsから以下のプラグインをインストールしてください。 フィルターに「Deploy Plugin」を入力すると少し探しやすくなります。 f:id:beeete2:20160708233648p:plain

WARファイルの作成

一応今回は、Jenkinsでcloneした後、AntでWARファイルを生成してそれをTomcatにデプロイするという流れなのでAnt/Maven等を使ってWARファイルを作成する必要があります。
試したいだけの方は、いちいちビルドスクリプト書いてgitにpushして・・・、というのが面倒だと思いましたので、自分の方でスケルトンのアプリを作りましたので、こちらでお試しいただけます。
github.com

ジョブの作成

いよいよ、デプロイ用のジョブを作成します。
いきなりデプロイまで行くと、何か問題があった時にどこに問題があるのかわからないので、とりあえずここではジョブの作成からWARファイルの作成までを行います。
ジョブの作成を行って、ジョブ名などは適当に入力してもらうとして、変更したのは以下の箇所です。
・ソースコード管理・・・GitにしてリポジトリにURLを入力
・ビルド・・・Antの呼び出しを追加して、ターゲットに「war」を設定
f:id:beeete2:20160708233848p:plain

これで、保存してビルドを実行してみます。
ちなみに、上記GitHubからクローンするとbuild.xmlにwarというタスクが設定してあって、jspファイルが一つ含まれたディレクトリをwarファイルにしています。
※GitHubにSubversionのチェックアウトができるようなので試してみたのですが、Jenkins上からだとできませんでした。
コマンドラインからは実行できたので、おそらくJenkinsが内部で使っているSVNKitで何らかの問題が発生しているのかなーと思います。

すると、target/distにROOT.warというファイルが生成されたと思います。 f:id:beeete2:20160708234002p:plain

デプロイの設定

いよいよデプロイの設定を行います。

ビルド後の処理にデプロイ設定を追加

ビルド後の処理からDeploy war/ear to a containerという長ったらしい処理を選択します。 f:id:beeete2:20160708234138p:plain

設定は以下のように行いました。 f:id:beeete2:20160708234212p:plain

  • WAR/EAR files・・・target/dist/ROOT.war
  • Context path・・・/
  • Container・・・Tomcat 7.x
  • Tomcat URL・・・http://localhost:8080/

今回はコンテキストは切らずに/にROOTとしてデプロイするので、Context pathは"/"にしています。コンテキスト運用する場合はコンテキスト名を入力します。

デプロイの実行

いよいよビルドボタンを押してビルドを実行してみます。 問題なければTomcatのログに下記のようなログが表示されます。

情報: test-deploy #3 main build action completed: SUCCESS
2013/09/25 19:38:41 org.apache.catalina.startup.HostConfig deployWAR
情報: Webアプリケーションアーカイブ /var/tomcat-7.0.42/webapps/ROOT.war を配備します

※ログ内容は実行環境により異なります。 大事なのは行目です。 このログが出力されていればおそらくデプロイは成功していると思います。

ブラウザで http://サーバーのIP:8080/test.jsp にアクセスすると、「Hello World.」と表示されたページが表示されればデプロイ成功です。

まとめ

最初の環境構築は面倒ですが、一度作ってしまえば後はボタン押すだけなので簡単ですね。 ですが、問題点もあるんです・・・。 Tomcatで運用している人は経験あるかもしれないんですけど、アプリケーションのアンデプロイした時にメモリが開放されない場合がありOutOfMemoryの危険性があります。 なので本番サーバーのときはデプロイをした後、手動でTomcatの再起動をしています。 この辺りはもう少し改善が必要ですね。例えば自動的にSSHでログインして再起動というのもありかなーと最近思っています。