Оптимизируйте непрерывное развертывание (отмените цепочку ответственности) - PullRequest
0 голосов
/ 03 февраля 2019

Я бы хотел улучшить непрерывную доставку.Я использую Tomcat 8 и maven.

Я использую mvn tomcat:redeploy для развертывания веб-приложения.

В документации tomcat Я нашел эту часть:

Удаленное развертывание нового архива приложений (WAR)

Если установка и запуск выполнены успешно, вы получите (...)

В противном случае ответ начнется с FAIL и будет включатьсообщение об ошибке.

Как возможные причины FAIL одна точка вызывает интерес:

Обнаружено исключение при попытке запуска нового веб-приложения.

Поэтому я хотел бы выдать исключение при запуске, поэтому в web.xml я пишу:

<загрузка при запуске> 1 </ загрузка при запуске>

на org.springframework.web.servlet.DispatcherServlet -Сервлет.Затем я пишу синглтон:

@Service
public class AvoidStartupOnMissingDatabase implements SmartInitializingSingleton {

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

Это вызывает следующее Stacktrace:

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-8.5.30, а также tomcat-8.5.37, оба, к сожалению, успешны.

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Развертывание прошло успешно.Трассировка стека, которую вы видите, была вызвана ошибкой времени выполнения приложения, когда Spring пытался загрузить bean-компонент AvoidStartupOnMissingDatabase.На этом этапе приложение уже развернуто и запущено.

Если вы хотите, чтобы цель Maven redeploy была неудачной, вы должны вызвать ошибку во время развертывания, а не во время работы приложения.Вы можете сделать это, например, используя неправильный URL в конфигурации плагина Maven Tomcat.

0 голосов
/ 10 февраля 2019

Iv создал ошибку в Tomcat .Разработчик привел меня к решению, похожему на Alexandru Cojocaru.

Я перешел из сервлета в SerlvetContextListener и успешно получил «FAIL» для развертывания.

После этого недопустимого развертывания старыйПриложение, к сожалению, не перезапущено.Но фиксация в svn успешно отменена и не добавляется в svn-change-log!

0 голосов
/ 06 февраля 2019

Tomcat имеет два варианта развертывания военных файлов:

  • копирование войны в веб-приложения
  • http конечная точка tomcat / manager / text / deploy

Подробнееподробности и конфигурации в этом ответе

Кроме того, tomcat: redeploy не для целей отката, просто для развертывания существующей войны без необходимости или повторного пакета.

I 'Я уверен, что плагин mvn tomcat:deploy использует конечную точку tomcat / manager / text / deploy для развертывания военных файлов.

Предполагается, что вы используете какой-либо сервер непрерывной интеграции (jenkins, travis и т. д.).) или просто простой сценарий оболочки для вызова предыдущих шагов, я советую вам использовать следующие подходы для выполнения отката:

Параметр отката

Добавьте новый входной параметр в свой поток, который называется: rollback_tag илиПредыдущая версия.

Откат с Maven

Maven - лучший вариант для компиляции и генерации файлов war или 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
    • Загрузите исходный код, используя тег версии
    • Повторное развертывание в случае ошибки

Откат загрузки снова

Шаги могут быть:

  • (1) Скачать исходный кодиспользование svn
  • (2) Выполнить пакет mvn clean
  • (3) Выполнить mvn tomcat: deploy
    • Эта команда должна возвращать код выхода
    • (3.1) В случае exit_code == 0 означает, что ваше развертывание прошло успешно.
    • (3.2) В случае exit_code! = 0 означает ошибку при развертывании.Продолжите с (4) step
  • (4) Загрузите исходный код, используя svn, но в этом случае вы должны использовать параметр rollback tag и повторить шаги (2)и (3)

С некоторым хранилищем артефактов

С помощью этого инструмента нам нужно загрузить исходный код, используя svn, только один раз.После развертывания с компиляцией и успешным выполнением вы должны загрузить файл war или jar с определенной версией, такой как 1.0.0. Следующим шагом в вашем потоке просто необходимо загрузить файл war / jar.

В случае, еслиошибки в развертывании 1.0.1, вам просто нужно загрузить предыдущую стабильную версию 1.0.0 из вашего хранилища артефактов.Шаги могут быть:

  • (1) Определить действие svn commit разработчика и скомпилировать, протестировать и загрузить файл war в хранилище артефактов, используя сервер непрерывной интеграции или вашсценарий оболочки.
  • (2) Загрузите файл war из хранилища артефактов
  • (3) Выполните команду curl, чтобы загрузить и развернуть файл war.Подробнее и конфигурации здесь:
  • (4) В случае ошибки загрузите файл war из хранилища артефактов, но в этом случае вы должны использовать параметр previous_version и повторить шаг (3)
...