2014-02-11 8 views
7

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

Конечно, это означает, что я хочу остановить службу Tomcat, удалить существующие военные файлы и расширенные войны в каталоге Tomcat Webapps, скопировать войну и снова запустить 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 без большой удачи. Может ли кто-нибудь указать мне в правильном направлении?

Заранее благодарю за помощь!

ответ

12

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

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

Помимо того, что вы не можете запускать/останавливать контейнеры с плагином, ваша фактическая проблема может быть решена несколькими способами. Либо вы используете DSL Cargo и назначаете удаленное имя хоста, порт, имя пользователя, пароль динамически или создаете несколько задач. Похоже, вы все еще хотите создать несколько задач для каждой среды. Для этого примените плагин cargo-base и создайте две задачи типа CargoDeployRemote, один для вашего разработчика и один для вашей среды QA. В этом случае вы не используете 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')] 
} 
+0

спасибо, Ben! Это отвечает на многие мои вопросы. Быстрый вопрос о последующих действиях: «Cargo требует, чтобы вы либо указали на локальную установку контейнера, либо удаленный URL» - поэтому, когда я разворачиваю военный файл с учетом информации о контейнере, Cargo автоматически помещает войну в папку webapps внутри каталог установки Tomcat? Мне не нужно указывать конкретное место, где я хочу, чтобы файл был помещен, не так ли? Наконец, если я хочу, чтобы файл войны был помещен где-то, кроме папки Tomcat/webapps, был ли способ сделать это, чтобы скопировать его в нужное место? –

+0

Cargo использует диспетчер Tomcat (http://tomcat.apache.org/tomcat-7.0-doc/manager-howto.html) для развертывания WAR-файла. Я считаю, что вы можете использовать свойство 'cargo.tomcat.webappsDirectory' для определения другого каталога' webapps'. Для получения дополнительной информации ознакомьтесь с документацией Cargo. –

+0

Я только что увидел, что Cargo теперь предоставляет функциональные возможности управления жизненным циклом контейнера. Cargo называет это [Cargo daemon] (http://cargo.codehaus.org/Cargo+Daemon). Мой план состоит в том, чтобы в ближайшем будущем обеспечить его задачи. –

Смежные вопросы