Aquí está el contexto de mi problema:

  • una tubería gitlab ci yml
  • varios trabajos en la misma pasantía
  • todos los trabajos usan una tarea gradle que requiere el uso de su caché
  • todos los trabajos comparten el mismo caché de gradle

Mi problema:

A veces, cuando hay varias tuberías al mismo tiempo, obtengo:

Lo que salió mal: no se pudo crear el servicio de tipo FileHasher usando GradleUserHomeScopeServices.createCachingFileHasher ().

Se agotó el tiempo de espera para bloquear la memoria caché de hash de archivo (/cache/.gradle/caches/5.1/fileHashes). Actualmente está en uso por otra instancia de Gradle. PID del propietario: 149 Nuestro PID: 137 Operación del propietario: Nuestra operación: Bloquear archivo: /cache/myshop/reunion/.gradle/caches/5.1/fileHashes/fileHashes.lock

No puedo encontrar ninguna documentación sobre el sistema de bloqueo utilizado por gradle. No entiendo por qué los bloqueos se colocan cuando la acción de gradle no escribe en el directorio de caché.

¿Alguien sabe cómo funcionan las cerraduras? ¿O simplemente puedo cambiar la duración del tiempo de espera para permitir que las tareas concomitantes esperen su turno el tiempo suficiente antes de fallar?

Traducido con www.DeepL.com/Translator

Traté de sintonizar gradle sin un demonio, no funcionó.

4
lepapareil 30 ene. 2019 a las 19:43

3 respuestas

La mejor respuesta

Por lo general, obtiene este error cuando intenta compartir la memoria caché de Gradle entre varios procesos de Gradle que se ejecutan en diferentes hosts. Supongo que sus canalizaciones de CI se ejecutan en diferentes hosts o al menos se ejecutan aisladas unas de otras (por ejemplo, como parte de diferentes contenedores Docker).

Desafortunadamente, tal escenario es actualmente no es compatible por Gradle. El desarrollador de Gradle Stefan Oehme escribió este comentario wrt. compartiendo la casa de usuario de Gradle:

Los procesos de Gradle mantendrán bloqueos si no están vigilados (para obtener rendimiento). La contención se anuncia a través de la comunicación entre procesos, que no funciona cuando los procesos están aislados en contenedores Docker.

Y más claramente afirma en un comentario de seguimiento (resaltado por yo):

Sin embargo, puede haber otros problemas que aún no hemos descubierto, ya que compartir un hogar de usuario entre máquinas no es un caso de uso para el que hemos diseñado .

En otras palabras: compartir una casa de usuario de Gradle o incluso solo la parte de caché en diferentes máquinas o procesos aislados no es oficialmente compatible con Gradle. (Consulte también mi pregunta relacionada.)

Supongo que la única forma de resolver esto para su escenario es:

  • asegúrese de que los procesos de Gradle en sus canalizaciones de CI puedan comunicarse entre sí (por ejemplo, ejecutándolos en el mismo host), o
  • no comparta directamente la página de inicio del usuario de Gradle, por ejemplo, creando copias para todas las canalizaciones de CI, o
  • no ejecute las canalizaciones de CI en paralelo.
4
Chriki 9 abr. 2019 a las 10:00

Otro escenario en el que podría suceder es si algunos de estos archivos relacionados con Gradle están en un sistema de archivos en la nube como OneDrive que necesita una nueva autenticación.

  1. Vuelva a autenticarse en el sistema de archivos en la nube
  2. "Invalidar cachés y reiniciar" en Android Studio
0
auspicious99 14 may. 2020 a las 04:27

Solucioné esto eliminando todos los procesos java en el Monitor de actividad (MacOS). Espero eso ayude.

3
Semyon Tikhonenko 5 mar. 2020 a las 21:32