Jenkins流水线中未设置Maven工具

14

我在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 安装。

全局工具配置 » 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路径。

如何解决这个问题?


编辑: 这个答案建议使用toolwithEnv来解决这个问题。

我的可工作代码现在是:

   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'''
        }
   }

你为什么要多次调用mvn,但只使用一个日志文件(jel-maven.log)? - khmarbaise
实际上看起来没问题。你能分享一下你的“全局工具配置”更改吗? - utkusonmez
我添加了一张截图,因为一张图片胜过千言万语。 - Amedee Van Gasse
@khmarbaise 这段代码来自一个现有的 shell 脚本,我正在将其移植到 Jenkins 上。它为 for 循环中的每个项目启动一个单独的子 shell,并使用 & 将该子 shell 发送到后台,以便并行运行。wait 命令告诉脚本等待所有子 shell 完成。通过并行运行它们,该阶段的平均时间从 54 秒缩短到了 27 秒。输出现在被合并到一个文件中,可能的改进是将每个子 shell 的输出输出到单独的文件中。 - Amedee Van Gasse
3个回答

13

您可以使用toolwithEnv片段在Jenkinsfile中使用您的工具。

应该像这样:

def mvn_version = 'M3'
withEnv( ["PATH+MAVEN=${tool mvn_version}/bin"] ) {
  //sh "mvn clean package"
}

我对Jenkinsfile不熟悉,以前从未使用过。我需要进行研究。据我了解,Jenkinsfile是每个代码库都有的吗?我在此流水线中有6个代码库。 - Amedee Van Gasse
1
Jenkinsfile只是将Jenkins Pipeline存储在版本控制系统中的方法。因此,如果您在Pipline脚本中拥有所有重要内容和所有后续操作都有步骤,您可以使用Jenkinsfile而不是在Jenkins Webgui中进行脚本编写。但是,在Jenkinsfile和Jenkins Webgui之间,命令和片段是相同的,因此您可以将上述内容用于解决问题。 - mszalbach
我使用 toolwithEnv 测试了解决方案,对我有效。接受答案。谢谢! - Amedee Van Gasse

11

最简单的方法应该是使用工具指令:

pipeline {
  agent any
  tools {
    maven 'M3'
  }
  stages {
    stage('Build') {
      steps {
        sh 'mvn -B -DskipTests clean package'
      }
    }
  }
}

M3 是在全局工具配置中预配置的名称,参见文档:https://jenkins.io/doc/book/pipeline/syntax/#tools


1
有没有办法使用Blue Ocean UI添加工具指令? - oche
我用了同样的方法,但是它说批处理命令中没有识别出mvn。 - learner

1
使用这个结构怎么样:

withMaven(mavenOpts: MAVEN_OPTS, maven: 'M3', mavenLocalRepo: MAVEN_LOCAL_REPOSITORY, mavenSettingsConfig: MAVEN_SETTINGS) {
    sh "mvn ..."
}

不行。groovy.lang.MissingPropertyException: No such property: MAVEN_OPTS for class: groovy.lang.Binding - Amedee Van Gasse
很遗憾,这个答案不起作用,因为在提问之前,这种构造是我在谷歌搜索时找到的最早的之一。 - Amedee Van Gasse
在管道脚本中,这些环境变量需要以 env. 为前缀,例如 withMaven(mavenOpts: env.MAVEN_OPTS, maven: 'M3', mavenLocalRepo: env.MAVEN_LOCAL_REPOSITORY, mavenSettingsConfig: env.MAVEN_SETTINGS) 或者 withMaven(mavenOpts: "${env.MAVEN_OPTS}", maven: 'M3', mavenLocalRepo: "${env.MAVEN_LOCAL_REPOSITORY}", mavenSettingsConfig: "${env.MAVEN_SETTINGS}") - David Newcomb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接