Tomcat развертывает старую версию веб-приложения - PullRequest
0 голосов
/ 18 января 2019

Это может быть дубликатом, потому что я не могу представить, что мы первые столкнулись с этим, но я не могу найти его.

Итак, мы развертываем файлы WAR на сервере tomcat 8.5 с помощью gitlab ci, используя maven. Проблема в том, что tomcat испортил версии, когда мы перешли с 0.2.9 на 0.2.10. По-видимому, сервер развертывает WAR-файлы в алфавитном порядке, а значение 0,2.10 лежит в пределах от 0,2,1 до 0,2,2, а работающая версия по-прежнему равна 0,2,9, даже если версия 0,2.10 была правильно развернута на сервере.

Полное имя веб-приложения выглядит следующим образом: WebappName ## 0.2.10-SNAPSHOT_201901010000.war

Мы подумали о переименовании наших версий в 0.2.009 и 0.2.010, но это выглядит как довольно грязный обходной путь. Конечно, старые версии будут время от времени удаляться, так что это не постоянная проблема, а просто несколько раздражает, и любые советы о том, как решить эту проблему, будут великолепны.

Из pom.xml

<version>0.2.10-SNAPSHOT</version>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.install.skip>true</maven.install.skip>
    <timestamp>${maven.build.timestamp}</timestamp>
    <maven.build.timestamp.format>yyyyMMddHHmm</maven.build.timestamp.format>
</properties>
[..]
<profile>
    <id>deploy-stage</id>
    <activation>
        <activeByDefault>false</activeByDefault>
    </activation>
    <properties>
        <war.name>WebappName##${project.version}_${timestamp}</war.name>
        <tomcat.url>http://[..]/manager/text</tomcat.url>
        <tomcat.server>[..]</tomcat.server>
        <tomcat.webpath>/${war.name}</tomcat.webpath>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <executions>
                    <execution>
                        <id>default-war</id>
                        <goals>
                            <goal>manifest</goal>
                            <goal>war</goal>
                        </goals>
                        <phase>package</phase>
                    </execution>
                </executions>
                <configuration>
                        <warName>${war.name}</warName>
                    <failOnMissingWebXml>true</failOnMissingWebXml>
                    <archive>
                        <addMavenDescriptor>true</addMavenDescriptor>
                        <forced>true</forced>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <packageName>true</packageName>
                            <useUniqueVersions>true</useUniqueVersions>
                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                        </manifest>
                        <manifestEntries>
                            <Build-Time>${maven.build.timestamp}</Build-Time>
                            <Archetype>${archetypeArtifactId}</Archetype>
                            <Archetype-Version>${archetypeVersion}</Archetype-Version>
                        </manifestEntries>
                    </archive>
                    <webResources>
                        <resource>
                            <filtering>true</filtering>
                            <directory>src/main/webapp</directory>
                            <includes>
                                <include>**/web.xml</include>
                            </includes>
                        </resource>
                    </webResources>
                    <warSourceDirectory>src/main/webapp</warSourceDirectory>
                    <webXml>src/main/webapp/WEB-INF/web.xml</webXml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <warFile>${project.build.directory}/${war.name}.war</warFile>
                    <url>${tomcat.url}</url>
                    <server>${tomcat.server}</server>
                    <path>${tomcat.webpath}</path>
                </configuration>
                <executions>
                    <execution>
                        <phase>deploy</phase>
                        <goals>
                            <goal>deploy</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</profile>

Из gitlab-ci.yml

variables:
  MAVEN_OPTS: "-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"
  MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true"

# Cache downloaded dependencies and plugins between builds.
cache:
  paths:
    - /root/.m2/repository/

stages:
  - build
  - deploy

# Run deploy 
deploy:staging:
  stage: deploy
  script:
    - 'mvn $MAVEN_CLI_OPTS -Dsonar.branch=$CI_BUILD_REF_NAME deploy -am -P deploy-stage'
  only:
    - staging
  image: maven:3.3.9-jdk-8

1 Ответ

0 голосов
/ 22 января 2019

Как указано в документации Apache Tomcat :

Сравнение строк используется для определения порядка версий.

Это просто не то же самое, что сравнение версий артефактов Maven. Версия 2.0.2 всегда больше при сравнении строк, чем 2.0.10 или даже 2.0.15000 и т. Д.

Полагаю, у вас есть что-то подобное в вашем pom.xml:

<properties>
  <buildTimestamp>${maven.build.timestamp}</buildTimestamp>
  <maven.build.timestamp.format>yyyyMMddHHmm</maven.build.timestamp.format>
</properties>
<build>
  <finalName>${project.artifactId}##${project.version}_${maven.build.timestamp}</finalName>
</build>

Вы можете изменить это на:

<finalName>${project.artifactId}##${maven.build.timestamp}_${project.version}</finalName>

, что дает имя файла, например WebappName##201901010000_0.2.10-SNAPSHOT.war.

Таким образом, самая последняя сборка по метке времени будет развернута как текущая активная версия приложения.

В качестве альтернативы вы можете сохранить схему версий имени файла .war и вместо этого развернуть свое приложение, используя версионное имя файла для вашего context.xml:

apache-tomcat/conf/Catalina/localhost/WebappName##201901010000.xml с содержанием:

<Context docBase="/path/to/WebappName##0.2.10-SNAPSHOT_201901010000.war" path="/WebappName"/>

В Apache Tomcat Manager это будет отображаться как версия 201901010000 в столбце версии приложения. Снова самая последняя сборка по метке времени будет развернута как текущая активная версия приложения, независимая от версии артефакта Maven, поскольку версия развертывания String берется из имени файла .xml вместо имени файла .war.

...