Как получить версию, artifactId, пакет артефакта, созданного на Hudson

#shell #maven #continuous-integration #hudson #artifacts

#оболочка #maven #непрерывная интеграция #хадсон #артефакты

Вопрос:

После сборки артефакта я выполняю скрипт в качестве действия после сборки для развертывания артефакта. Итак, я пытаюсь прочитать местоположение, в котором он создан.Переменные среды, доступные в Hudson, не дают мне достаточной информации об artifactId, версии, packageType артефакта.

Итак, кто-нибудь может мне помочь в том, как получить значения для них….

Заранее спасибо

Ответ №1:

Все артефакты, созданные Maven, содержат записи META-INF, которые содержат эту информацию. Прочитайте их как JarFile:

 JarFile jf = new JarFile(path/to/artifact);
JarEntry propsEntry = jf.getJarEntry("META-INF/maven/pom.properties");
Properties props = new Properties();
props.load(jf.getInputStream(propsEntry));
// retrieve the values:
String groupId = props.get("groupId");
String artifactId = props.get("artifactId");
String version = props.get("version");
  

Комментарии:

1. Спасибо за ответ, мой вопрос к Hudson, как прочитать эти значения?? т.е., как только вы создадите артефакт, он будет заархивирован в некотором местоположении, например, в ${BUILD_URL}artifact/hudson_${NODE_NAME}_{JOBNAME}/com/xyz /target/ {artifactId}-{version}-{packagetype}. итак, мне нужно указать идентификатор артефакта, версию, packagetype, чтобы получить артефакт. Я не хочу, чтобы пользователь вводил значения AVP, вместо этого я хочу, чтобы они считывались из файла конфигурации HUDSON.

2. О, извините, думал, вы пишете плагин Hudson. Однако в сценарии оболочки вам придется сделать практически то же самое: распаковать файл pom.properties из JAR / WAR и прочитать его. Но я не могу особо помочь вам с деталями. Попробуйте добавить shell или bash к тегам вопроса

3. Мой вопрос к Hudson, как прочитать эти значения?? т.Е., как только вы создадите артефакт, он будет заархивирован в некотором местоположении, например, в $ {BUILD_URL}artifact/hudson_${NODE_NAME}_{JOBNAME}/com/xyz /target/ {artifactId}-{version}-{packagetype}. итак, мне нужно указать идентификатор артефакта, версию, packagetype, чтобы получить артефакт. Я не хочу, чтобы пользователь вводил значения AVP, вместо этого я хочу, чтобы они считывались из файла конфигурации HUDSON.

Ответ №2:

Возможно, я совершенно неправильно понял ваш вопрос, но есть ли причина не извлекать артефакт через файловую систему и переменную среды WORKSPACE, ${WORKSPACE}/target/...

Комментарии:

1. Спасибо за ответ, да, я могу использовать $ {WORKSPACE}/target / вместо $ {BUILD_URL}artifact/hudson_${NODE_NAME}_{JOBNAME}/com/xyz/target/

2. рассмотрим в POM моего артефакта, о котором я упомянул эти подробности <groupId> com.xyz</groupId> <artifactId>sampleapplication</artifactId> <packaging>war</packaging> <version>1.1.1</version> поэтому, когда я выполняю сборку Hudson, генерируемый файл war будет {WORKSPACE} / target / sampleapplication-1.1.1-war. Мой вопрос заключается в том, что если пользователь не перейдет в рабочее пространство, которое он не будет знать имя сгенерированного файла war (т. е. sampleapplication-1.1.1-war), Так есть ли какой-либо способ, которым я мог бы получить имя сгенерированного файла war ({artfactId}-{version}-{packaging})??

Ответ №3:

Вы можете использовать http://${BUILD_URL}/job/${JOBNAME}/${BUILDNUMBER}/api/xml?xpath=//artifact/fileName/text() и установить это в переменную среды. Это работает, только если у вас есть 1 артефакт, если у вас их больше, тогда вам нужно будет выполнить дополнительный синтаксический анализ.