Сборка Gradle на GitLab CI: не удалось создать службу типа ScriptPluginFactory

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

Сборка Gradle на GitLab CI: не удалось создать службу типа ScriptPluginFactory

Я получаю следующее исключение случайный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. Вместо этого я использую том Докер с кешем Gradle, указывающим на этот том:

before_script:
  - export GRADLE_USER_HOME=/pipelines/.gradle

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

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

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

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
1
0
1 947
1

Ответы 1

Первопричина:

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

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

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

Другие вопросы по теме