无法在 Jenkins 中运行程序“gradle”

Posted

技术标签:

【中文标题】无法在 Jenkins 中运行程序“gradle”【英文标题】:Cannot run program "gradle" in Jenkins 【发布时间】:2012-01-28 15:01:34 【问题描述】:

我已经为 Jenkins 安装了 Gradle 插件。当我尝试构建项目时,出现以下错误:

[workspace] $ gradle clean -b build/build.gradle
FATAL: command execution failed
java.io.IOException: Cannot run program "gradle" (in directory "/Users/Shared/Jenkins/Home/jobs/test/workspace"): error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:460)
    at hudson.Proc$LocalProc.<init>(Proc.java:244)
    at hudson.Proc$LocalProc.<init>(Proc.java:216)
    at hudson.Launcher$LocalLauncher.launch(Launcher.java:707)
    at hudson.Launcher$ProcStarter.start(Launcher.java:338)
    at hudson.Launcher$ProcStarter.join(Launcher.java:345)
    at hudson.plugins.gradle.Gradle.performTask(Gradle.java:201)
    at hudson.plugins.gradle.Gradle.perform(Gradle.java:97)
    at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:19)
    at hudson.model.AbstractBuild$AbstractRunner.perform(AbstractBuild.java:695)
    at hudson.model.Build$RunnerImpl.build(Build.java:178)
    at hudson.model.Build$RunnerImpl.doRun(Build.java:139)
    at hudson.model.AbstractBuild$AbstractRunner.run(AbstractBuild.java:465)
    at hudson.model.Run.run(Run.java:1404)
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
    at hudson.model.ResourceController.execute(ResourceController.java:88)
    at hudson.model.Executor.run(Executor.java:238)
Caused by: java.io.IOException: error=2, No such file or directory
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:53)
    at java.lang.ProcessImpl.start(ProcessImpl.java:91)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:453)
    ... 16 more
Build step 'Invoke Gradle script' changed build result to FAILURE
Build step 'Invoke Gradle script' marked build as failure
Finished: FAILURE

从命令行运行任务$ gradle clean -b build/build.gradle 可以正常工作。

【问题讨论】:

你确定 Jenkins 有正确的 gradle 路径吗?我没有可用的构建机器,但我认为您必须为 gradle 插件配置 gradle home 路径。 它和我的 .profile 中的路径相同 “没有这样的文件或目录”很清楚。 Jenkins 找不到 gradle 可执行文件。可能它不在运行 Jenkins 作业的操作系统用户的路径上。无论如何,我建议在 CI 机器上使用 Gradle Wrapper。 目前使用 Gradle Wrapper 并不是一个真正的选择,至少在构建过程中涉及从属设备时不会:issues.jenkins-ci.org/browse/JENKINS-9538 作为对上述内容的更新,根据引用的票证,从 Jenkins 1.464 和 Gradle Plugin 1.16 开始,该问题已得到解决,因此即使在 Jenkins slaves 中,包装器也应该再次成为构建的最佳选择. 【参考方案1】:

我有同样的问题,发现对我来说问题是项目配置中的 gradle 版本。它设置为 Default,当我将其设置为我在 Manage Jenkins > Configuration Options 的插件配置中指向的 gradle 版本时, 它找到了 gradle 并且工作正常。

这是一个难以调试的问题,我希望这可以节省其他人一些时间。

【讨论】:

是的,我的测试是这种情况,选择 Gradle 版本的下拉框被隐藏了,我必须明确选择 Gradle 版本单选按钮才能显示,我认为这是一个错误。选择 Gradle 版本(默认除外)后,它工作正常。谢谢。 如何显式输入或选择实际的 gradle 版本?它不允许我选择除默认值之外的任何其他内容 你真的不应该这样做 - 改用 Gradle Wrapper,它可以为你省去很多麻烦。看我的回答。 gradle 配置现在在 Manage Jenkins -> Global Tool Configuration【参考方案2】:

Mastering_the_Object 指出的解决方案也对我有用,只是为了澄清那里的步骤: 仅仅在 Jenkins 中安装 Gradle 插件是不够的,你还必须去: Jenkins->管理 Jenkins->配置 Jenkins->配置系统。 在“Gradle Installations”下输入名称(它在项目配置中显示为版本),选中“自动安装”并选择版本。然后您可以在项目配置中选择“Gradle 版本”。

【讨论】:

+1 用于指出如何找到配置位置的解决方案。看过很多更改设置的建议,但没有人说在哪里可以找到它。 @pad 这对我也有帮助。谢谢。【参考方案3】:

我在使用 Gradle 包装器时遇到了这个错误,能够修复我损坏的构建,如下所示:

    转到Manage Jenkins -> Global Tool Configuration -> Gradle -> Add Gradle,给它起个名字 转到 Jenkins ->(您的工作)-> 配置 -> 构建,选择“Invoke Gradle”并将 Gradle 版本从(默认)更改为指定版本

