Estoy en el proceso de convertir múltiples repositorios en un único repositorio, nuestra herramienta de CI elegida es Jenkins debido a la conversión de múltiples estructuras de repositorio en una sola. Han surgido 2 problemas principales.
Los tiempos de compilación / prueba han aumentado significativamente ya que todas las compilaciones / pruebas tienen que ejecutarse para cada confirmación individual. Esto se alivia parcialmente mediante el uso de una herramienta de compilación, en nuestro caso hemos optado por usar Buck.
Después de ejecutar todas las pruebas asociadas con el código comprometido, tengo un archivo Jenkins de implementación para cada proyecto. ¿Cómo podré activar solo los Jenkinsfiles para proyectos que necesiten volver a implementarse? Y si puedo hacerlo, ¿ es esta una práctica correcta ?
fuente
Respuestas:
Obtenga una lista de archivos modificados y úsela para determinar qué pruebas ejecutar.
Cargue scripts Groovy externos en tiempo de ejecución para ejecutar sus implementaciones.
fuente
Puede usar el bloque " cuándo " combinado con la condición incorporada "conjunto de cambios" para ejecutar condicionalmente solo ciertas etapas de la tubería de su monorepo. De la documentación de when.changeset:
conjunto de cambios: ejecuta la etapa si el conjunto de cambios SCM de la compilación contiene uno o más archivos que coinciden con la cadena o glob dado. Ejemplo: cuando {changeset "** / *. Js"}
Aquí hay un ejemplo de Jenkinsfile usando esta estrategia:
, aplicable a la estructura del proyecto monorepo que se muestra a continuación:
Esta estrategia no escalará más allá de las pequeñas bases de código porque sería difícil hacer un seguimiento de qué módulos dependen uno del otro. Sería mejor usar un sistema de compilación como Bazel. Su trabajo de CI simplemente emitiría una compilación de Bazel // ... (compila todo), y Bazel calcularía lo que realmente debe construirse y lo que debe probarse. Además, incluso existen reglas de bazel, como rules_docker y rules_k8s, que pueden calcular cuáles de sus contenedores deben reconstruirse y enviarse a un registro de contenedores, y cuáles de sus aplicaciones deben volver a implementarse en Kubernetes.
fuente