通过 Maven 为 Spring Boot 应用程序创建 AWS Beanstalk 的 .ebextensions 的正确方法是啥

Posted

技术标签:

【中文标题】通过 Maven 为 Spring Boot 应用程序创建 AWS Beanstalk 的 .ebextensions 的正确方法是啥【英文标题】:What is the proper way to create .ebextensions for AWS Beanstalk through maven for Spring Boot app通过 Maven 为 Spring Boot 应用程序创建 AWS Beanstalk 的 .ebextensions 的正确方法是什么 【发布时间】:2019-04-12 03:47:24 【问题描述】:

我们必须在 GitLab CI/CD 管道期间在我们动态生成的 Spring Boot 应用程序的 Elastic Beanstalk 实例中自定义 hosts 文件。为此,我们需要提供一个带有如下配置文件的.ebextensions 目录:

commands:
  01_add_hosts:
    command: echo 123.12.12.123 myhost.com >> /etc/hosts

由于我们有一个 spring boot 应用程序,我们必须在 fat jar 的根级别打包 .ebextensions。所以,基本上我们解压缩 jar,添加 ebextensions 目录并将其压缩回来。通过这种方式,我们成功地在 Gitlab 管道中实现了 Beanstalk 自定义。

但是,为了完成这个过程,我们像这样使用maven-antrun-plugin

<!-- Bundle .ebextensions inside jar -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.8</version>
    <executions>
        <execution>
            <id>prepare</id>
            <phase>package</phase>
            <configuration>
                <tasks>
                    <unzip src="$project.build.directory/$project.build.finalName.jar" dest="$project.build.directory/$project.build.finalName" />
                    <copy todir="$project.build.directory/$project.build.finalName/" overwrite="false">
                        <fileset dir="./" includes=".ebextensions/**"/>
                    </copy>
                    <zip compress="false" destfile="$project.build.directory/$project.build.finalName.jar" basedir="$project.build.directory/$project.build.finalName"/>
                </tasks>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
</plugin>

问题在于 maven-antrun-plugin 是 2014 年的旧插件,这看起来不是实现此捆绑 jar 的正确方法。

您是如何创建此捆绑 jar 的 Spring Boot 方式或它是什么?我的意思是在春季启动时在 jar 的根级别添加目录/文件?请记住,我们在通过 AWS Beanstalk maven 插件部署的管道作业时将其捆绑在一起。

【问题讨论】:

【参考方案1】:

是否要求您只上传一个罐子到弹性豆茎?我们这样做的方式是上传一个 zipfile,其中包含我们的 fat jar、一个 .ebextensions 目录和一个 Procfile。这样,ebextensions 就会被应用,并且 Procfile 包含启动 java 进程的命令。

例如,您可以上传 hello-world.zip,其中包含:

.eb 扩展: hosts.config hello-world.jar 过程文件

Procfile 是一个包含以下内容的文本文件:

网页:java -jar hello-world.jar

如果您这样做,则无需将您的 ebextension 文件嵌入到您的应用程序 jar 中,我认为这会使事情变得容易得多。

Procfile documentation

【讨论】:

感谢您的选择。但是,我们这样做是为了通过我们的 gitlab ci 管道自动执行此任务。我的问题集中在如何在动态生成的环境(gitlab ci 作业)上生成这个包【参考方案2】:

Build Helper Maven Plugin 可用于此目的。在项目的根目录下创建一个文件夹.ebextensions,并将插件添加到pom.xml&lt;build&gt;&lt;plugins&gt;部分:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <executions>
        <execution>
            <id>add-resource-ebextensions</id>
            <phase>generate-resources</phase>
            <goals>
                <goal>add-resource</goal>
            </goals>
            <configuration>
                <resources>
                    <resource>
                        <directory>$basedir/.ebextensions</directory>
                        <targetPath>.ebextensions</targetPath>
                    </resource>
                </resources>
            </configuration>
        </execution>
    </executions>
</plugin>

【讨论】:

这对我有用。我建议将此作为选定的答案。

以上是关于通过 Maven 为 Spring Boot 应用程序创建 AWS Beanstalk 的 .ebextensions 的正确方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

Maven插件系列之spring-boot-maven-plugin

为spring boot应用程序生成war包时maven构建失败?

Maven插件系列之spring-boot-maven-plugin

SpringBoot入门之spring-boot-maven-plugin

所有页面都在 Postman 中使用 Maven 为 Spring Boot 应用程序提供 404 错误

spring boot 热启动