Как загрузить артефакт в Artifactory/использовать его в системе сборки (Gradle Maven Ant), где у артефакта нет расширения

У меня есть следующие файлы, которые я хотел бы загрузить в Artifactory как артефакт версии 9.8.0.

ПРИМЕЧАНИЕ. Первые два файла НЕ ИМЕЮТ расширения (они являются исполняемыми файлами, т.е. если вы откроете их/кот на нем, вы увидите ненужные символы).

Папка/файлы данной версии 9.8.0 в CVS выглядит так:

com.company.project/gigaproject/v9.8.0/linux/gigainstall
com.company.project/gigaproject/v9.8.0/solaris/gigainstall
com.company.project/gigaproject/v9.8.0/win32/gigainstall.exe
com.company.project/gigaproject/v9.8.0/gigafile.dtd
com.company.project/gigaproject/v9.8.0/gigaanotherfile.dtd
com.company.project/gigaproject/v9.8.0/giga.jar
com.company.project/gigaproject/v9.8.0/giga.war

Загрузить вышеуказанные файлы с расширением очень просто... Вы входите в Artifactory как администратор/пользователь, имеющий доступ к развертыванию артефактов, нажимаете вкладку «Развернуть», находите файл Artifactory и, как только вы выбираете файл, нажмите на кнопку «Загрузить».

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

Далее вы увидите экран (как показано выше). Вы настроите то, что хотите, в полях на этой странице, и как только вы нажмете «Развернуть артефакт», все готово. Все, что вам нужно сделать, это выбрать правильный файл file.extension при загрузке и убедиться, что расширение файла правильно отображается в поле «Путь к цели» (с версией -x.x.x и т. д.).

Мои вопросы:

Вопрос 1. Как загрузить артефакт без расширения? Похоже, что Artifactory по умолчанию принимает артефакт как расширение .jar. Как я могу загрузить артефакт «gigainstall», как показано в структуре папок/файлов выше, как для Linux, так и для Solaris? Я вижу, что могу использовать имя артефакта как gigainstall-linux и gigainstall-solaris и различать его, но я не уверен, как сообщить Artifactory, что у этого артефакта нет расширения.

Я не думаю, что команда разработчиков начнет генерировать этот артефакт с надлежащим расширением (поскольку этот артефакт может быть жестко запрограммирован везде в других проектах, где они в настоящее время получают его из системы управления версиями CVS/SVN — что само по себе является плохой практикой для сохранить артефакт в инструменте управления версиями).

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

Вопрос 2. Как сообщить системе сборки (например, Gradle) использовать нерасширенный артефакт во время, скажем, задачи "компиляции". В build.gradle в разделе dependencies { .. } я добавлю что-то вроде того, как показано ниже, но я не уверен в файлах без расширений (первые два в структуре папок/файлов, о которых я упоминал выше).

dependencies {
     //compile 'com.company.project:gigainstall-linux:9.8.0@'
     //compile 'com.company.project:gigainstall-linux:9.8.0@??????'
     //compile 'com.company.project:gigainstall-linux:9.8.0@""'
     //compile 'com.company.project:gigainstall-linux:9.8.0@"none"'
     //compile 'com.company.project:gigainstall-linux:9.8.0@"NULL_or_something"'

     // The following will easily get giga.jar version giga-9.8.0.jar from Artifactory repository
     compile 'com.company.project:giga:9.8.0'

     // The following will easily get giga.war
     compile 'com.company.project:giga:9.8.0@war'

     // Similarly, other extension based artifacts can be fetched from Artifactory
     compile 'com.company.project:gigafile:9.8.0@dtd'
     compile 'com.company.project:gigaanotherfile:9.8.0@dtd'
}

person AKS    schedule 02.07.2014    source источник


Ответы (1)


Ответ 1 (также охватывает 2 в другом смысле): использование раздела Artifactory «Artifact Bundle» на вкладке «Развертывание» может сделать ТРЮК, ПО КРАЙНЕЙ МЕРЕ, для загрузки артефакты нужным нам образом, сначала создав zip-файл (содержащий структуру и артефакты в нем) ---ИЛИ вы можете загрузить артефакты с помощью/вызовом Artifactory REST API способ.

Идея высокого уровня:

Создайте zip-файл с именем gigaproject.zip ИЛИ файл anyname.zip/.tar/compressed, который Artifactory сможет прочитать. Внутри zip создайте структуру — как эти артефакты будут загружаться в Artifactory

