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


Первопричина:
После некоторой отладки (переключатели --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