Дженкинс Непрерывная интеграция с Amazon S3 - Все загружается в корень?

Я запускаю Jenkins, и я успешно работаю с моей учетной записью Github, но я не могу нормально работать с Amazon S3.

Я установил плагин S3, и когда я запустил сборку, она успешно загрузится в ядро ​​S3, которое я укажу, но все загруженные файлы попадают в корень ведра. У меня есть куча папок (например,/css/js и т.д.), Но все файлы в этих папках из hithub попадают в корень моей учетной записи S3.

Возможно ли получить плагин S3 для загрузки и сохранения структуры папок?

Ответ 1

Не похоже, что это возможно. Вместо этого я использую s3cmd для этого. Сначала вы должны установить его на свой сервер, а затем в одном из сценариев bash в задании Jenkins, которое вы можете использовать:

s3cmd sync -r -P $WORKSPACE/ s3://YOUR_BUCKET_NAME

Это скопирует все файлы на вашу учетную запись S3, поддерживая структуру папок. -P сохраняет разрешения на чтение для всех (необходимо, если вы используете свой ведро в качестве веб-сервера). Это отличное решение с использованием функции синхронизации, поскольку оно сравнивает все ваши локальные файлы с ведром S3 и копирует только те файлы, которые были изменены (путем сравнения размеров файлов и контрольных сумм).

Ответ 2

Я никогда не работал с плагином S3 для Jenkins (но теперь, когда я знаю, что он существует, я мог бы попробовать), хотя, глядя на код, кажется, вы можете делать только то, что хотите, используя обходной путь.

Здесь, что делает фактический код плагина (взято из github) - я удалил части кода, которые не имеют отношения к удобочитаемости:

class hudson.plugins.s3.S3Profile, метод upload:

final Destination dest = new Destination(bucketName,filePath.getName());
getClient().putObject(dest.bucketName, dest.objectName, filePath.read(), metadata);

Теперь, если вы посмотрите на hudson.FilePath.getName() JavaDoc:

Получает только часть имени файла без каталогов.

Теперь рассмотрим конструктор hudson.plugins.s3.Destination:

public Destination(final String userBucketName, final String fileName) {

    if (userBucketName == null || fileName == null) 
        throw new IllegalArgumentException("Not defined for null parameters: "+userBucketName+","+fileName);

    final String[] bucketNameArray = userBucketName.split("/", 2);
    bucketName = bucketNameArray[0];
    if (bucketNameArray.length > 1) {
        objectName = bucketNameArray[1] + "/" + fileName;
    } else {
        objectName = fileName;
    }
}

В классе Destination JavaDoc говорится:

Приведенное здесь соглашение состоит в том, что имя/в имени ведра используется для построения структуры в имени объекта. То есть, put of file.txt в bucket имя "mybucket/v1" приведет к созданию объекта "v1/file.txt" в mybucket.

Заключение: вызов filePath.getName() отключается от любого префикса (у S3 нет какой-либо директории, а префиксы, см. this и этот поток для дополнительной информации) вы добавляете в файл. Если вам действительно нужно поместить ваши файлы в "папку" (т.е. Иметь определенный префикс, содержащий косую черту (/)), я предлагаю вам добавить этот префикс в конец вашего имени ведра, как показано в Destination класс JavaDoc.

Ответ 3

Да, это возможно.

Похоже, что для каждого назначения папки вам понадобится отдельный экземпляр S3-плагина.

"Источник" - это файл, который вы загружаете.

"Целевое ведро" - это место, где вы размещаете свой путь.

Ответ 4

Используя Jenkins 1.532.2 и S3 Publisher Plug-In 0.5, экран настройки пользовательского интерфейса отклоняет дополнительные записи публикации S3. Также нам будет полезно техническое обслуживание, если плагин воссоздает структуру каталогов рабочей области, так как у нас будет много каталогов для создания.

Ответ 5

  • Настройте плагин git.

введите описание изображения здесь

  1. Настройте Bash script

введите описание изображения здесь

  1. Все в вашей папке, помеченной как "*", перейдут в bucket