Что не так с этой конфигурацией Ivy changePattern / SNAPSHOT?

Я не могу заставить Ivy обновлять кеш при обновлении зависимостей моментальных снимков. Резолвер (to имеет следующие настройки:

<url name="xxx" m2compatible="false" 
     checkmodified="true" changingMatcher="regexp" 
     changingPattern=".*-SNAPSHOT.*">

Пример имени файла артефакта (в Artifactory):

my-jar-1.999-SNAPSHOT.jar

Подробный журнал решения Ant включает:

[NOT REQUIRED] com.myorg#my-module;1.999-SNAPSHOT!my-jar.jar

На артефакте нет POM.

Резолвер находится под цепным резольвером; у них обоих установлены все соответствующие атрибуты. Я прочитал https://issues.apache.org/jira/browse/IVY-938 и https://issues.apache.org/jira/browse/IVY-1221, включая все комментарии, и AFAICT (возможно, неправильно!) ни один из обходных путей не подходит.

Должен ли я отказаться от моментальных снимков и просто использовать явные версии с динамическими зависимостями «integration.latest»? Я боюсь, что это может привести к сбою, когда у нас будут сборки интеграции для нескольких основных версий. В этот момент нам нужно будет разделить основные версии на отдельные репозитории, или поместить номер основной сборки в имя артефакта, или сделать что-то столь же неуклюжее, просто чтобы заставить работать «integration.latest».


person Ed Staub    schedule 21.01.2013    source источник
comment
Я вижу, вы изменили вопрос... Ревизии моментальных снимков — это особая функция Maven. Вы указываете 1.2.3-SNAPSHOT, и он волшебным образом преобразуется во внутренний файл, который имеет номер версии с отметкой времени: 1.2.3-201301210911. Загляните в свой репозиторий и посмотрите URL-адреса, необходимые для получения реальных файлов.   -  person Mark O'Connor    schedule 22.01.2013
comment
@MarkO'Connor В репозитории есть имена без отметок времени, как показано выше: my-jar-1.999-SNAPSHOT.jar.   -  person Ed Staub    schedule 22.01.2013
comment
Извините, что зацикливаюсь на Maven... Он представил концепцию моментальных снимков, когда я думаю, что подход ivy к last.release и last.integration гораздо более стандартен в том, как люди управляют своими номерами ревизий.   -  person Mark O'Connor    schedule 22.01.2013


Ответы (2)


Я не сторонник использования преобразователя URL-адресов при общении с менеджерами репозиториев Maven. Проблема в том, что Maven имеет специальную и довольно уникальную обработку для ревизий моментальных снимков..... Преобразователь URL-адресов лучше подходит для использования с репозиториями ivy.

Я использую Nexus, но следующее также должно относиться и к Artifactory. Следующий файл настроек настраивает Maven Central и два моих размещенных репозитория (репозитории Maven бывают двух видов: выпуск или моментальный снимок):

<ivysettings>
    <settings defaultResolver="repos" />
    <resolvers>
        <chain name="repos">
            <ibiblio name="central" m2compatible="true"/>   
            <ibiblio name="my-releases" m2compatible="true" root="https://myhost/releases"/>   
            <ibiblio name="my-snapshots" m2compatible="true" root="https://myhost/snapshots"/>   
        </chain>
    </resolvers>
</ivysettings>

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

Когда мне требуется версия моментального снимка, я думаю, что объявляю ее явно следующим образом:

<ivy-module version="2.0">
    <info organisation="myOrg" module="Demo"/>
    <dependencies>
        <dependency org="myOrg" name="myModule" rev="2.7-SNAPSHOT"/>
        ..
    </dependencies>
</ivy-module>

Под капотом преобразователь ibilio читает файлы метаданных репозитория Maven, чтобы определить какой артефакт с отметкой времени следует извлечь из хранилища моментальных снимков.

Обновлять

Предлагаю прочитать следующую презентацию:

Он довольно хорошо описывает философию Maven, отделяющую выпуски от сборок для разработчиков (или снимков). Это также объясняет один из очень неуклюжих аспектов Maven... Два разных способа публикации артефактов...

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

Я бы предложил ограничить моментальные снимки сборками только для разработчиков. Развертывайте только релиз-кандидаты. Проблемы с этим подходом будут заключаться в управлении большим количеством релизов. Некоторые менеджеры репозиториев (Nexus, Artifactory, Archiva) предлагают функции «постановки», которые позволяют сертифицировать или отбрасывать выпуски, не прошедшие проверку качества.

Обновление 2

Если вы используете ivy для публикации моментальных снимков в репозиторий Maven, возникает несколько проблем:

На мой взгляд, файлы с отметками времени — это одна из главных особенностей использования моментальных снимков. С помощью ivy можно предоставить только самый последний файл (перезаписывая предыдущий последний файл).

Существуют обходные пути для решения этих проблем:

  1. Как предлагается во второй ссылке, вы можете полностью игнорировать метаданные (установив для атрибута «useMavenMetadata» значение false) и по умолчанию вернуться к более старому механизму сравнения имен файлов ivy. Это решает проблему только для клиентов ivy.
  2. Менеджер репозитория должен иметь возможность регенерировать файлы метаданных (по крайней мере у Nexus есть задача сделать это).
  3. Используйте задачу Maven ANT.

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

person Mark O'Connor    schedule 21.01.2013
comment
Спасибо, но мы вообще не используем Maven. Нет ни poms, ни каких-либо значимых метаданных, кроме файла ivy.xml. - person Ed Staub; 21.01.2013
comment
@EdStaub Nexus, Artifactory, Archiva — это продукты, изначально предназначенные для размещения репозиториев Maven. Ivy понимает формат репозитория Maven 2 (или M2), который эти репозитории используют для хранения своих данных. Ivy может общаться с этими репозиториями нативно. Так что да, на стороне клиента нет POM (функционально замененный файлом ivy.xml), на стороне сервера все основано на Maven. Загляните в репозиторий, используемый для хранения снимков. Вы обнаружите специальные файлы maven-metadata.xml, в которых перечислены версии с отметками времени. Именно эти файлы ibilio понимает как читать. - person Mark O'Connor; 21.01.2013
comment
Большое спасибо. Файлов метаданных там нет, но, вероятно, это связано с тем, что у меня установлен m2совместимый=false и/или потому что я использую преобразователь URL-адресов (потому что нам нужна некоторая гибкость шаблона именования, которую Maven не поддерживает). Я посмотрю, смогу ли я заставить это работать. - person Ed Staub; 21.01.2013
comment
@EdStaub Еще одна вещь, которую нужно проверить ... Artifactory более гибок в том, как он управляет макетами репозитория. Возможно, репозиторий, к которому вы обращаетесь, не настроен для макета M2? Это стоит проверить .... Лично я бы рекомендовал стандартизировать то, что является отраслевым стандартом де-факто. Позволяет сборкам на основе Maven получать доступ к вашим артефактам. - person Mark O'Connor; 21.01.2013
comment
В основном я полагался на документацию Ivy и Artifactory, а также на документацию Jira, которая часто отражает отличия от Maven и Nexus. Нет, мы не пытаемся внедрить конвейер непрерывной доставки. Сборки моментальных снимков используются разработчиками и Jenkins. Я не уверен, что вы подразумеваете под развертыванием — если вы имеете в виду публикацию вне разработки, да, мы не делаем этого со снимками. Это все довольно далеко от нормы - я просто хочу, чтобы моментальные снимки работали, как описано в Ivy docs, что может означать, что он работает только с ibiblio. - person Ed Staub; 22.01.2013
comment
AFAICT это сухая дыра. Я не могу найти ничего, что указывало бы на то, что Ivy публикует maven-metadata.xml и множество электронных писем (и мои эксперименты с преобразователем ibiblio, настроенным, как вы предложили), наоборот. Я предполагаю, что вы используете ivy для чтения, а не для записи снимков. - person Ed Staub; 22.01.2013
comment
@EdStaub Это первое упоминание об использовании ivy для публикации снимков в Artifactory ... Вы заявили, что проблема заключалась в разрешении или чтении файлов. Есть несколько известных проблем с правильной поддержкой моментальных снимков, когда вы не используете стандартный клиент Maven... Я обновлю свой ответ некоторыми ссылками. - person Mark O'Connor; 22.01.2013
comment
Ну, я сказал, что мы вообще не использовали Maven, и что не было ни poms, ни метаданных... Думаю, это было недостаточно ясно. Сообщение Тима О'Брайена: да, Ivy не поддерживает публикацию снимков с отметками времени. Согласно документу, он должен использовать дату последнего изменения для проверки устаревания. Re useMavenMetadata: это даже не поддерживаемый тег в преобразователях URL-адресов, потому что они вообще не ищут метаданные maven. Я полагаю, я мог бы попробовать резольвер ibiblio с ним. - person Ed Staub; 22.01.2013
comment
@EdStaub Я сдаюсь ... Мой прощальный совет: не используйте снимки. Как я постоянно указываю, они представляют собой репозиторий Maven (на стороне сервера). Если вы хотите использовать их из ivy, вы должны понимать, как репозитории Maven структурируют свои данные. - person Mark O'Connor; 22.01.2013

После нескольких дней борьбы...

Проблема заключалась в том, что для

checkmodified="true" changingMatcher="regexp"

чтобы работать с ‹resolver>, он должен быть на каждом распознавателе в строке иерархии — все родительские ‹chain> распознаватели и ‹url>, ‹local> или ‹ibiblio> распознаватель в Нижний.

person Ed Staub    schedule 25.01.2013
comment
Большое спасибо за эту подсказку! Я обнаружил, что явное changing="true" на зависимости также приносит исправление, но этот обходной путь лучше. К сожалению, checkmodified="true" в цепочке распознавателя увеличивает общее время извлечения из-за дополнительных сетевых обращений в оба конца для того, чтобы не изменять артефакты из других репозиториев. Это побудило меня вообще избегать использования преобразователя цепочки как stackoverflow.com/questions/9426357/apache-ivy- тег-цепочка предлагает. Это ускорило извлечение, а также эффективно устранило рассматриваемую проблему и необходимость ее обходного пути. - person Vadzim; 06.11.2013