【问题标题】:AWS CodePipeline successful, but not correctly deployed to Elastic BeanstalkAWS CodePipeline 成功,但未正确部署到 Elastic Beanstalk
【发布时间】:2017-04-23 16:33:35
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

我试图复制您所面临的问题。我认为在创建“war”文件时,您将包含“META-INF”和“WEB-INF”文件夹的文件夹作为“war”输出文件的根目录。

相反,您应该将所有文件(在上面的文件夹中)放在“war”文件中,而不是根级文件夹。

【讨论】:

  • 我认为 WAR 文件有问题。但是,当我从 S3(由 CodeBuild 生成)下载 WAR 文件并将其手动部署到 Elastic Beanstalk 时,它就可以正常工作了。
【解决方案2】:

似乎差不多三年后 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 命令,以及artifacts 部分中的files 定义是如何编写的。根据CodeBuild documentation**/* 表示所有文件递归

【讨论】:

    【解决方案3】:

    我也为此苦苦挣扎了一段时间。最后,我能够通过让 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 
    

    【讨论】:

      猜你喜欢
      • 2018-05-16
      • 2020-07-05
      • 2020-10-22
      • 2018-08-13
      • 2015-09-20
      • 2020-05-14
      • 2015-02-24
      • 2021-11-20
      • 2021-06-24
      相关资源
      最近更新 更多