【问题标题】:Using Gradle Cargo plugin to deploy to multiple environments使用 Gradle Cargo 插件部署到多个环境
【发布时间】:2014-02-11 23:43:54
【问题描述】:

我试图在我的build.gradle 文件中包含多个 Gradle 任务,以将战争部署到不同的环境。在生成war文件后,我希望能够拥有deployToLocal任务以及deployToQAdeployToDev

当然,这意味着我要停止Tomcat服务,删除Tomcat webapps目录下已有的war文件和展开的wars,复制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
}

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

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

提前感谢您的帮助!

【问题讨论】:

    标签: tomcat deployment gradle cargo build.gradle


    【解决方案1】:

    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')]
    }
    

    【讨论】:

    • 非常感谢本!这回答了我的很多问题。一个快速的后续问题:“Cargo 要求您指向本地容器安装或远程 URL” - 因此,当我根据容器信息部署 war 文件时,Cargo 是否会自动将 war 放在 Tomcat 内的 webapps 文件夹中安装目录?我不需要专门给它一个我想要放置文件的位置,对吧?最后,如果我确实希望将 war 文件放置在 Tomcat/webapps 文件夹以外的某个位置,那么这样做的方法是将其复制到所需的位置吗?
    • Cargo 使用 Tomcat manager 部署 WAR 文件。我相信您可以使用属性cargo.tomcat.webappsDirectory 来定义不同的webapps 目录。请查看货运文档了解更多信息。
    • 我刚刚看到 Cargo 现在提供了容器生命周期管理功能。 Cargo 将此称为Cargo daemon。我的计划是在不久的将来也为它提供任务。
    猜你喜欢
    • 1970-01-01
    • 2015-12-30
    • 2021-12-20
    • 2013-01-24
    • 2015-07-29
    • 2013-01-27
    • 1970-01-01
    • 2015-08-21
    • 2011-11-22
    相关资源
    最近更新 更多