在 GitLab CI 上使用 parallel Gradle 作业:
我收到以下随机 Gradle 例外情况:
FAILURE: Build failed with an exception.
* What went wrong:
Could not create service of type ScriptPluginFactory using BuildScopeServices.createScriptPluginFactory().
> Could not create service of type ResourceSnapshotterCacheService using GradleUserHomeScopeServices.createResourceSnapshotterCacheService().
我使用docker
的{{1}}执行程序,没有任何 GitLab CI 缓存。我使用的是 Docker 卷,而不是 Gradle 缓存指向该卷:
gitlab-runner
对before_script:
- export GRADLE_USER_HOME=/pipelines/.gradle
目录的访问权限没有问题(因此这不是this question的重复)。
此问题的简单但烦人的解决方法是手动重新触发失败的作业-然后它顺利通过。另一个解决方法是通过retry指令自动重新触发作业。
所以,我的问题是:是什么原因导致工作失败以及如何解决(无需重新触发工作)?
答案 0 :(得分:1)
根本原因:
经过一些调试(切换--stacktrace
和--info
)后,很明显的根本原因是多个 Docker 容器共享一个 Gradle 缓存在主机上。
Caused by: org.gradle.cache.LockTimeoutException: Timeout waiting to lock file hash cache (/pipelines/.gradle/caches/4.10.2/fileHashes). It is currently in use by another Gradle instance.
Owner PID: 158
Our PID: 160
Owner Operation:
Our operation:
Lock file: /pipelines/.gradle/caches/4.10.2/fileHashes/fileHashes.lock
解决方案:
仍有未解决的 Gradle 错误/功能:Let multiple containers share downloaded dependencies。因此,我对每个涉及到的 GitLab CI 作业(重新)实施了正确的 Gradle 缓存(因此,没有共享缓存):
before_script:
- export GRADLE_USER_HOME=`pwd`/.gradle
rpmClient:
stage: buildRpm
script:
- gradle clientRpm
cache:
paths:
- .gradle/caches