AWS CodePipeline成功,但未正确部署到Elastic Beanstalk

时间:2016-12-08 12:19:40

标签: amazon-web-services elastic-beanstalk aws-codepipeline aws-codebuild

当我调用应用程序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文件?

3 个答案:

答案 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/**/*'

请注意后期构建阶段中的mkdirunzip命令,以及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