Tomcat管理器远程部署脚本

时间:2010-12-13 19:29:20

标签: tomcat curl

我正在使用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管理器配置页面上没有看到任何其他选项)。

6 个答案:

答案 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.相同的命令。

以下是完整的文档:

http://tomcat.apache.org/tomcat-8.0-doc/manager-howto.html

答案 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();

注意:

  1. curl -v选项是详细的(可选)
  2. //在Windows机器上为GitBash运行上下文路径之前的两个正斜杠(/单正斜杠不会以某种方式)
  3. 同样在远程服务器上部署时,请考虑您的防火墙是啊!

答案 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