【问题标题】:How can I publish static web resources to Amazon S3 using Hudson/Jenkins and Maven?如何使用 Hudson/Jenkins 和 Maven 将静态 Web 资源发布到 Amazon S3?
【发布时间】:2011-03-23 15:36:16
【问题描述】:

我希望能够将静态 Web 资源(jpg、css 等)部署到 Amazon S3,因为它们不会由与我的主 web 应用程序相同的服务器提供服务。

我使用 Jenkins (FKA Hudson) 和 Maven 构建 Java webapp .WAR 文件,然后使用 Jenkins“部署到容器”插件将其上传到 Tomcat 实例。

我真的希望将静态资产作为主要构建过程的一部分进行部署,但我不知道将它们部署到 S3 的最佳方式。我见过复制工件的 Hudson/Jenkins 插件,但这只是我的 .WAR 文件,而不是项目中的文件。

有什么“好”的方法可以做到这一点吗?我应该使用 Maven 插件而不是 Hudson/Jenkins 插件吗?

【问题讨论】:

  • 资源不是在src/main/resources文件夹吗?
  • 好吧,如果我想要的话,它们可能是 - 关键是我如何将它们带到 Amazon S3?

标签: maven hudson amazon-s3 amazon-web-services jenkins


【解决方案1】:

我是这样做的:使用外部程序,例如 s3cmd 来完成这项工作。您只需像这样指定一个 shell 脚本构建步骤

#!/bin/sh

s3cmd --guess-mime-type -P sync $WORKSPACE/src/main/resources s3://your-bucket-name/some/path

您可以将它集成到您​​的 pom.xml 中并从那里调用它(因此您的这部分部署过程受版本控制)。

【讨论】:

    【解决方案2】:

    原来我不需要这样做。我们一直计划使用 CloudFront 进行分发,最近 AWS 允许您为 CloudFront 分发指定“自定义来源”。这意味着静态资产可以与 .war 内容的其余部分一起部署,然后指向该应用程序的 CloudFront 分配。

    【讨论】:

      【解决方案3】:

      我创建了一个 s3-webcache-maven-plugin,它将图像、javascript、css 和任何其他静态资源从 src/main/webapp 上传到给定的 S3 Bucket,并且源可用在https://github.com/aro1976/aws-parent

      此外,它还会创建一个名为 WEB-INF/s3-webcache.xml 的清单,servlet 过滤器可以使用该清单将请求从您的 Web 服务器重定向到 S3CloudForge

      您需要将以下配置放入

      <plugin>
        <groupId>br.com.dynamicflow.aws</groupId>
        <artifactId>s3-webcache-maven-plugin</artifactId>
        <version>0.0.2-SNAPSHOT</version>
        <configuration>
          <accessKey>${s3.accessKey}</accessKey>
          <secretKey>${s3.secretKey}</secretKey>
          <bucketName>${s3.bucketName}</bucketName>
          <hostName>${cloudForge.cname}</hostName><!-- hostName is optional -->
          <includes>
            <include>**/*.gif</include>
            <include>**/*.jpg</include>
            <include>**/*.tif</include>
            <include>**/*.png</include>
            <include>**/*.pdf</include>
            <include>**/*.swf</include>
            <include>**/*.eps</include>
            <include>**/*.js</include>
            <include>**/*.css</include>
          </includes>
          <excludes>
            <exclude>WEB-INF/**</exclude>
          </excludes>
          </configuration>
          <executions>
          <execution>
            <goals>
                <goal>upload</goal>
            </goals>
            <phase>prepare-package</phase>
          </execution>
          </executions>
      </plugin>
      

      此时需要includesexcludes等配置参数,可以使用传统的maven regex。

      存储在 S3 的文件名被它们的 SHA-256 摘要替换,以便允许非常长的缓存头和多战争优化,这就是我创建的原因WebCacheFilter,它非常简单,可以将传统文件名与 SHA-256 摘要对应项进行转换。

      查看https://github.com/aro1976/aws-parent/tree/aws-parent-0.0.1/aws-examples/s3-webcache-example示例项目,特别是文件 pom.xml(带有插件配置)和 web.xml(带有过滤器配置)。

      【讨论】:

      • 这表明您将 maven 文件推送到您的 git 存储库中。我不认为提交 AWS 密钥是一个好主意。即使存储库是私有的。
      • 凭据存储在外部文件中。
      【解决方案4】:

      我建议aws cli。您可以在大多数平台上通过pip 轻松安装它。

      同步到 CloudFront 就像同步您的 S3 存储桶一样简单:

      aws s3 sync your-local-dir/ s3://your-bucket --acl "public-read"
      

      公共标志使资产世界可读。

      而不是通过插件,您应该能够将上述内容作为构建步骤添加到您的配置中。

      【讨论】:

        猜你喜欢
        • 2014-01-06
        • 1970-01-01
        • 2011-06-29
        • 1970-01-01
        • 2012-04-15
        • 2016-03-28
        • 2017-07-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多