5

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

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

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

关于“好”方法的任何想法?我应该使用 Maven 插件而不是 Hudson/Jenkins 插件来执行此操作吗?

4

4 回答 4

6

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

#!/bin/sh

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

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

于 2011-03-24T08:03:44.590 回答
1

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

于 2011-04-01T08:08:42.560 回答
1

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

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

您需要将以下配置放入 <build><plugins>:

<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摘要替换,为了允许非常长的缓存头和多战争 otimization,这就是我创建 WebCacheFilter 的原因,它非常简单,并用 SHA 转换传统文件名- 256摘要对应。

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

于 2012-08-04T04:16:14.093 回答
0

我建议使用aws clipip您可以在大多数平台上轻松安装它。

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

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

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

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

于 2016-02-28T22:14:39.423 回答