【讨论】:

【参考方案4】:

在 Jenkins 等 CI 机器上运行 Gradle 时,使用 Gradle Wrapper 最为方便。

在你的开发机器上,站在你的项目根目录并运行

gradle wrapper

然后,将生成的文件签入您的源代码控制系统。之后,如果您需要更改 Gradle 版本,则无需在 Jenkins 服务器上安装任何东西。只需像这样配置您的 Jenkins 作业:

引用Gradle User Guide:

通过将包装器与您的项目一起分发,任何人都可以使用它 无需事先安装 Gradle。更好的是,用户 保证构建使用构建的 Gradle 版本 旨在与之合作。当然,这也很适合 持续集成服务器(即定期构建您的 项目),因为它不需要在服务器上进行配置。

【讨论】:

这对几乎所有企业来说都不是一个合理的建议。重要的是我们信任我们的人工制品的来源,因此大多数企业使用内部存储库。 GradleW 仅在可以访问 Internet 时才有效。我并不是说这在其他环境中不合理,我只是指出它在企业中可能行不通。 不是这样。包装器对您提供的任何 URL 都很满意,因此它不需要 Internet 访问。我们在 Artifactory 服务器中有一个 Gradle 的本地缓存副本(任何 HTTP 服务器都可以)。 gradle-wrapper.properties 需要指向内部 URL 而不是官方 repo。这也减轻了官方服务器的负担,并为我们的本地用户提供了更好的构建速度。首次下载包装器后,您无需网络连接即可在您的 PC 上构建 - 并且 CI 机器可以持续访问我们的本地存储库。 使用包装器确实是一个更好的解决方案,因为您不需要为匹配 jenkin 的全局配置和项目配置中的版本而做所有艰苦的工作。简单多了! 在完成这项工作时,您最终会在您将处理的每个项目上拥有大小约为 200mb 的包装文件夹,这非常浪费磁盘空间。【参考方案5】:

jenkins 找不到 gradle 可执行文件。我从来没有让 gradle wrapper 工作。请按照以下步骤操作:

下载gradle(http://gradle.org/downloads), 解压到例如 /usr/local/lib/gradle , 打开 /etc/profile 并添加以下两行: 导出 GRADLE_HOME=/usr/local/lib/gradle 导出 PATH=$PATH:$GRADLE_HOME/bin

它适用于my jenkins installation。

ps。我回答了这个老问题,因为这是使用 jenkins 设置 gradle 时的常见问题。我之前花了一些时间试图让 gradle 包装器工作但没有成功。

【讨论】:

我已经在 bash_profile 下设置了 gradle_home,对我来说仍然是同样的问题【参考方案6】:

在这里使用了@Skarab 和其他一些解决方案来让它工作。

下载 gradle (http://gradle.org/downloads), 将其解压缩到例如 /usr/local/lib/gradle , 打开 /etc/profile 并添加以下两行: 导出 GRADLE_HOME=/usr/local/lib/gradle 导出 PATH=$PATH:$GRADLE_HOME/bin

然后在 Manage Jenkins > Configure system > Gradle 下,定义 GRADLE_HOME 并为该 gradle 安装命名

然后,这可能是项目的一个错误,将 gradle 版本从 Default 更改为我上面定义的版本

【讨论】:

【参考方案7】:

正如其他人所说,这是因为 Jenkins 找不到 gradle 可执行文件。

没有一个已发布的解决方案对我有用,但我能够通过将 gradle bin 目录添加到 .bashrc 中为构建从站上的构建帐户设置的路径来解决问题。修改.profile失败,jenkins节点配置中设置PATH也失败。

有些帖子会建议在工具菜单中设置 gradle 路径,但那里也没有可用的 gradle 条目(可能是由于 gradle 插件中的回归/设计更改?)。

无论如何,我发现的最好的测试(没有再次运行构建并观察失败)是通过 ssh 运行 env

ssh <host> env

并检查以这种方式定义的 PATH 变量;如果 gradle 不在该路径中,您可能无法从 jenkins 运行它。

【讨论】:

以上是关于无法在 Jenkins 中运行程序“gradle”的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins使用Gradle守护程序构建失败

Jenkins 使用 Gradle 守护进程构建失败

为啥我的 Spring Boot Web 应用程序无法在 Gradle 中完全运行?

如何将丢失的 gradle-wrapper.jar 添加回 Git 存储库以供 Jenkins 完成其工作

如果没有用户登录,则无法通过Jenkins运行COM应用程序

Jenkins 管道 sh 在 Windows 上因“无法运行程序 nohup”而失败