Как я могу опубликовать статические веб-ресурсы в Amazon S3, используя Hudson / Jenkins и Maven? - PullRequest
5 голосов
/ 23 марта 2011

Я бы хотел иметь возможность развертывать статические веб-ресурсы (jpgs, css и тому подобное) в Amazon S3, поскольку они не будут обслуживаться тем же сервером, что и мое основное веб-приложение.

Я использую Jenkins (FKA Hudson) и Maven для создания файла .WAR веб-приложения Java, а затем загружаю его в экземпляр Tomcat с помощью плагина Jenkins «Deploy to container».

Я действительно хочу, чтобы статические ресурсы были развернуты как часть основного процесса сборки, но я не знаю, как лучше всего получить их на S3. Я видел плагины Hudson / Jenkins, которые копируют артефакты, но это будет только мой файл .WAR, а не файлы внутри проекта.

Есть какие-нибудь идеи о "хорошем" способе сделать это? Должен ли я делать это с плагином Maven вместо плагинов Hudson / Jenkins?

Ответы [ 4 ]

6 голосов
/ 24 марта 2011

Вот как я это делаю: для выполнения работы используйте внешнюю программу, например s3cmd . Вы просто указали бы шаг сборки сценария оболочки, подобный этому

#!/bin/sh

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

Вероятно, вы можете интегрировать это в ваш pom.xml и вызывать его оттуда (так что эта часть процесса развертывания находится под контролем версий).

1 голос
/ 04 августа 2012

Я создал s3-webcache-maven-plugin , который загружает изображения, javascript, css и любые другие статические ресурсы из src / main / webapp в заданное S3 Bucket, а источники доступны по адресу https://github.com/aro1976/aws-parent.

Кроме того, он создает манифест с именем WEB-INF / s3-webcache.xml , который может использоваться фильтром сервлетов для перенаправления запросов с вашего веб-сервера на S3 или CloudForge .

Вам необходимо поместить следующую конфигурацию в :

<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>

Параметры конфигурации, такие как , включают и , исключая , которые требуются в настоящее время, и вы можете использовать традиционное регулярное выражение maven.

Имена файлов, хранящиеся в 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 (с конфигурацией фильтра).

1 голос
/ 01 апреля 2011

Оказалось, мне не нужно было этого делать. Мы всегда планировали использовать CloudFront для распространения, и недавно AWS позволил вам указать «пользовательский источник» для дистрибутивов CloudFront. Это означает, что статические ресурсы могут быть развернуты вместе с остальным содержимым .war, а затем дистрибутив CloudFront указывает на это приложение.

0 голосов
/ 29 февраля 2016

Я бы предложил aws cli .Вы можете легко установить его из pip на большинстве платформ.

Синхронизация с CloudFront так же проста, как синхронизация вашего сегмента S3:

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

Открытый флаг делает ресурсы доступными для чтения во всем мире.

Вместо того, чтобы проходить через плагины, вы можете просто добавить вышеперечисленное в качестве шага сборки в своей конфигурации.

...