т.е. gigaproject.zip будет содержать следующие папки/структуры/файлы.

Случай 1:

com/company/project/gigaproject/9.8.0/linux/gigainstall
com/company/project/gigaproject/9.8.0/solaris/gigainstall
com/company/project/gigaproject/9.8.0/win32/gigainstall.exe
com/company/project/gigaproject/9.8.0/gigafile.dtd
com/company/project/gigaproject/9.8.0/gigaanotherfile.dtd
com/company/project/gigaproject/9.8.0/giga.jar
com/company/project/gigaproject/9.8.0/giga.war

ПРИМЕЧАНИЕ. В примере 1 я не использовал -x.x.x в имени файла (т. е. я использую обычный и простой giga.jar вместо giga-9.8.0.jar).

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

Вышеупомянутая загрузка/развертывание приведет к файлам (как показано на следующем снимке):

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

Итак, мы добились того, чего хотели. На самом деле (видимо, да), но не так, как Artifactory обычно хранит эти артефакты (так как они должны иметь версию -x.x.x, встроенную в имя файла, и где идентификатор артефакта должен соответствовать имени файла артефакта). Теперь, если вы хотите использовать следующее в файле сборки Gradle, вы НЕ МОЖЕТЕ, во-первых, вы не загрузили имя файла с именем версии -x.x.x, во-вторых, идентификатор артефакта в нашем случае 1 дерева был "gigaproject" ( после папки com/company/project), поэтому способ Gradle для определения идентификатора артефакта и имени файла артефакта, который вы хотите, не будет работать.

compile 'com.company.project:gigaproject:CANNOTSAY_HOW_TO_GET_GIGA_JARorGIGAINSTALL_with_without_extension'

Вывод: можно загружать любые файлы (с расширением/без расширения в Artifactory) в любую структуру, но это зависит от того, как ваша система сборки будет их использовать или сможет их использовать или нет. - Я удалил только что созданную структуру с файлом .zip случая 1 из репозитория Artifactory, чтобы попробовать следующий случай № 2, и удалил созданный файл .zip.

Случай 2:

Давайте создадим индивидуальное имя версии файла для каждого артефакта, а также создадим структуру в формате — как Artifactory фактически хранит их (артефакт, как видно в репозитории в виде дерева) и создадим файл .zip, содержащий эту структуру. Давайте воспользуемся той же функцией «Комплект артефактов», чтобы загрузить этот ZIP-файл для загрузки отдельных артефактов, которые нам нужны в Artifactory, где идентификатор артефакта (второе значение, которое мы упоминаем при попытке его использования) будет соответствовать имени файла артефакта в Artifactory.

Структура папки/файла для файла .zip:

com/company/project/gigainstall/9.8.0/gigainstall-9.8.0.linux
com/company/project/gigainstall/9.8.0/gigainstall-9.8.0.solaris
com/company/project/gigainstall/9.8.0/gigainstall-9.8.0.exe
com/company/project/gigafile/9.8.0/gigafile-9.8.0.dtd
com/company/project/gigaanotherfile/9.8.0/gigaanotherfile-9.8.0.dtd
com/company/project/giga/9.8.0/giga-9.8.0.jar
com/company/project/giga/9.8.0/giga-9.8.0.war

ПРИМЕЧАНИЕ. На этот раз мы будем использовать ту же функцию «Комплект артефактов» и для похожих файлов (gigainstall в обеих папках Linux/Solaris). 9.8.0.linux и gigainstall-9.8.0.solaris), т. е. когда мы будем использовать эти артефакты в Gradle в разделе зависимостей { ... } для компиляции, мы будем использовать способ x.x.x@ для получения этих артефактов из Artifactory. .

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

ОК, после успешного развертывания/загрузки «Artifact Bundle» я получил следующее сообщение.

Successfully deployed 7 artifacts from archive: gigaproject.zip (1 seconds).

Теперь давайте посмотрим, как это выглядит в Artifactory при поиске одного из артефактов/в дереве. Вы можете видеть, что теперь у нас есть файлы на месте с именем файла-x.x.x.extension, так что я могу легко использовать их в Gradle.

В файле сборки Gradle (build.gradle) я упомяну:

