Не удалось создать службу типа FileHasher с помощью GradleUserHomeScopeServices.createCachingFileHasher () - PullRequest
0 голосов
/ 30 января 2019

Вот контекст моей проблемы:

  • конвейер gitlab ci yml
  • несколько заданий в одной и той же стажировке
  • во всех заданиях используется блок задач, требующийиспользование его кеша
  • все задания совместно используют один и тот же кеш града

Моя проблема:

иногда, когда есть несколько конвейеров одновременно, я получаю:

Что пошло не так: не удалось создать службу типа FileHasher с помощью GradleUserHomeScopeServices.createCachingFileHasher ().

Время ожидания ожидания для блокировки хеш-кэша файла (/cache/.gradle/caches/5.1 / fileHashes).В настоящее время он используется другим экземпляром Gradle.PID владельца: 149 Наш PID: 137 Оператор владельца: Наша операция: Блокировка файла: /cache/myshop/reunion/.gradle/caches/5.1/fileHashes/fileHashes.lock

Я не могу найтилюбая документация о системе блокировки, используемой gradle.Я не понимаю, почему блокировки устанавливаются, когда действие gradle не записывает в каталог кеша.

Кто-нибудь знает, как работают блокировки?Или я могу просто изменить продолжительность тайм-аута, чтобы позволить сопутствующим задачам достаточно долго ждать своей очереди, прежде чем произойдет сбой?

Переведено с www.DeepL.com/Translator

Я пытался настроить gradle бездемон, не работал.

1 Ответ

0 голосов
/ 09 апреля 2019

Обычно вы получаете эту ошибку, когда пытаетесь разделить кэш Gradle между несколькими процессами Gradle, которые выполняются на разных хостах.Я предполагаю, что ваши конвейеры CI работают на разных хостах или, по крайней мере, работают изолированно друг от друга (например, как часть разных контейнеров Docker).

К сожалению, такой сценарий в настоящее время не поддерживается Gradle.Разработчик Gradle Stefan Oehme написал этот комментарий wrt.Совместное использование дома пользователя Gradle:

Процессы Gradle будут удерживать блокировки, если они не используются (для повышения производительности).О конфликте объявляется посредством межпроцессного взаимодействия, которое не работает, когда процессы изолированы в контейнерах Docker.

И более четко он заявляет в последующий комментарий (выделяямной):

Могут быть и другие проблемы, которые мы еще не обнаружили, поскольку совместное использование домашнего пользователя между машинами не является сценарием использования, который мы разработали для .

Другими словами: совместное использование домашнего хранилища пользователя Gradle или даже его части кеша на разных машинах или в других изолированных процессах в настоящее время официально не поддерживается Gradle.(См. Также мой связанный вопрос .)

Полагаю, единственный способ решить эту проблему для вашего сценария - это либо:

  • убедиться, что Gradle обрабатываетв вашем CI конвейеры могут связываться друг с другом (например, запуская их на одном хосте), или
  • не делятся напрямую с домом пользователя Gradle, например, путем создания копий для всех конвейеров CI, или
  • не запускать конвейеры CI параллельно.
...