当有多个进程对磁盘中的文件执行某些操作时(无论是 Jenkins 作业的工作区、Gradle 的缓存路径还是它创建的 Gradle build 文件夹),就会出现此问题这些进程正在尝试对文件执行某些操作并持有锁。
如果您有防病毒软件,您可能会看到这个。卸载可能会解决问题,但是你没有杀毒(如果你可以在杀毒中设置一些东西来定期扫描文件会更好)。
在我的情况下,这个问题仅在我有一个 Jenkinsfile 管道时出现,我在 parallel 中为 3-5 个项目运行 Gradle 任务(假设 Gradle 正在运行 rpm 任务或 @987654326 @task) 以及当我运行此管道的并发运行时。
如您所见,我的管道代码 (Jenkinsfile Pipeline DSL: How to Show Multi-Columns in Jobs dashboard GUI - For all Dynamically created stages - When within PIPELINE section) 正在创建动态阶段,当我在 pipeline 部分中调用它时,我使用 parallel 运行 N 号。项目(我可以在哈希/数组中定义)并行 gradle 任务。
我注意到的是,所有这些运行(并行运行)都使用我的用户 ID(或某些服务帐户)运行,并且它们都使用相同的 Gradle 版本(4.3.1 在我的case),因此它们使用相同的缓存。
单独并行运行它们——或者——更现实的情况是运行这个管道作业的多个管道运行(并行运行 5 个项目的 gradle 任务)可能会进入这个 LOCK 文件条件.
您可以通过设置唯一的GRADLE_USER_HOME="~${WORKSPACE}/.cache" 来解决这个问题
(即使用动态创建且唯一的 Jenkins 作业的工作区)甚至更好地将 Gradle 用户主页设置为:
dt_stamp=`date +%s`; ## set and pass this dt_stamp variable for Gradle user home before calling Gradle.
GRADLE_USER_HOME="~${WORKSPACE}/${dt}/.cache"`
这样,至少在 Gradle 的缓存中,您不会看到任何由于锁定文件而导致的问题(注意:您将无法有效地使用 Gradle 的缓存概念 lazy (或者每次都从像 Artifactory 这样的二进制存储库中获取工件/库依赖项)如果您将 GRADLE_USER_HOME 设置为动态文件夹值,则在许多项目中使用 Gradle 时就像每次清除缓存后运行 gradle 一样(对于某些人来说,它是好的,如果您的构建不需要太多时间并且构建方式也更清洁))。
当我尝试只运行一个管道运行(并行运行所有 5 个项目的 gradle 任务)时,管道始终成功。
运行管道作业的多个实例(每次运行运行 5 个并行构建)会导致此文件锁定问题。
当我运行许多并发管道运行时出现错误消息(每个管道运行 - 在 5 个不同的项目上并行运行 Gradle 任务)。
FAILURE: Build failed with an exception.
* What went wrong:
Failed to capture snapshot of output files for task ':rpm' property 'archivePath' during up-to-date check.
> Timeout waiting to lock file hash cache (/view/user123456_Team_Tools/vobs/space/test/folder1/Project1of5/.gradle/4.3.1/fileHashes). It is currently in use by another Gradle instance.
Owner PID: 29003
Our PID: 903
Owner Operation:
Our operation:
Lock file: /view/user123456_Team_Tools/vobs/space/test/folder1/Project1of5/.gradle/4.3.1/fileHashes/fileHashes.lock
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
-- 或--
如果进程无法删除目录,您也可能会遇到这种错误(Gradle 正在进行中,因为目标文件夹/文件可能正在被其他进程使用)
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':clean'.
> Unable to delete directory: /view/user123456_Team_Tools/vobs/space/test/folder1/project2of5/build/classes/java/main/org/syntax/jedit
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
* Get more help at https://help.gradle.org
如果你真的幸运(像我一样),那么你可能也会遇到这个错误:
Jenkins - java.lang.IllegalArgumentException:最后一个单元没有足够的有效位 &
Gradle 错误:在根项目中找不到任务“null”
更多详情请看这里:Jenkins - java.lang.IllegalArgumentException: Last unit does not have enough valid bits & Gradle error: Task 'null' not found in root project