dependencies {
  compile "com.company.project:gigainstall:9.8.0@linux"
  compile "com.company.project:gigainstall:9.8.0@solaris"
  compile "com.company.project:gigainstall:9.8.0@linux"
  compile "com.company.project:giga:9.8.0
  compile "com.company.project:giga:9.8.0@war
  compile "com.company.project:gigafile:9.8.0@dtd
  compile "com.company.project:gigaanotherfile:9.8.0@dtd
}


О-О-О!! - Это не сработало, см. ниже ошибку Gradle. Почему? - Функция загрузки/развертывания Artifactory Bundle загружает содержимое zip-файла, которое у вас есть в .zip, но НЕ создает файл .pom для каждого артефакта, который он развертывает. Таким образом, сборка Gradle потерпит неудачу. Может быть, в Ant это может быть успешным. Это происходило для каждого отдельного файла .jar/.war/.dtd/etc. Я просто показываю один пример ошибки.

При выполнении чистой сборки Gradle

Could not resolve all dependencies for configuration ':compile'.
> Could not resolve com.company.project:gigafile:0.0.0.
  Required by:
      com.company.project:ABCProjectWhichConsumesGIGAProjectArtifacts:1.64.0
   > Could not GET 'http://artifactoryserver:8081/artifactory/ext-snapshot-local/com/company/project/gigafile/0.0.0/gigafile-0.0.0.pom'. Received status code 409 from server: Conflict

Случай 3. Давайте воспользуемся простым подходом (обходной путь, но избавит от многих проблем). Создайте файл gigaproject.zip со следующей структурой, этот подход использует - Нет значения версии x.x.x, встроенного в отдельный артефакт/имя файла в структуре папок/файлов. Мы будем использовать подход «Единый артефакт» (который автоматически создаст файл .pom для gigaproject.zip во время процесса загрузки/развертывания, предоставляемого Artifactory). Используя этот подход, вы по-прежнему сможете получить файл gigainstall, не требуя расширения его имени. На этапе загрузки/развертывания, как вы уже видели, вы загружаете gigaproject.zip, и артефакты загружают его в указанный целевой репозиторий как "gigaproject-x.x.x.zip", где x.x.x в нашем случае 9.8.0. См. снимок изображения ниже.

gigaproject/linux/gigainstall
gigaproject/solaris/gigainstall
gigaproject/win32/gigainstall.exe
gigaproject/gigafile.dtd
gigaproject/gigaanotherfile.dtd
gigaproject/gigaproject.zip
gigaproject/giga.jar
gigaproject/giga.war

Теперь загрузите его в Artifactory, используя функцию «Одиночный артефакт». Нажмите «Развернуть артефакт», как только вы настроите значения для GroupId, ArtifactId, Version и т. д.

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

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

Как только это будет загружено. Вы увидите артефакт zip в целевом репозитории (я взял плохой пример, обычно это будет libs-snapshot-local или libs-release-local вместо ext-...), вы сможете потреблять артефакт ZIP непосредственно в Gradle:

dependencies {
   // This is the only line we need now.
   compile "com.company.project:gigaproject:9.8.0@zip"
}

Как только .zip станет доступен для системы сборки Gradle, теперь вы можете указать Gradle распаковать этот .zip файл где-нибудь в вашей области сборки/рабочей области, где вы можете передать фактические (распакованные) файлы (gigainstall, .dtd, .jar, .war и т. д.) к процессу/шагам сборки.

PS: Варианты № 1 и 2, я думаю, сработали бы для Ant.



Ответ 2: Если вы каким-либо образом загрузили файл без расширения. Убедитесь, что вы также вручную создали/загрузили его POM-файл (например, если я загрузил gigainstall-9.8.0 как артефакт в com/company/project/gigainstall/9.8.0/gigainstall-9.8.0, то на том же уровне я должен/должен создать его файл POM (см. простой файл шаблона .pom для пользовательского артефакта jar или при загрузке расширенного файла с помощью развертывания «Single Artifact», вы увидите, что Отображается окно редактора POM) и загрузите оба, чтобы Gradle не выдал сообщение об отсутствии конфликта/ошибки POM. Ant может не нуждаться в pom (я этого не проверял).

Как только он появится в Artifactory, следующая строка должна работать — ИЛИ прокомментируйте, пожалуйста, если вы найдете другой способ.

dependencies {
   // See nothing mentioned after - x.x.x@
   compile "com.company.package:gigainstall:9.8.0@"
}
person AKS    schedule 03.07.2014