有没有办法改变Jenkins Maven构建的工作目录?

33

有没有办法改变Jenkins Maven构建的工作目录?

使用场景

有一个Maven构建,只有在当前工作目录是包含pom.xml文件的目录时才能正常工作,因此我希望Maven构建在该目录中执行。

pom.xml所在的目录位于git项目的子目录中。

9个回答

13

创建一个目标以检出父目录。

  • 检出构建目标的父目录
  • 设置Build -> Goal = clean
  • 运行build并确定目标工作空间目录 (控制台输出的第二行,我的示例是 /var/lib/jenkins/workspace/my_project)

创建一个目标以构建你的路径

  • 不要勾选"在构建开始前删除工作空间"
  • 在Build -> Advanced中-勾选"更改工作空间文件夹"并粘贴您的/yourtargetdirectory

对我有效。


6
我在 Jenkins ver. 1.605 中没有看到“更改工作区文件夹”的选项。 - Erez Cohen
@rogerdpack,不确定我是否理解了你的问题,但不,这不是手动复制(当然你会复制路径,但不是文件),它只是对完整项目工作区内文件夹的引用。 - ton
那么你在本质上是要创建两个不同的Jenkins“项目”吗? - rogerdpack

11

不确定此功能是何时添加的,但对于我面前的Jenkins(根据页面底部,Jenkins ver. 1.627),现在有一个选项可以定义根pom.xml的位置(帮助消息说:

如果您的工作区中顶层pom.xml位于其他位置而不是第一个模块的根目录中,请在此处指定路径(相对于模块根目录),例如parent/pom.xml。 如果留空,则默认为pom.xml。

)。我曾经遇到同样的问题,但后来意识到答案就在我的面前(请注意,我不必像Hua2308建议的那样点击高级选项,这可能是因为他们更改了用户界面)。


在我的情况下,我尝试了这个选项,但似乎没有起作用。后来发现我有一个自定义的“后构建”步骤,它从根目录构建了所有内容,而最初的构建是正常工作的。因此,提醒自己:如果您使用此选项,请在手动构建步骤中添加“-f XXX”。 :) - rogerdpack
OP 询问了 CWD。这个答案并不能解决项目层次结构编写不良的问题,其中运行 mvn -f submodule/pom.xmlcd submodule && mvn 会产生不同的结果(例如:由于 poms 中的相对路径,只有一种方式有效)。Jenkins Maven 和 Freestyle 作业似乎没有提供改变工作目录的方法,而 Pipeline 是唯一的解决方案。请注意,Maven 和 Freestyle 作业以不同的方式执行 mvn -f submodule/pom.xml - 具体来说是在不同的目录中。 - Akom

5

以下是我使用的方法。在“调用顶级Maven目标”构建步骤中,有一个“高级…”按钮。如果您单击此按钮,可以指定POM.xml文件的相对路径。这将确保您仅在子目录中构建所需的项目。


也许你是在指这里构建预步骤?那就是我找到选项的地方(无论如何,可以参考Foon的答案了解如何在非预步骤中执行...) - rogerdpack

2
你可以使用Maven的-f选项
-f,--file <arg>    Force the use of an alternate POM file (or directory with pom.xml).

例如,如果您的项目有以下结构:
README.md
sources
|----pom.xml
|----services
|    |----pom.xml
|    +----src
|----webservices
|    |----pom.xml
|    +----src
+----....
useful
docs

然后您可以在“调用顶级Maven目标”中使用Goals:
-f sources/pom.xml clean install

2
这不会改变工作目录;作为Maven构建的一部分运行的脚本假定当前工作目录是包含pom.xml文件的目录。 - Max Nanasy
这完全没有回答问题。它回答了一个问题,但不是所问的问题... - Jasper
这就是Foon的回答的要点(除了它被添加到所有阶段,例如:Sonar后构建,因此您不必担心手动在许多地方添加它)。而且它对我起作用了 :) - rogerdpack

2
我来这里是因为我遇到了同样的问题,我使用的Hudson / Jenkins版本也有同样的问题,它不允许在调用maven之前设置工作目录。
解决方法是配置一个具有所需工作目录的参数,创建一个新的命令“mvn”,使其更改目录,然后使用所有参数调用maven的原始命令“mvn”。
以下是要遵循的步骤:
1. 在项目中应该注意到需要对项目进行参数化,我的情况下创建了参数WORKING_DIRECTORY,值为${WORKSPACE}/maven,其中“maven”是将成为工作目录的子文件夹。
2. 创建一个“自定义”版本的maven以修改“mvn”命令:
cp -ip /opt/apache-maven-3.5.4 /opt/maven_custom
mv /opt/maven_custom/mvn /opt/maven_custom/mvn_original
vi /opt/maven_custom/mvn:
-- 新mvn命令内容 --
cd $WORKING_DIRECTORY
/opt/maven_custom/bin/mvn_original "$@"
-- 新的 mvn 命令内容结束 --
chmod ugo+x /opt/maven_custom/mvn
3. 在 hudson/Jenking 中添加新的 maven_custom: Hudson 管理员 --> 系统配置 --> Maven --> 添加 Maven
4. 在项目中使用自定义的 Maven。
通过这些更改,Maven 在不同的工作目录中运行。

1
当子目录是父根的直接子级时,您可以使用mvn --projects,因为它会进入子目录。这里有一个证明(参见最后一行):
U:\git\ics-VCCUSTOM-422>mvn --projects icsIntegrationTest clean verify
[INFO] Scanning for projects...
[INFO]
[INFO] ---------------< com.afklm.vccustom:icsIntegrationTest >----------------
[INFO] Building icsIntegrationTest 13.3.4-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ icsIntegrationTest ---
[INFO] Deleting U:\git\ics-VCCUSTOM-422\icsIntegrationTest\target
[INFO]
[INFO] --- buildnumber-maven-plugin:1.3:create (default) @ icsIntegrationTest ---
[INFO] ShortRevision tag detected. The value is '7'.
[INFO] Executing: cmd.exe /X /C "git rev-parse --verify --short=7 HEAD"
[INFO] Working directory: U:\git\ics-VCCUSTOM-422\icsIntegrationTest

1

进入您的Maven项目配置,然后:

构建 > 点击“高级”按钮 > 勾选“使用自定义工作区” > 设置目录

(我正在使用Jenkins版本1.508)


1
你是指的高级项目选项 > 使用自定义工作区吗?如果是的话,根据文档所述,“这是代码检出和构建发生的目录”,这并不能解决我在子目录中设置工作目录进行构建的需求。 - Max Nanasy

0

解决方案:

cd subfolder; mvn -f ../pom.xml task

Maven没有提供另一种方式来做到这一点,也就是说,对于这种用例来说,明显更合理的方式,可能是因为Maven讨厌你。


0

我们使用的Jenkins是德语版,所以我在猜测选项的翻译。

前往您的项目配置,然后进入增强项目配置(它是第二个部分)并展开它。最后一点应该是类似于“更改工作区文件夹”的东西。我想那可能是您正在寻找的。

否则,您总可以到构建选项中更改pom.xml的路径。


A. 更改工作区文件夹 会更改项目下载的文件夹,而不是执行Maven构建的进程的工作目录。B. 无论构建哪个pom.xml文件,工作目录都是工作区顶层目录。 - Max Nanasy
嗯,好的。抱歉我没能帮上忙。 - André Stannek

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