Как мне получить имя Maven Jar как часть работы в Хадсоне?
У меня настроена работа Maven 3 на моем сервере Hudson.
Когда сервер Hudson успешно создает JAR-файл Maven, этот Jar-файл развертывается в хранилище SCP на другом сервере.
Я хочу выполнить скрипт relink.sh на удаленном хосте, где одним из параметров является имя только что доставленного файла jar (например, /usr/bin/relink.sh myproject-0.0.2-SNAPSHOT.jar).
Как мне передать имя файла / версии на основе Maven в переменную, которую я затем могу использовать в своем вызове Hudson для выполнения удаленного скрипта?
3 ответа
Как предположил @zerodiff, кажется, есть несколько способов сделать это с помощью Hudson, но все они кажутся хрупкими и сложными в управлении при управлении большим количеством проектов. Вместо этого я использовал плагин Maven's wagon для реализации развертывания через Maven, а не через Hudson.
Конфигурация, которую я использовал в проектах maven:
<properties>
<!-- Deploy -->
<dev.server.hostname>192.168.1.1</dev.server.hostname>
<application.name>test-application</application.name>
<!-- Deploy -->
</properties>
<build>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ssh</artifactId>
<version>1.0</version>
</extension>
</extensions>
</build>
<profiles>
<profile>
<id>hudson</id>
<activation>
<property>
<name>env</name>
<value>hudson</value>
</property>
</activation>
<build>
<filters>
<filter>src/main/filters/${env}-linux.properties</filter>
<filter>src/main/filters/${env}.properties</filter>
</filters>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>wagon-maven-plugin</artifactId>
<version>1.0-beta-5</version>
<executions>
<execution>
<id>dev-deploy</id>
<phase>deploy</phase>
<goals>
<goal>upload</goal>
</goals>
<configuration>
<fromDir>${project.build.directory}</fromDir>
<includes>${project.build.finalName}.jar</includes>
<url>scp://${dev.server.hostname}/</url>
<toDir>/opt/${application.name}</toDir>
<serverId>dev-deploy-server</serverId>
</configuration>
</execution>
<execution>
<id>execute-dev-deploy-commands</id>
<phase>deploy</phase>
<goals>
<goal>sshexec</goal>
</goals>
<configuration>
<url>scp://${dev.server.hostname}/</url>
<serverId>dev-deploy-server</serverId>
<commands>
<command>sudo /etc/init.d/${application.name} stop</command>
<command>sleep 2</command>
<command>sudo /opt/${application.name}/relink.sh ${project.build.finalName}.jar</command>
<command>sudo /etc/init.d/${application.name} start</command>
</commands>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
В моем maven settings.xml у меня есть учетные данные для dev-deploy-server:
<server>
<id>dev-deploy-server</id>
<username>hudson_bot</username>
</server>
С плагином Maven в Гудзоне я добавил директиву сборки Invoke Maven 3 и:
- Цели: чистое развертывание
- Свойства: env=hudson
Наконец, я настроил защиту между двумя серверами, чтобы "hudson_bot" мог перейти на dev-deploy-server и дал hudson_bot sudoer NO_PASSWD привилегии двум упомянутым сценариям в элементе ssh execute.
Я не уверен, что вы можете или не можете передать переменную, но временным решением будет сначала скопировать файл в промежуточный каталог, а не туда, куда вы хотите его поместить. Затем ваш скрипт ищет в промежуточной директории файл и перемещает его:
STAGE_DIR=/path/to/stage
DEST_DIR=/path/to/dest
LINK=/path/to/link.jar
while read file; do
mv $file $DEST_DIR
ln -s -f $DEST_DIR/$(basename $file) $LINK
done < <( find $STAGE_DIR -name "myproject*SNAPSHOT.jar" )
Возможно, вы захотите выполнить некоторую проверку ошибок и выйти с ненулевым значением, если существует, например, несколько совпадающих файлов, нет файлов и т. Д. Вы решили проблему?
Вы хотите получить имя артефакта jar от самого Maven, чтобы предотвратить корректировку сценария, когда разработчики изменяют идентификатор или версию артефакта. Сканирование для *.jar
файлы не элегантны, так как они соответствуют больше, чем основной артефакт (например, *-javadoc.jar
). Таким образом, чтобы получить основную версию артефакта от Maven, я полагаюсь на 2 факта:
- по умолчанию плагин jar использует идентификатор и версию артефакта для финального артефакта jar, например
target/the-service-0.0.1-SNAPSHOT.jar
идентификатор артефакта, группа и версия хранятся в
pom.properties
$ cat target/maven-archiver/pom.properties #Generated by Apache Maven #Fri Jul 06 15:10:03 CEST 2018 version=0.0.1-SNAPSHOT groupId=net.company artifactId=the-service
Обратите внимание, что разработчики Java все еще могут изменить папку сборки по умолчанию target
и сломать свою работу Хадсон.