Использование плагина Gradle Cargo для развертывания в нескольких средах

Я пытаюсь иметь несколько задач Gradle в моем файле build.gradle для развертывания войны в разных средах. Я хочу иметь возможность иметь задачу deployToLocal вместе с deployToQA и deployToDev после создания файла войны.

Конечно, это означает, что я хочу остановить службу Tomcat, удалить существующие файлы войны и расширенные войны в каталоге веб-приложений Tomcat, скопировать войну и снова перезапустить Tomcat, чтобы развернуть службу.

Мой вопрос двоякий:

  1. Я указал местоположение войны, которую я буду копировать вместе со всей информацией об имени хоста, порте и имени пользователя/пароле. Мой вопрос: как мне указать, в какое место в удаленных средах (структура каталогов) должна быть скопирована война?
  2. Что касается цели, которую я пытаюсь достичь, это правильный путь для продвижения вперед?

Мой код до сих пор:

task deleteDirLocalhost(type: Delete){
    //delete fileTree(dir: local_Tomcat_webapps_dir)
    delete fileTree(dir: 'C:\\Tomcat7.0\\webapps')
}

task deployToLocal{
    dependsOn war, tomcatStop, deleteDirLocalhost
    println "Starting Cargo"
    println "Using war from: $warLocation"              // warLocation is a variable defined in gradle.properties file

    cargo {
        containerId = 'tomcat7x'
        port = TomcatPortLocalhost as Integer
        local {
            homeDir = file(local_Tomcat_webapps_dir)    // local_Tomcat_webapps_dir is a variable defined in gradle.properties file
        }

        deployable {
            file = file(warLocation)            // This is where I specify where the war file is to be copied from. In the 'local' section, I have specified 'homeDir' as the location where I want this file to be copied to. Is that correct usage?
            context = 'web-application'
        }
    }
    tomcatRunWar
}

task deployToQA{
    dependsOn war, tomcatStop, deleteDirQA
    println "Starting Cargo"
    println "Using war from: $warLocation"

    cargo {
        containerId = 'tomcat7x'
        port = TomcatPortQA as Integer
        remote {
            hostname = server_address_qa        // all these are variables defined in the gradle.properties file
            username = username_qa
            password = password_qa
        }

        deployable {
            file = file(warLocation)           // This is where I specify the location of the war file. How do I specify in the 'remote' section in which directory in the server this file should be copied to?
            context = 'web-application'
        }
    }
    tomcatRunWar
}

task deployToDev{
    dependsOn war, tomcatStop, deleteDirDev
    println "Starting Cargo"
    println "Using war from: $warLocation"

    cargo {
        containerId = 'tomcat7x'
        port = TomcatPortDev as Integer
        remote {
            hostname = RT3_webapp_address_dev
            username = username_dev
            password = password_dev
        }

        deployable {
            file = file(warLocation)
            context = 'web-application'
        }
    }
    tomcatRunWar
}

Я хочу вызвать задачу gradle deployToLocal и ожидать поведения, при котором локальный экземпляр Tomcat останавливается, война копируется в мою папку Tomcat\webapps (при этом все ранее существовавшие файлы или папки в той же папке были удалены), а затем служба Tomcat снова началось, и война развернута.

Это не работает, и, очевидно, я что-то упускаю. Я также искал в Интернете надежный полностью проработанный пример реализации плагина Gradle Cargo/Tomcat без особой удачи. Может ли кто-нибудь указать мне правильное направление?

Спасибо заранее за любую помощь!


person Deb Dey    schedule 11.02.2014    source источник


Ответы (1)


Плагины Tomcat и Cargo — это два разных плагина, которые не работают друг с другом так, как вы пытались решить свою проблему. Плагин Tomcat предоставляет только встроенный контейнер в памяти для Tomcat (это означает, что вам не нужно иметь локальную установку), тогда как Cargo требует, чтобы вы либо указывали на локальную установку контейнера, либо на удаленный URL-адрес. Для ваших целей я бы выбрал исключительно плагин Cargo.

Весь код, который вы определяете в своих задачах, выполняется на этапе настройки. Использование DSL плагина Cargo в нескольких задачах отменит предыдущее объявление. Чтобы лучше понять этапы выполнения и настройки, я бы рекомендовал ознакомиться с онлайн-руководством пользователя Gradle. Имейте в виду, что Cargo вообще не предоставляет функции управления удаленными контейнерами (запуск/остановка). Это также упоминалось в файле README плагина. . Если вы хотите сделать что-то подобное, вам придется написать задачи, которые запускают удаленные команды SSH.

Помимо невозможности запуска/остановки контейнеров с помощью плагина, ваша реальная проблема может быть решена несколькими способами. Либо вы используете DSL плагина Cargo и динамически назначаете удаленное имя хоста, порт, имя пользователя, пароль, либо создаете несколько задач. Похоже, вы все еще хотите создать несколько задач для каждой среды. Для этого примените плагин cargo-base и создайте две задачи типа CargoDeployRemote, одну для вашего разработчика и одну для вашей среды контроля качества. В этом случае вы не используете DSL, предоставляемый плагином. Конечно, вы должны создать еще одну задачу для локальной установки Tomcat с соответствующим типом задачи.

apply plugin: 'cargo-base'

import com.bmuschko.gradle.cargo.convention.Deployable
import com.bmuschko.gradle.cargo.tasks.remote.CargoDeployRemote

task deployToQA(type: CargoDeployRemote) {
    containerId = 'tomcat7x'
    hostname = server_address_qa
    port = TomcatPortQA as Integer
    username = username_qa
    password = password_qa
    deployables = [new Deployable(file: file(warLocation), context: 'web-application')]
}
person Benjamin Muschko    schedule 15.02.2014
comment
Большое спасибо, Бен! Это отвечает на многие мои вопросы. Небольшой дополнительный вопрос: Cargo требует, чтобы вы либо указывали на локальную установку контейнера, либо на удаленный URL-адрес, поэтому, когда я развертываю файл войны с учетом информации о контейнере, Cargo автоматически помещает войну в папку webapps внутри каталога установки Tomcat. ? Мне не нужно специально указывать место, где я хочу разместить файл, верно? Наконец, если я хочу, чтобы военный файл был помещен в другое место, кроме папки Tomcat/webapps, будет ли способ сделать это, скопировав его в нужное место? - person Deb Dey; 18.02.2014
comment
Cargo использует менеджер Tomcat для развертывания файла WAR. Я считаю, что вы можете использовать свойство cargo.tomcat.webappsDirectory для определения другого каталога webapps. Пожалуйста, ознакомьтесь с документацией Cargo для получения дополнительной информации. - person Benjamin Muschko; 19.02.2014
comment
Я только что увидел, что Cargo теперь предоставляет функции управления жизненным циклом контейнера. Cargo называет это демоном Cargo. Я планирую предоставить задания и для него в ближайшем будущем. - person Benjamin Muschko; 21.02.2014