Gradleを使ってTomcatサーバーへのデプロイ作業を自動化

2019-01-31Gradle

AntやMavenを使い倒した人には何でもないことなんだろうけれども便利だと思ったのでメモ。Tomcat7を使用。

事前準備

$TOMCAT_HOME/conf/tomcat-users.xml を編集して、適当な ロールユーザー を追加する。

以下のような設定を追記した。

  • ロール: manager
  • ユーザー名・パスワード: manager-script

tomcat-users.xml

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
  <role rolename="manager"/>
  <user username="manager-script" password="manager-script" roles="manager"/>
</tomcat-users>

設定後、Tomcatサーバーを起動(すでに起動していた場合は再起動)して以下のURLでログインできることを確認する。
(Tomcatサーバーのホスト名は "testserver" とする。)

http://testserver:8080/manager

Gradleのビルドファイルを作成

次にbuild.gradleを作成する。
以下のような設定を追記する。 xxxxxxの部分には、デプロイ対象のアプリケーション名を指定する。

build.gradle

apply plugin: "groovy"
apply plugin: "war"
version = "1.0.0"
configurations {
    catalinaAnt
}
dependencies {
    catalinaAnt "org.apache.tomcat:tomcat-catalina-ant:7.0.0"
    // 以下省略
}

// 先程ログインの動作確認をしたサーバのURL
def url = "http://testserver:8080/manager"
// デプロイ対象のアプリケーション名
def path = "/xxxxxx"
def user = project.properties['user']
def password = project.properties['password']

task tomcatStop << {
    ant.taskdef(
        'name':"stop", 'classname':"org.apache.catalina.ant.StopTask", 'classpath':configurations.catalinaAnt.asPath
    )
    ant.stop( 'username':user, 'path':path, 'password':password, 'url':url )
}

task tomcatStart << {
    ant.taskdef(
        'name':"start", 'classname':"org.apache.catalina.ant.StartTask", 'classpath':configurations.catalinaAnt.asPath
    )
    ant.start( 'username':user, 'path':path, 'password':password, 'url':url )
}

task tomcatReload(dependsOn:[clean, war]) << {
    ant.taskdef(
        'name':"reload", 'classname':"org.apache.catalina.ant.ReloadTask", 'classpath':configurations.catalinaAnt.asPath
    )
    ant.reload( 'username':user, 'path':path, 'password':password, 'url':url )
}

task tomcatList << {
    ant.taskdef(
        'name':"list", 'classname':"org.apache.catalina.ant.ListTask", 'classpath':configurations.catalinaAnt.asPath
    )
    ant.list( 'username':user, 'password':password, 'url':url )
}

task tomcatDeploy(dependsOn:[clean, war]) << {
    ant.taskdef(
        'name':"deploy", 'classname':"org.apache.catalina.ant.DeployTask", 'classpath':configurations.catalinaAnt.asPath
    )
    ant.deploy( 'username':user, 'path':path, 'password':password, 'url':url, 'war':"$rootDir/build/libs/xxxxxx-1.0.0.war" )
}

task tomcatUndeploy << {
    ant.taskdef(
        'name':"undeploy", 'classname':"org.apache.catalina.ant.UndeployTask", 'classpath':configurations.catalinaAnt.asPath
    )
    ant.undeploy( 'username':user, 'path':path, 'password':password, 'url':url )
}

デプロイのテスト

build.gradleが用意できたらデプロイを試してみる。

$ gradle war

これで xxxxxx-1.0.0.war がbild/libsフォルダ以下に作成される。その後以下のコマンドを実行すれば、Tomcatサーバーにwarファイルがデプロイされる。user、passwordプロパティにはtomcat-users.xmlに設定したユーザー名、パスワードを入力する。

$ gradle -Puser=manager-script -Ppassword=manager-script tomcatDeploy

上記コマンドを一度で実行してもいける。

$ gradle -Puser=manager-script -Ppassword=manager-script war tomcatDeploy

以下のURLにアクセスし、正しくデプロイされていることを確認する。

  • http://testserver/xxxxxx/

ひとこと

xxxxxxの部分は、Gradle実行中のプロジェクト名と同じため、Gradleのプロパティから取得できそう。
1.0.0 というバージョン部分もbuild.gradleの上部に記述しているのでこれを参照するようにしたい。

2019-01-31Gradle