Сборка Gradle на GitLab CI: не удалось создать службу типа ScriptPluginFactory - PullRequest
0 голосов
/ 07 ноября 2018

Использование параллельного Gradle заданий на GitLab CI :

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 исполнитель gitlab-runner без какого-либо GitLab CI кэширования. Вместо этого я использую том Docker с кешем Gradle , указывающим на этот том:

before_script:
  - export GRADLE_USER_HOME=/pipelines/.gradle

Нет проблем с правами доступа к каталогу /pipelines (так что это не двойственность этого вопроса ).

Простой, но раздражающий способ решения этой проблемы - просто повторно запустить сбойное задание вручную - тогда оно проходит без каких-либо проблем. Другой обходной путь может автоматически инициировать задание с помощью директивы retry .

Итак, мой вопрос: Что является причиной сбоя задания и как его решить (без повторного запуска задания) ?

1 Ответ

0 голосов
/ 07 ноября 2018

Основная причина:

После некоторой отладки (переключатели --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 Ошибка / функция: Разрешить нескольким контейнерам совместно использовать загруженные зависимости . Поэтому я (заново) реализовал правильное кэширование кэширование для каждого задействованного GitLab CI задания (поэтому, нет общего кэша ?):

before_script:
  - export GRADLE_USER_HOME=`pwd`/.gradle

rpmClient:
  stage: buildRpm
  script:
  - gradle clientRpm
  cache:
    paths:
    - .gradle/caches
...