在GitLab CI上构建Gradle:无法创建ScriptPluginFactory类型的服务

时间:2018-11-07 09:11:13

标签: docker gradle gitlab-ci gitlab-ci-runner

GitLab CI 上使用 parallel Gradle 作业:

Parallel Gradle jobs

我收到以下随机 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指令自动重新触发作业。

所以,我的问题是:是什么原因导致工作失败以及如何解决(无需重新触发工作)

1 个答案:

答案 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