Jenkins - 使用通配符执行shell命令

时间:2016-04-16 08:35:50

标签: java shell maven jenkins

我试图让Jenkins执行shell命令,但仍然允许使用通配符。以下是我试图参考的内容:

mvn deploy:deploy-file -Dpackaging=jar -DrepositoryId=snapshots -Durl=http://nexus.example.net/content/repositories/snapshots -DpomFile=Spigot/Spigot-Server/pom.xml -Dfile=Spigot/Spigot-Server/target/spigot-*.jar

我需要能够通过上面的命令部署这个jar,因为该项目的git存储库不是由我拥有或操作的,所以我需要能够将它直接部署到我自己的Nexus实例。为了确保它将支持编译jar的所有可能版本,我必须使用外卡。不幸的是,当Jenkins尝试执行命令时,它会逐字地采用通配符。我真的不确定如何解决这个问题,我将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:2)

如果它是一个简单的单个.jar文件,请尝试:

mvn deploy:deploy-file -Dpackaging=jar -DrepositoryId=snapshots -Durl=http://nexus.example.net/content/repositories/snapshots -DpomFile=Spigot/Spigot-Server/pom.xml -Dfile=$(find Spigot/Spigot-Server/target/ -name 'spigot-*.jar')

如果它是多个文件,那就有点复杂了:

当您要部署多个 maven deploy-file 参数文件分类器类型相同 (groupId,artifactId,version)下的工件 - 例如 .jar -sources.jar

即使对于该用例,语法也有些违反直觉 - 您必须使用 file = file1.jar 作为第一个工件,然后 files = file1 -sources.jar,file1-test-sources.zip,.. 用于休息,同时使用分类器/分类器(以及包装/类型)以相同的方式(位置)指定要上传的每个工件的分类器/类型。

如果您的用例上传不同版本的工件,则需要为每个版本执行一个maven部署文件调用

你也可以考虑一些替代方案:

  1. (取决于有多少工件,以及新工具的出现频率) - 手动上传这些工件到Nexus

  2. 让Nexus 代理另一个提供这些工件的Nexus存储库

答案 1 :(得分:1)

如果你的意思是你只想直接传递*,只需使用单引号来避免shell应用globbing:

mvn deploy:deploy-file [...] '-Dfile=Spigot/Spigot-Server/target/spigot-*.jar'

答案 2 :(得分:0)

如果您尝试部署多个文件,我认为使用Jenkins或bash命令时问题,但使用Maven Deploy Plugin

文档说明

file  File    -   File to be deployed.
User property is: file.

和 如果要部署额外的工件,请使用

files     String  -   A comma separated list of files for each of the
                    extra side artifacts to deploy. If there is a 
                    mis-match in the number of entries in types or
                    classifiers, then an error will be raised. 
User property is: files.

因此,如果您指定额外文件以使用其他filestypesclassifies参数明确部署,那将会更好,例如:/ p>

... -Dfile=Spigot/Spigot-Server/target/main-spigot.jar \
-Dfiles=$(ls -1d Spigot/Spigot-Server/target/spigot-*.jar | paste -sd ,) -Dtypes=... -Dclassifiers=...