优化持续部署(取消THROU链的责任)

问题描述 投票:9回答:3

我还想改善持续交付。我使用一个Tomcat 8和Maven。

我用mvn tomcat:redeploy部署web应用程序。

tomcat documentation我发现这个部分:

部署新的应用程序归档(WAR)远程

如果安装和启动成功后,您会收到(...)

否则,响应将开始与失败,包括错误消息。

作为FAIL可能的原因有一点是兴趣:

例外遇到试图启动新的Web应用程序。

所以,我还想在启动时抛出一个异常,所以在web.xml我写的:

<负载上启动> 1 </负载上启动>

org.springframework.web.servlet.DispatcherServlet小服务程序。然后,我写一个Singleton:

@Service
public class AvoidStartupOnMissingDatabase implements SmartInitializingSingleton {

    @Override
    public void afterSingletonsInstantiated() {
        throw new RuntimeException("Do not deploy this app!");
    }
}

这将导致该堆栈跟踪:

java.lang.RuntimeException: Do not deploy this app!
        at xxx.AvoidStartupOnMissingDatabase.afterSingletonsInstantiated(AvoidStartupOnMissingDatabase.java:11)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:775)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:762)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
        at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:664)
        at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:630)
        at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:678)
        at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:549)
        at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:490)
        at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
        at javax.servlet.GenericServlet.init(GenericServlet.java:158)
        at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1144)
        at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1091)
        at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:983)
        at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4962)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5274)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3823)
        at org.apache.catalina.startup.HostConfig.reload(HostConfig.java:1410)
        at org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:1320)
        at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1648)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
        at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
        at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1525)
        at org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:773)
        at org.apache.catalina.manager.ManagerServlet.doPut(ManagerServlet.java:443)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:664)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:613)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
        at org.apache.coyote.ajp.AjpProcessor.service(AjpProcessor.java:486)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)

问题

应用程序部署的不幸!

Screenshot of ci

我不初始化。我说时加载的启动。 Tomcat的说,如果没有启动失败。 Tomcat的说,(重新)部署,如果能启动。

所以异常必须失败的部署。对?

编辑

我测试的tomcat-30年5月8日和Tomcat的8.5.37,遗憾的是都成功。

java maven tomcat continuous-deployment continuous-delivery
3个回答
4
投票

四,创造了一个bug in Tomcat。开发人员引导我到类似亚历Cojocaru解决方案。

我从Servlet转移到SerlvetContextListener,我成功地接收到“失败”的部署。

这种无效的部署后,旧的应用程序是不幸的是没有重新启动。但承诺SVN成功取消,并不会添加到SVN改变日志!


0
投票

Tomcat有两种选择来部署war文件:

  • 副本战的webapps
  • HTTP tomcat的端点/经理/文本/部署

更多细节和配置在该answer

此外,tomcat的:重新部署不回滚的目的,只是为了部署,而无需再次必要性或包装现有的战争。

我敢肯定的是,mvn tomcat:deploy插件使用/经理/文本/ tomcat的部署端点部署war文件。

假设你使用的是一些持续集成服务器(詹金斯,特拉维斯等),或者只是一个简单的shell脚本来调用前面的步骤,我建议你这些方法执行回滚:

Rollback parameter

在你的流量,称为添加一个新的输入参数:rollback_tag或previous_version。

Rollback with Maven

Maven是用于编译的最佳选择,产生战争或jar文件。但对于部署的目的,我觉得这是不是最好的选择。我不希望共享凭据或配置在我的pom.xml(带或不带变量):

<plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>tomcat-maven-plugin</artifactId>
   <version>1.1</version>
   <configuration>
      <url>http://localhost:8080/manager/text</url>
      <server>TomcatServer</server>
      <path>/javaCodeGeeks</path>
   </configuration>
</plugin>

无论如何,如果你想使用Maven,您需要:

  • 搜索Maven插件的源代码
  • 扩展或添加新的功能,如: 从Tomcat部署捕获错误 使用一些标签版本下载源代码 重新部署在错误的情况下

Rollback downloading again

步骤可以是:

  • (1)用svn下载源
  • (2)执行MVN清洁包
  • (3)执行的Tomcat MVN:部署 此命令必须返回一个退出代码 (3.1)在exit_code == 0的情况下,就表明您的部署成功。 (3.2)在exit_code的情况下!= 0,将指示在部署了错误。与步骤(4)继续
  • (4)下载使用SVN源,但在这种情况下,你必须使用rollback tag参数,并重复步骤(2)和(3)

With some artifact repository

有了这个工具,我们需要使用SVN,只是一个时间来下载源代码。编译和部署成功后,你必须上传与特定的版本就像你流1.0.0下一步的战争或jar文件只需要下载战争/ jar文件。

在1.0.1部署错误的情况下,你只需要从您的神器库下载以前的稳定版本1.0.0。步骤可以是:

  • (1)检测的SVN提交开发商的动作和编译,测试和上传war文件到您的使用持续集成服务器或shell脚本神器库。
  • (2)从神器库下载战争文件
  • (3)执行一个curl命令来上传和部署war文件。更多细节和配置的位置: How to deploy war to tomcat using jenkins pipeline? Tomcat manager remote deploy
  • (4)在错误的情况下,从神器库下载战争文件,但在这种情况下,你必须使用previous_version参数并重复步骤(3)

0
投票

部署是成功的。您看到的堆栈跟踪是通过应用程序运行时错误,当春天试图加载AvoidStartupOnMissingDatabase豆引起的。在这一点上,应用程序已经部署和运行。

如果你想Maven的redeploy目标失败,你需要在部署过程中造成的错误,而不是在应用程序运行。您可以通过使用Maven的Tomcat插件配置的wrong URL,例如做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.