当我调用应用程序URL时,我的WAR文件(成功)部署到Elastic Beanstalk会给我一个404 Not Found。我可以在/ var / lib / tomcat8 / webapps / ROOT /中看到application.war文件,而不是META-INF和WEB-INF,当我手动部署时,它就在那里。
当我从S3中提取WAR文件并手动将其部署到Elastic Beanstalk时,它就像魅力一样。注意:这与我的管道中的CodeBuild生成的WAR文件相同。更好的是,如果我将文件复制(scp)到我的本地计算机并将其上传到Elastic Beanstalk,它也能正常工作。
似乎一切都在部署之前有效,一个工作的WAR文件甚至被部署到Elastic Beanstalk。
通过eb-activity.log
我可以看到它识别WAR文件并将其从临时目录部署到/var/lib/tomcat8/webapps/ROOT
,但它没有解压缩,容器/网络服务器也没有重新启动。
如何使用CodePipeline正确部署WAR文件?
答案 0 :(得分:1)
我试图复制你所面临的问题。我认为在创建“war”文件时,您将包含“META-INF”和“WEB-INF”文件夹的文件夹作为“war”输出文件的根目录。
相反,您应该将所有文件(在上面的文件夹中)放在没有根级文件夹的“war”文件中。
答案 1 :(得分:1)
似乎差不多三年后,AWS Codepipeline仍不是“ WAR文件部署友好的”。正如@Azeq的评论中所指出的那样,标准的Elastic Beanstalk部署过程不会解压缩war文件,并且不会真正部署任何东西。 CodePipeline报告成功,因为已成功复制文件,但Tomcat不会解压缩war文件。
解决方案是以分解形式(已解压缩)提供工件。为此,请修改CodeBuild buildspec.yml的后期构建阶段和工件定义:
version: 0.2
phases:
install:
runtime-versions:
java: openjdk8
pre_build:
commands:
- echo CODEBUILD_RESOLVED_SOURCE_VERSION $CODEBUILD_RESOLVED_SOURCE_VERSION
build:
commands:
- mvn compile
post_build:
commands:
- mvn package
- mkdir artifact <-- create folder to extract war file content
- unzip target/my.war -d artifact/ <-- unzip to that folder
artifacts:
files:
- artifact/**/* <-- reference all those files as the artifact
name: artifact
cache:
paths:
- '/root/.m2/**/*'
请注意后期构建阶段中的mkdir
和unzip
命令,以及files
部分中的artifacts
定义是如何编写的。根据{{3}},**/*
表示所有文件都是递归的。
答案 2 :(得分:0)
我也为此苦了一段时间。最终,我能够通过buildspec.yml从post_build部分的内置war文件中提取WEB-INF目录来解决该问题
由于AWS在您的工件上放置了一个zip包装器,因此它围绕了Elasticbeanstalk实际需要的位置添加了另一个文件夹级别
version: 0.2
phases:
install:
runtime-versions:
java: corretto11
build:
commands:
- mvn compile
post_build:
commands:
- mvn package
- mkdir artifact
- unzip target/demo-0.0.1-SNAPSHOT.war -d artifact/
- mv artifact/WEB-INF WEB-INF
artifacts:
files:
- WEB-INF/**/*
name: artifact