使用Gradle Cargo插件部署到多个环境

时间:2014-02-11 23:43:55

标签: tomcat deployment gradle cargo build.gradle

我正在尝试在build.gradle文件中安装多个Gradle任务,以便将战争部署到不同的环境中。在生成war文件后,我希望能够在deployToLocaldeployToQA之后执行deployToDev任务。

当然,这意味着我想停止Tomcat服务,删除Tomcat webapps目录中的现有war文件和扩展的war,复制war,然后再次重启Tomcat以部署服务。

我的问题有两个:

  1. 我已经指定了我要复制的战争的位置 以及所有主机名,端口和用户名/密码 信息。我的问题是:如何指定中的哪个位置 远程环境(目录结构)应该复制战争 成?
  2. 最终我想要实现,这是向前发展的正确方法吗?
  3. 到目前为止我的代码:

    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实例停止的行为,将war复制到我的Tomcat \ webapps文件夹(同一文件夹中的所有先前存在的文件或文件夹已被删除) ,然后再次启动Tomcat服务并部署战争。

    这不起作用,显然我错过了一些东西。我还在网上搜索了一个完整的完整实例的gradle cargo / tomcat插件的实现,没有太多运气。有人可以指点我正确的方向吗?

    提前感谢您的帮助!

1 个答案:

答案 0 :(得分:12)

Tomcat和Cargo插件是两个截然不同的插件,并且在您尝试解决问题的方式上无法相互协作。 Tomcat插件仅为Tomcat提供内存中嵌入式容器(意味着您不必进行本地安装),而Cargo要求您指向本地容器安装或远程URL。为了您的目的,我将完全使用Cargo插件。

您在任务中定义的所有代码都在配置阶段执行。在多个任务中使用Cargo插件的DSL将覆盖先前的声明。为了更好地理解执行与配置阶段,我建议您查看Gradle在线用户指南。请记住,Cargo一般不提供远程容器的管理功能(启动/停止)。插件的README file中也提到了这一点。如果你想做类似的事情,你必须编写运行远程SSH命令的任务。

除了无法使用插件启动/停止容器外,您的实际问题可以通过多种方式解决。您可以使用Cargo插件DSL并动态分配远程主机名,端口,用户名,密码,也可以创建多个任务。您似乎仍希望为每个环境创建多个任务。为此,应用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')]
}