shell 无法识别 Gradle 包装器

时间:2020-12-24 14:01:26

标签: shell gradle gitlab gradlew

我有如下的 shell 脚本 -

enter image description here

由于 gradlew 位于项目根目录,因此它作为 ../gradlew clean 调用,比 backend_test.sh 文件高一级 -

enter image description here

但是 Gitlab ci 作业失败并出现以下错误 -

./test-runners/backend_test.sh: line 21: ../gradlew: No such file or directory

如果我也在根级别移动 backend_test.sh 并更新 shell 文件以将 gradlew 调用为 ./gradlew clean,则没有错误。当 backend_test.sh 不在根级别时,我做错了什么?

更新:

在本地运行 shell,即 ./backend_test.sh 出现以下错误 -

Configure project : 
Evaluating root project 'test-runners' using build file 
'/Users/tarunkumar/dev/git/system-test/test-runners/build.gradle'.
All  projects evaluated.

FAILURE: Build failed with an exception.

* What went wrong:
Task 'clean' not found in root project 'test-runners'.

为什么在 build.gradle 文件夹中查找 test-runner,即使它与 test-runner 处于同一级别?

1 个答案:

答案 0 :(得分:1)

所有相对路径都相对于当前工作目录进行评估。如果您使用的是 shell,工作目录通常会显示在您的 shell 提示符中。您的工作目录和当前处理的文件的目录之间没有链接。此行为说明了您的所有问题:


<块引用>

由于 gradlew 位于项目根目录下,因此它作为 ../gradlew clean 调用,比 backend_test.sh 文件高一级 -

在 CI 服务器上,通常使用根目录作为工作目录来调用所有进程(我不确定 GitLab CI,但我猜它的行为也是如此)。现在 ../gradlew 将相对于您的根目录进行评估,这将不起作用,因为它在 GitLab CI 用作临时文件夹的任何父目录中搜索 gradlew。您可以通过在本地将 shell 导航到您的项目目录然后调用 test-runners/backend_test.sh 来检查此行为,它应该会导致相同的错误。

<块引用>

如果我也在根级别移动 backend_test.sh 并更新 shell 文件以将 gradlew 调用为 ./gradlew clean,则没有错误。

当然,只要脚本将从您的项目目录中调用,这是 CI 服务器上的默认值,正如我们已经注意到的那样。在本地,您只需导航到您的项目目录并调用 backend_test.sh

<块引用>

在本地运行 shell,即 ./backend_test.sh 出现以下错误

好吧,现在我们又遇到了同样的问题。您的脚本可以找到 ../gradlew 并调用 Gradle,但遗憾的是,Gradle 将评估工作目录以查找相关的 build.gradle 文件。但是现在工作目录位于您的 test-runners 文件夹中,Gradle 将在此文件夹中搜索 build.gradle 文件。如果该文件夹中没有 build.gradle 文件,Gradle 根本不在乎,而是假设有一个空的 build.gradle 文件。现在 Gradle 使用这个(空)项目来运行构建,但是由于(空)项目中没有任务 clean,Gradle 失败了。

相关问题