Отдельно публиковать вложения 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.

Другие вопросы по тегам