GradleによるTomcatサーバへのデプロイ

2014.11.27

渡辺です。

本日は、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追記

コメント欄で指摘があったので編集しました!ありがとうございます。