2014-10-27 5 views
0

Я создаю NAR на нескольких платформах (Mac и Windows). Сборка сложна и не может быть выполнена через плагин Maven NAR как таковой, но я сам создаю файлы nar и использую инструмент командной строки mvn для развертывания.отдельно публиковать вложения maven

Типичный способ развертывания - один снимок, например.

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 

Тогда на Mac построить ведомым:

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 

Первая команда работает отлично, конечно. Но две команды ведомого устройства не работают с

потому что он считает, что ему необходим первичный артефакт.

Как я могу указать, что я , добавив к публикации, не создавая совершенно новую?

ответ

1

потому что сборки работают на разных коробках, шаг публикации не может произойти за один выстрел.

Если вы используете CI-сервер, такой как Jenkins для выполнения своих сборок, вы можете публиковать артефакты из каждого подчиненного устройства, а затем обращаться к ним с помощью нисходящего задания на главном узле.

Так мы решаем проблему в проекте ImageJ: у нас есть our Jenkins совокупность всех артефактов сборки, а затем развернуть их все сразу. Во-первых, задание ImageJ-launcher - проект с несколькими конфигурациями - создает код с использованием соответствующих подчиненных устройств, архивируя соответствующие артефакты (который передает их в файловую систему главного узла). Затем задание ImageJ-launcher-deploy копирует архивные артефакты из каждой конфигурации в один каталог для развертывания одним выстрелом.

В случае это помогает, вот часть сценария ImageJ-launcher-deploy оболочки отвечает за копирование артефактов НАР в одном месте:

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, который вы указали выше.

См. Также this answer для получения дополнительной информации по конфигурации ImageJ-launcher Jenkins.

+0

Жаль, что Maven не позволяет добавлять артефакты. :(Но этот подход - лучший способ, учитывая ограничения. Спасибо! – paleozogt