如何使用詹金斯管道将战争部署到tomcat?

Posted

技术标签:

【中文标题】如何使用詹金斯管道将战争部署到tomcat?【英文标题】:How to deploy war to tomcat using jenkins pipeline? 【发布时间】:2019-06-14 18:18:44 【问题描述】:

我想使用管道部署战争文件。 什么是正确的做法。有没有办法在管道代码中使用部署到容器。 使用 jenkins manager 调用 catalina.sh 或使用 curl 命令进行部署的问题是我找不到任何检测成功部署的方法。

有没有标准的方法来做到这一点

【问题讨论】:

您在 jenkins 中使用的是脚本化管道还是声明性管道?这也是您的主要问题:如何在 tomcat 中检测成功部署? 太宽泛了,你必须分享一些代码或至少一些更多细节。 @JRichardsz 使用 groovy 语法 我的回答对你有帮助吗? 【参考方案1】:

我认为最好的方法应该是部署插件https://www.jdev.it/deploying-your-war-file-from-jenkins-to-tomcat

【讨论】:

可以在管道groovy脚本中使用吗?【参考方案2】:

在tomcat中,用jenkins和tomcat配置:

在您的服务器上安装并下载 jenkins 并启动服务器,然后使用“New Item”创建项目并选择 pom.xml 并创建 maven 项目。 现在转到您的项目并单击配置并选择“限制此项目可以运行的位置”并在您的关卡表达式中添加母版。 在 git 上选择“源代码管理”,然后配置您的 git 存储库和凭据以及分支名称。 选择“构建”添加根 pom:pom.xml 和目标和选项:干净安装 -DskipTests 选择“Post-build Actions”并选择“Deploy war/ear to a container” WAR/EAR 文件:target/test.war 上下文路径:测试 容器选择 tomcat 并添加凭据 Tomcat URL:示例:http://localhost:8080/

更新 'apache-tomcat-8.5.5\webapps\manager\META-INF\context.xlm 文件。取消注释值标签。并重启服务器

context.xml 文件

Before : 

<Context antiResourceLocking="false" privileged="true">
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
     allow="192\.168\.0\.9|127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
</Context>

After change :

<Context antiResourceLocking="false" privileged="true" >
</Context>

for auto deployment: go to 'apache-tomcat-8.5.5\conf\context.xml' and add antiResourceLocking="true" in 'Context' tag

【讨论】:

【参考方案3】:

在tomcat中,部署war有两种选择:

将战争复制到 webapps 文件夹 将战争上传到 /manager/text/deploy 由您的 tomcat 发布的 http 端点

这里有一些部署战争和获取部署状态的方法(成功|失败)

您可以将以下 sn-ps 之一放在管道的部署阶段或迁移到 groovy。

/manager/text/deploy

这是一个端点,它允许我们将战争从远程主机上传到 tomcat 服务器并作为响应:

http status 200 表示成功或失败不分先后 Http Body 喜欢:

OK - Deployed application at context path /foo

FAIL - Deployed application 
at context path /my_app 
but context failed to start 

所以,为了检测是否一切正常,我执行了这个验证:

CURL_RESPONSE=$(curl -v -u $TOMCAT_USER:$TOMCAT_PASSWORD -T $WAR_PATH "http://$TOMCAT_HOST:$TOMCAT_PORT/manager/text/deploy?path=/$CONTEX_NAME&update=true")    

if [[ $CURL_RESPONSE == *"FAIL"* ]]; then
  echo "war deployment failed"
  exit 1
else    
  echo "war deployed successfully "
  exit 0
fi

您可以在此处找到启用此端点所需的配置:

https://***.com/a/37622865/3957754

将war文件复制到webapps

将war文件复制到webapps后,您可以列出已部署的应用,并在http body响应中找到您的应用名称:

OK - Listed applications for virtual host localhost
/manager:running:0:manager
/:running:0:ROOT
/docs:running:0:docs
/examples:running:0:examples
/host-manager:running:0:host-manager
/my_app:running:0:my_app
/my_other_app:running:0:my_other_app

您可以使用带中断的循环作为最大尝试次数。

您可以在此处找到启用此端点所需的配置:

https://***.com/a/40722537/3957754

/health 或 /status

这样更干净,据我所知,有几个监控平台使用这种策略。

所有内容都包括在您的应用程序中公开一个额外的 http 端点(Web 应用程序、api rest、守护程序等)

此端点必须返回以下响应之一:

http 状态

(200) : 表明你的应用程序一切正常 (!200):表明你的应用有问题。如果您的应用未正确部署,此端点将返回 404。

xml 或 json


 "status":"200",
 "database_connectivity":"200",
 "read_write_disk":"200",
 "etc":"etc"

最后,您可以使用循环从您的 Jenkins 管道中使用此 /health 端点。此策略将允许您从外部平台监控您的应用,例如:

https://www.site24x7.com/ Pingdom 新遗物 等

【讨论】:

以上是关于如何使用詹金斯管道将战争部署到tomcat?的主要内容,如果未能解决你的问题,请参考以下文章

如何自动将战争从 Nexus 部署到 Tomcat?

Jenkins管道将Node + Gulp项目中产生的战争发布给Artifactory

如何从Jenkins Blue Ocean部署到弹性豆茎?

使用 Jenkins 将战争文件部署到 Tomcat 的推荐方法?

如何在詹金斯中获取管道作业的 URL

重命名使用 AWS cli 生成的用于 beanstalk 部署的战争