【发布时间】:2017-06-13 17:54:30
【问题描述】:
我让 Jenkins 在 CentOS 服务器上运行,我正在尝试设置一个在 git 项目上运行 mvn clean install 的作业。由于我想为我的整个服务器使用全局 maven 存储库,因此我正在设置我的项目以使用 Jenkins 主页之外的路径中的设置文件运行 maven:
运行构建时,Jenkins 找不到该 settings.xml 文件:
...
[workspace] $ /var/lib/jenkins/tools/hudson.tasks.Maven_MavenInstallation/Maven_3.0.4/bin/mvn -f firma-digital-service/pom.xml -s /home/dcalderon/.m2/repository/settings.xml -X clean package
Apache Maven 3.0.4 (r1232337; 2012-01-17 03:44:56-0500)
Maven home: /var/lib/jenkins/tools/hudson.tasks.Maven_MavenInstallation/Maven_3.0.4
Java version: 1.8.0_121, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.121-0.b13.el7_3.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-123.4.2.el7.x86_64", arch: "amd64", family: "unix"
[INFO] Error stacktraces are turned on.
[ERROR] Error executing Maven.
java.io.FileNotFoundException: The specified user settings file does not exist: /home/dcalderon/.m2/repository/settings.xml
at org.apache.maven.cli.MavenCli.settings(MavenCli.java:681)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:193)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
Build step 'Invoke top-level Maven targets' marked build as failure
Finished: FAILURE
当 Jenkins 通过命令行运行完全相同的命令时,一切正常,这表明该文件确实存在于服务器中。我究竟做错了什么?这是关于用户限制的问题吗?
【问题讨论】:
-
在控制台运行时是否使用相同的 settings.xml 文件?用户 Jenkins 可读的文件是否正在运行?
-
第一个问题:是的,我使用 -s 参数指定了哪个 settings.xml 文件。第二个问题:这是我不确定的,我怎么知道 Jenkins 正在运行哪个用户?我用 dcalderon 调用 sudo service start jenkins。
-
"ps -ef" 应该告诉你哪个用户正在运行 jenkins 进程。鉴于您使用 sudo 运行它,我猜它会是 root。您的错误消息非常明确,因此我将检查 .m2 文件夹的权限,并可能尝试对其进行 chmod a+x 以查看是否有帮助。 (不过,root 可以在 Ubuntu 上的我的 linux 用户家中查看 '700' 目录,所以我不确定这是你的问题。)
-
通常 jenkins 不会以 root 身份运行。猜猜这就是问题所在,用户拥有对文件的 noch 访问权限。
-
在 Jenkins 中处理此问题的最佳方法是使用配置文件提供程序插件并在那里定义适当的 settings.xml 文件并从那里使用它,不要依赖文件中的文件系统