Plantilla de tubería Jenkins

Tenemos varios proyectos de Java. Cada proyecto tiene su propia cartera de entrega.

Todas las tuberías tienen los siguientes pasos en común (simplificados):

  • Desarrollar proyecto
  • Proyecto de lanzamiento
  • Implementar para probar el entorno
  • Implementar en el entorno de producción

Las canalizaciones del proyecto solo difieren en las propiedades específicas del proyecto, como los nombres de los servicios o las direcciones IP del entorno de prueba y producción.

Las preguntas son: ¿cómo podríamos evitar la repetición que todos los proyectos tienen en común? ¿Jenkins “Pipeline as code” proporciona algo así como las plantillas de tuberías?

Podría imaginar que una plantilla ahorraría muchos códigos / pasos redundantes en nuestros proyectos. Por lo tanto, sería mucho más fácil configurar un nuevo proyecto, mantener la tubería, mantener la tubería sincronizada …

Un enfoque que nos funciona bien es colocar partes de la tubería (las que todos los proyectos tienen en común) o incluso toda la tubería en una biblioteca compartida de Jenkins .

Ejemplo

El siguiente script ( template.groovy ) se define como variable global en una biblioteca compartida de Jenkins. El método crea una nueva canalización declarativa (también funciona para la syntax de la línea de comandos). Todas las propiedades específicas del proyecto se proporcionan a través del mapa templateParams .

 /** * Defines a pipeline template (as a sample with one job parameter * that should be common for all pipelines) */ def createMyStandardDeclarativePipeline(Map templateParams) { pipeline { agent any parameters { string(name: 'myInput', description: 'Some pipeline parameters') } stages { stage('Stage one') { steps { script { echo "Parameter from template creation: " + templateParams.someParam } } } stage('Stage two') { steps { script { echo "Job input parameter: " + params.myInput } } } } } } 

Al usar esta variable global, la siguiente línea crea una canalización desde nuestra plantilla:

 template.createMyStandardDeclarativePipeline(someParam: 'myParam') 

Conclusión

Este concepto facilita la definición de plantillas de tuberías y su reutilización en varios proyectos.

Aplicado en el ejemplo dado en la pregunta, puede crear una canalización de entrega para un proyecto con un simple trazador de líneas:

 template.createStandardDeliveryPipeline(serviceName: 'myService', testEnv: '192.168.99.104', productionEnv: '192.168.99.105') 

Actualización (30-09-2017): Declarar un bloque de canalización en una biblioteca compartida ahora es oficialmente compatible con Declarative Pipelines versión 1.2. Ver: https://jenkins.io/doc/book/pipeline/shared-libraries/#defining-declarative-pipelines


Actualización (06-10-2017): ahora se puede encontrar un ejemplo extendido aquí: https://jenkins.io/blog/2017/10/02/pipeline-templates-with-shared-libraries/

Puede usar bibliotecas compartidas, lo que permite generar trabajos y hace que el código sea reutilizable en diferentes trabajos, y hace que sus jenkinsfiles sean realmente limpios.

La biblioteca compartida está formada por la carpeta src que contendrá todo el método que va a invocar en diferentes trabajos, y la carpeta vars en la que va a implementar la lógica de su trabajo, los archivos de la carpeta vars son archivos geniales y puede llamar la lógica detrás de cada archivo por el nombre de este archivo en el jenkinsfile pasando las variables apropiadas a sus trabajos, dependiendo de lo que tenga como usted mencionó (dirección IP, …)

Por ejemplo:

En vars, puede tener un archivo deploy.groovy en el que llame a un método desde la carpeta src que implementa el dispositivo y al que pasará parámetros que son apropiados para un trabajo específico y que definirá en su jenkinsfile cuando usted llama a su deploy.groovy así:

 node{ deploy([ip_address : '...', env : '' ]) } 

Y no olvides importar tu lib compartido. Y configure el repository que contiene esta lib compartida en sus jenkins. Para más detalles, consulte la documentación para bibliotecas compartidas en Jenkins