Отдельно публиковать вложения Maven
Я строю NAR на нескольких платформах (Mac и Windows). Сборка сложна и не может быть выполнена с помощью плагина Maven NAR как такового, но я сам собираю файлы nar и использую mvn
инструмент командной строки для развертывания.
Типичный способ развертывания - один выстрел, например
mvn deploy:deploy-file \
-Dfile=foobar.jar \
-Dpackaging=jar \
-Dfiles=foobar-x86_64-MacOSX-gcc-shared.nar,foobar-x86_64-Windows-MSVC-shared.nar \
-Dclassifiers=x86_64-MacOSX-gcc-shared,x86_64-Windows-MSVC-shared \
-Dtypes=nar,nar \
-DgroupId=com.example \
-DartifactId=foobar \
-Dversion=1.0.0-SNAPSHOT \
-Durl=$URL \
-DrepositoryId=nexus
Однако, поскольку сборки выполняются на разных блоках, шаг публикации не может быть выполнен за один раз. В идеале я хотел бы иметь возможность "добавлять" вложения к основному артефакту по окончании сборки. то есть.,
Запустите это один раз:
mvn deploy:deploy-file \
-Dfile=foobar.jar \
-Dpackaging=jar \
-DgroupId=com.example \
-DartifactId=foobar \
-Dversion=1.0.0-SNAPSHOT \
-Durl=$URL \
-DrepositoryId=nexus
Затем на Маке построить раб:
mvn deploy:deploy-file \
-Dfiles=foobar-x86_64-MacOSX-gcc-shared.nar \
-Dclassifiers=x86_64-MacOSX-gcc-shared \
-Dtypes=nar \
-DgroupId=com.example \
-DartifactId=foobar \
-Dversion=1.0.0-SNAPSHOT \
-Durl=$URL \
-DrepositoryId=nexus
Затем на Windows сборка ведомого:
mvn deploy:deploy-file \
-Dfiles=foobar-x86_64-Windows-MSVC-shared.nar \
-Dclassifiers=x86_64-Windows-MSVC-shared \
-Dtypes=nar \
-DgroupId=com.example \
-DartifactId=foobar \
-Dversion=1.0.0-SNAPSHOT \
-Durl=$URL \
-DrepositoryId=nexus
Первая команда работает нормально, конечно. Но две команды сборки ведомого терпят неудачу с
The parameters 'file' for goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy-file are missing or invalid
потому что он думает, что ему нужен первичный артефакт.
Как мне указать, что я добавляю публикацию, а не создаю совершенно новую?
1 ответ
поскольку сборки выполняются на разных блоках, шаг публикации не может быть выполнен за один раз.
Если вы используете CI-сервер, такой как Jenkins, для выполнения ваших сборок, вы можете опубликовать артефакты от каждого ведомого устройства и затем получить к ним доступ через нижестоящее задание на главном узле.
Вот как мы решаем проблему в проекте ImageJ: наш Jenkins объединяет все артефакты сборки, а затем развертывает их все сразу. Во-первых, задание ImageJ-launcher - проект с несколькими конфигурациями - создает код с использованием соответствующих ведомых устройств, архивируя соответствующие артефакты (которые передают их в файловую систему главного узла). Затем задание http://jenkins.imagej.net/job/ImageJ-launcher-deploy/ копирует заархивированные артефакты из каждой конфигурации в один каталог для развертывания за один раз.
В случае, если это помогает, вот часть ImageJ-launcher-deploy
Сценарий оболочки, отвечающий за копирование артефактов NAR в одно место:
masterDir=workspace/label/master/target &&
axesDirs=configurations/axis-label/*/builds/$buildNumber/archive/target &&
: copy the nar/**/* files from all axes to master &&
for path in $axesDirs/nar/*/bin/*/*
do
file=${path#$axesDirs/} &&
if test -f $masterDir/$file
then
# we ignore everything except Linux in the master
case "$path" in
*/master/*Linux*)
;;
*/master/*)
continue
;;
esac
cmp $path $masterDir/$file && continue
printf 'Artifacts disagree:\n%s\n%s\n\n' $path $masterDir/$file
errors=$(($errors+1))
else
target=$masterDir/$file &&
mkdir -p ${target%/*} &&
cp $path $target
fi
done
Вам может даже не понадобиться копировать артефакты, если -Dfiles
поддерживает список файлов в разных каталогах - просто создайте список файлов в for
цикл и закончить с mvn deploy:deploy-file
вызов, который вы дали выше.
См. Также этот ответ для получения дополнительной информации о конфигурации ImageJ-запуска Jenkins.