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

Deb*_*Dey 7 deployment tomcat cargo gradle build.gradle

我试图在我的build.gradle文件中有多个Gradle任务来将战争部署到不同的环境.我希望能够有一个deployToLocal沿任务deployToQAdeployToDev已经生成一个war文件之后.

当然,这意味着我想停止Tomcat服务,删除Tomcat webapps目录中的现有war文件和扩展的war,复制war,然后重新启动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
}
Run Code Online (Sandbox Code Playgroud)

我想调用任务gradle deployToLocal并期望本地Tomcat实例停止的行为,将war复制到我的Tomcat\webapps文件夹(同一文件夹中的任何以前存在的文件或文件夹已被删除),然后启动Tomcat服务战争再次展开.

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

预先感谢您的任何帮助!

Ben*_*hko 12

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

您在任务中定义的所有代码都在配置阶段执行.在多个任务中使用Cargo插件的DSL将覆盖先前的声明.为了更好地理解执行与配置阶段,我建议您查看Gradle在线用户指南.请记住,Cargo一般不提供远程容器的管理功能(启动/停止).这也在插件的README文件中提到过.如果你想做类似的事情,你必须编写运行远程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')]
}
Run Code Online (Sandbox Code Playgroud)