我在Jenkins流水线中有这个阶段:
stage('Build') {
def mvnHome = tool 'M3'
sh '''for f in i7j-*; do
(cd $f && ${mvnHome}/bin/mvn clean package)
done
wait'''
}
在 Jenkins » 管理 Jenkins » 全局工具配置 中,我有一个名为 M3
版本为 3.3.9
的 Maven 安装。
当运行此流水线时,mvnHome
为空,因为日志中出现了这个:
+ /bin/mvn clean install -Dmaven.test.skip=true
/var/lib/jenkins/jobs/***SNIP***/script.sh: 3: /var/lib/jenkins/jobs/***SNIP***/script.sh: /bin/mvn: not found
我在 Jenkins 服务器上找到了一个路径/var/lib/jenkins/tools/hudson.tasks.Maven_MavenInstallation/M3
,可以使用,但我希望不要在脚本中使用硬编码的mvn路径。
如何解决这个问题?
编辑: 这个答案建议使用tool
和withEnv
来解决这个问题。
我的可工作代码现在是:
stage('Build') {
def mvn_version = 'M3'
withEnv( ["PATH+MAVEN=${tool mvn_version}/bin"] ) {
sh '''for f in i7j-*; do
(cd $f && mvn clean package -Dmaven.test.skip=true -Dadditionalparam=-Xdoclint:none | tee ../jel-mvn-$f.log) &
done
wait'''
}
}
for
循环中的每个项目启动一个单独的子 shell,并使用&
将该子 shell 发送到后台,以便并行运行。wait
命令告诉脚本等待所有子 shell 完成。通过并行运行它们,该阶段的平均时间从 54 秒缩短到了 27 秒。输出现在被合并到一个文件中,可能的改进是将每个子 shell 的输出输出到单独的文件中。 - Amedee Van Gasse