仅使用 Jenkins 部署 Tomcat WAR:
以下是用于部署的 scinario:
- 3 环境生产、预生产和认证 2
- 战争文件,如应用程序 1 和应用程序 2
- 每个环境有 2 个 Tomcat 服务器,如 Server1 和 Server2(第 1 点)
战争档案:
开发人员提供像app1##20171122.war- 和app2##20171122.war这样的战争文件
- App1 和 App2 设置文件不是战争的一部分。
- 每个环境的设置文件都不同(生产、预生产和鉴定) 部署 app1
- 和 app2 后,我们将设置文件放在 webapps/app1##20171122/config/Application.settings 和 webapps/app2##20171122/config/Application.settings
最后 app1 和 app2 开始使用雄猫管理器
以下是我想用 Jenkins 做的事情:
使用 Mavin 部署或任何其他工具:
注意:这里的战争文件大小超过450MB
詹金项目应用1:
- 我们将把 app1##20171122.war 文件放在 Jenkins 服务器上
- 我们应该能够自动选择要部署的战争文件以及战争版本
- 我们应该能够在多个服务器(服务器 1 和服务器 2)上部署战争文件
- 在 webapps/app1##20171122/config/Application.settings 下部署 app1 的设置文件
- 启动应用1
注意:应用程序尚未准备好从 Web 应用程序外部读取配置
简而言之:(Jenkins Server:
App1 war 文件及其设置文件)==(部署在远程 VM 上)==>(Tomcat 服务器)
(Jenkins 服务器:自动选择 App1 战争) ==(部署在远程 VM 上)==>(Tomcat 服务器)
(詹金斯服务器:App1 设置文件) ==(在远程虚拟机上部署设置)==>(Tomcat 服务器)
(Jenkins Server:Start App1 命令) ==(Send Command to remote VM)==>(Tomcat server)
我创建了以下东西来解决这个问题:
专家:
- 安装了 Maven 并创建了以下 pom.xml
- 创建了一个小的shell脚本来解压缩war,放置与特定环境相关的设置文件,然后再次创建war文件
詹金斯:
- 将 Jenkins文件系统列表参数插件与"此项目已参数化"选项一起使用。
- 从构建选项中使用了"调用顶级 Maven 目标",并使用以下 maven 命令
-
请在配置文件系统参数时使用以下"WAR-NAME"
deploy -Papp1 -Papp2 -DwarFile=${WAR-NAME}
绒球.xml:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.app1.app</groupId>
<artifactId>app1</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>my-webapp Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<warFile>none</warFile>
</properties>
<profiles>
<profile>
<id>app1</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.7</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>regex-property</id>
<goals>
<goal>regex-property</goal>
</goals>
<configuration>
<name>warFilename</name>
<value>${warFile}</value>
<regex>.war$</regex>
<replacement></replacement>
<failIfNoMatch>false</failIfNoMatch>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<id> unzip, put setting file and zip again </id>
<phase>deploy</phase>
<goals>
<goal>exec</goal>
</goals>
</execution>
</executions>
<configuration>
<commandlineArgs>${warFile}</commandlineArgs>
<executable>${basedir}/make_war.sh</executable>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<id>deploy-app1-1</id>
<goals>
<goal>deploy-only</goal>
</goals>
<phase>deploy</phase>
<configuration>
<username>admin</username>
<password>adminpass</password>
<warFile>${basedir}/deploy/${warFile}</warFile>
<url>http://localhost:9090/manager/text</url>
<server>Tomcat</server>
<path>/app1</path>
<update>true</update>
<ignorePackaging>true</ignorePackaging>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>app2</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.7</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<id>deploy-app1-2</id>
<goals>
<goal>deploy-only</goal>
</goals>
<phase>deploy</phase>
<configuration>
<username>admin</username>
<password>adminpass</password>
<warFile>${basedir}/deploy/${warFile}</warFile>
<url>http://localhost:8080/manager/text</url>
<server>Tomcat</server>
<path>/app1</path>
<update>true</update>
<ignorePackaging>true</ignorePackaging>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
make_war.sh
#!/usr/bin/sh
if [ $# -lt 1 ]; then
echo 1>&2 "$0: not enough arguments. Please pass the WAR file name !!!"
exit 2
elif [ $# -gt 1 ]; then
echo 1>&2 "$0: too many arguments. Please only pass the WAR file name !!!"
exit 2
fi
war_file_name=$1
file_name=$(basename "$war_file_name")
extension="${war_file_name##*.}"
file_name="${file_name%.*}"
if [ $extension != "war" ]; then
echo 1>&2 "$0: Invalid arguments. Please pass valid WAR file with version name !!!"
exit 2
fi
echo "Cleaning up the deploy folder ..."
/usr/bin/rm -rf ./deploy/*
/usr/bin/unzip $war_file_name -d ./deploy/$file_name
/usr/bin/cp -f Application.settings ./deploy/$file_name/config/Application.settings
/usr/local/java/latest/bin/jar -cvf ./deploy/$war_file_name -C ./deploy/$file_name .
您是否在询问如何让 Jenkins 将您的应用程序及其配置部署到您的 Tomcat 实例?
我认为使用 Mavendeploy
插件可能是物理部署文件的最佳选择。
当我需要将应用程序的多个副本/版本部署到多个Tomcat服务器时,我所做的是创建一个新的目录wars
来包含.war文件,并使用Tomcat 用于配置各个应用程序实例的上下文容器。喜欢这个:
$CATALINA_HOME/conf/Catalina/localhost/app1.xml
$CATALINA_HOME/conf/Catalina/localhost/app2.xml
$CATALINA_HOME/wars/app1-1.0.0.war
$CATALINA_HOME/wars/app1-1.0.1.war
$CATALINA_HOME/wars/app2-1.0.1.war
当您将 .war 文件部署到../webapps
时,Tomcat 会将每个 .war 视为一个单独的应用程序。我认为您可以为这些应用程序提供其他配置,但我不记得如何。
但是,如果使用上下文容器文件,则多个应用程序实例可以使用同一个 .war 文件。您可以保留 .war 文件的多个修订版,以防您需要回滚到早期版本,或者想要继续运行旧版本。
以下是您可以执行的操作:
- 在 jenkins 中通过 ssh 配置"目标"服务器。
- 以参数作为输入;什么目标,什么.war,什么.settings文件等
- 通过 jenkins 将 .war 和 .settings 文件复制到 SCP/SSH 上的目标服务器,以及执行以下操作的脚本。
- 爆炸 .war (解压缩)
- 在爆炸战争中复制所需的 .settings 文件
- 启动雄猫
我使用 Jenkins 作为构建作业构建了 .war,下游作业用于在基于 tomcat 的环境中进行部署,该环境的详细信息作为构建参数被选取。
开发人员提供像app1##20171122.war和app2##20171122.war这样的战争文件
你还没有提到开发人员如何"给你"这些战争文件。如果它们是"建造"的,我建议创建一个工作来使用蚂蚁/maven等来建造这些战争,以便已经知道这些战争所在的位置。 如果要提供它们,您可以将它们上传到任何集中位置(FTP 服务器)或通过某些工件工厂(如 JFrog/Nexu )并直接在 tomcat 服务器上下载。