1

我正在多个平台(Mac 和 Windows)上构建 NAR。构建很复杂,无法通过 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 

但是,由于构建在不同的盒子上运行,发布步骤不能一次性完成。理想情况下,我希望能够在构建完成时将附件“附加”到主要工件。IE。,

运行一次:

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 

当然,第一个命令工作正常。但是这两个 build slave 命令失败了

The parameters 'file' for goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy-file are missing or invalid

因为它认为它需要初级神器。

如何指定我要附加到出版物,而不是创建一个全新的出版物?

4

1 回答 1

2

因为构建在不同的盒子上运行,发布步骤不能一次性发生。

如果您使用像 Jenkins 这样的 CI 服务器来执行构建,您可以从每个从属节点发布工件,然后通过主节点上的下游作业访问它们。

这就是我们在ImageJ项目中解决问题的方法:我们让Jenkins聚合所有构建工件,然后一次性部署它们。首先,ImageJ-launcher作业(一个多配置项目)使用适当的从站构建代码,归档相关工件(将它们传输到主节点的文件系统)。然后ImageJ-launcher-deploy作业将存档的工件从每个配置复制到一个目录中,以便一次性部署。

如果有帮助,这里是ImageJ-launcher-deploy负责将 NAR 工件复制到一个位置的 shell 脚本部分:

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-launcher Jenkins 配置的更多详细信息,另请参阅此答案

于 2014-10-28T19:47:59.283 回答