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

gradle

渡辺です。

本日は、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 {
        session(remotes.prd01, remotes.prd02) {
            put war.archivePath.path, '/tmp/'
            executeSudo 'service tomcat8 stop', pty: true
            executeSudo "rm -rf /usr/share/tomcat8/webapps/ROOT", pty: true
            executeSudo "mv /tmp/${war.archiveName} /usr/share/tomcat8/webapps/ROOT.war", pty: true
            executeSudo 'service tomcat8 start', pty: true
        }
    }
}

特に難しい点はないかと思います。 ここではコンテキストパスをルートにするため、warファイルの名前をROOT.warに変更していますが、サーバにWARを転送し、tomcatのwebappにwarファイルを配置し、再起動するだけです。 ステージング環境がある場合でも大きく変わらないでしょう。

まとめ

デプロイは可能な限り自動化しましょう。