我正在使用tomcat管理器编写一个shell脚本来自动部署/取消部署。
按照http://tomcat.apache.org/tomcat-6.0-doc/manager-howto.html#Deploy_A_New_Application_Remotely上的说明,我使用curl进行部署
curl --anyauth -u username:pwd -d path=/something -d war=file:target/someWar.war https://someurl.com/manager/deploy
我得到的答复是此网址不支持HTTP方法POST。
所以我改变我的卷曲是使用-G
curl --anyauth -u username:pwd -G -d path=/something -d war=file:target/someWar.war https://someurl.com/manager/deploy
我得到了FAIL的响应 - 无法在上下文路径/某事物上部署应用程序,它似乎在服务器本地而不是我的机器上查找文件。有些插件可以进行远程部署而无需将文件翻过来,所以我想知道我错过了什么。
我目前没有想法(我在tomcat管理器配置页面上没有看到任何其他选项)。
答案 0 :(得分:47)
提供此问题的更新。
Tomcat 7 已经改变了它的经理API。
请参阅: Manager commands
遵循新的网址格式:
http://{host}:{port}/manager/text/{command}?{parameters}
示例强>
curl -T "myapp.war" "http://manager:manager@localhost:8080/manager/text/deploy?path=/myapp&update=true"
安全强>
请记住,服务器必须能够接受您的远程IP。这是一个示例配置:
<Context privileged="true" antiResourceLocking="false"
docBase="${catalina.home}/webapps/manager">
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.0\.0\.1" />
</Context>
这是一个可选设置,不是必需的,但必须具有跨域角色和正确的经理凭据。
Tomcat 8 - 相同的规则适用于Tomcat 7.相同的命令。
以下是完整的文档:
答案 1 :(得分:40)
这种方式对我来说在Tomcat 6上工作(请参阅jecatpers回答tomcat 7):
curl --upload-file <path to warfile> "http://<tomcat username>:<tomcat password>@<hostname>:<port>/manager/deploy?path=/<context>&update=true"
示例:
curl --upload-file target\debug.war "http://tomcat:tomcat@localhost:8088/manager/deploy?path=/debug&update=true"
非常轻松。输出是这样的:
OK - Undeployed application at context path /debug
OK - Deployed application at context path /debug
答案 2 :(得分:3)
对于那些使用Jenkins并希望在Windows机器上使用GitBash而不是Jenkins部署插件的shell脚本进行部署的人
ExecutorService executorService = Executors.newFixedThreadPool(3);
for (int i = 0; i < listOfTasks.size(); i++) {
while(true){
if (xResourceSphore.tryAcquire()) {
xThread.setTask(listOfTasks.get(i));
xThread.setSemaphore(xResourceSphore);
executorService.execute(xThread );
break;
}else if (yResourceSphore.tryAcquire()) {
yThread.setTask(listOfTasks.get(i));
yThread.setSemaphore(yResourceSphore);
executorService.execute(yThread );
break;
}else if (zResourceSphore.tryAcquire()) {
zThread.setTask(listOfTasks.get(i));
zThread.setSemaphore(zResourceSphore);
executorService.execute(zThread );
break;
}
}
}
executorService.shutdown();
注意:
答案 3 :(得分:1)
部署应用程序的最简单方法是编写Ant脚本。除了Ant之外,唯一需要的是catalina-ant.jar
才能出现在类路径中。
查看本手册的这一章: http://tomcat.apache.org/tomcat-6.0-doc/manager-howto.html#Executing_Manager_Commands_With_Ant
该脚本做了类似的事情:使用HTTP将.war部署到管理器应用程序。如果您仍想使用curl,您甚至可能希望捕获数据包以查看确切的标头。我不建议使用curl,因为我认为Ant解决方案更易于移植且容易出错(例如,如果它们会改变低级部署API,那么会怎样?)。
答案 4 :(得分:1)
改进Jet答案,这对我来说是tomcat 8,java 64位。
这就是我执行的内容:
curl -v -u some_user:some_password -T /../my_app.war 'http://127.0.0.1:tomcat_port/manager/text/deploy?path=/my_app&update=true'
如果我们在:
中配置tomcat用户,这将有效/.../.../apache-tomcat-8.5.0_001/conf/tomcat-users.xml
使用:
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<user username="some_user" password="some_password" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script"/>
重新启动tomcat,它将准备好从远程客户端部署战争,如curl,jenkins,travis等等。
答案 5 :(得分:0)
我遇到错误
curl: Can't open webapp.war
当我只提到
curl -T 'webapp.war'
但是当我使用构建工件的完整路径时,它就起作用了
curl -T ./target/webapp.war