この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
渡辺です。
本日は、JavaのWebアプリケーションをTomcatの動くEC2インスタンスへGradleを利用してデプロイする小ネタを紹介します。
EC2インスタンスの準備
はじめにTomcat(Tomcat8)が動作するEC2インスタンスを準備します。 Amazon Linuxを起動し、以下のスクリプトを流すか、UserDataに指定して起動してください。
#!/bin/bash -v
yum -y update
yum -y install java-1.8.0-openjdk-devel tomcat8
yum -y remove java-1.7.0-openjdk
chkconfig tomcat8 on
service tomat8 start
※現在のAmazon LinuxではデフォルトでJava7のJREのみがインストールされています(Amazon LinuxでJava8/Tomcat8の環境を構築する)
なお、今回はEIPを持つサーバとします。
Gradle
Gradle SSH pluginを使い、次のようにタスクを設定しましょう。
// build.gradle から抜粋
apply plugin: 'org.hidetake.ssh'
buildscript {
repositories {
mavenCentral()
jcenter()
}
dependencies {
classpath 'org.hidetake:gradle-ssh-plugin:0.4.5'
}
}
// Deploy to web server
// https://gradle-ssh-plugin.github.io/
remotes {
prd01 {
host = 'X.X.X.X'
user = 'ec2-user'
knownHosts = allowAnyHosts
identity = file('key.pem')
}
prd02 {
host = 'X.X.X.X'
user = 'ec2-user'
knownHosts = allowAnyHosts
identity = file('key.pem')
}
}
task deployPrd(dependsOn: 'war') << {
ssh.run {
settings {
pty = true
}
session([remotes.prd01, remotes.prd02]) {
put war.archivePath.path, '/tmp/'
executeSudo 'service tomcat8 stop'
executeSudo "rm -rf /usr/share/tomcat8/webapps/ROOT"
executeSudo "mv /tmp/${war.archiveName} /usr/share/tomcat8/webapps/ROOT.war"
executeSudo 'service tomcat8 start'
}
}
}
特に難しい点はないかと思います。 ここではコンテキストパスをルートにするため、warファイルの名前をROOT.warに変更していますが、サーバにWARを転送し、tomcatのwebappにwarファイルを配置し、再起動するだけです。 ステージング環境がある場合でも大きく変わらないでしょう。
まとめ
デプロイは可能な限り自動化しましょう。
2014.12.01追記
コメント欄で指摘があったので編集しました!ありがとうございます。