我正在尝试在build.gradle
文件中安装多个Gradle任务,以便将战争部署到不同的环境中。在生成war文件后,我希望能够在deployToLocal
和deployToQA
之后执行deployToDev
任务。
当然,这意味着我想停止Tomcat服务,删除Tomcat webapps目录中的现有war文件和扩展的war,复制war,然后再次重启Tomcat以部署服务。
我的问题有两个:
到目前为止我的代码:
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插件的实现,没有太多运气。有人可以指点我正确的方向吗?
提前感谢您的帮助!
答案 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')]
}