Fundamentos de un Pipeline Jenkins

Un Pipeline Jenkins es la clave para el despliegue continuo en esta herramienta open source ¿sabes cómo funciona?

Una de mis ventajas favoritas sobre DevOps es el hecho de realizar despliegues de forma automática (siempre y cuando supere todas las pruebas claro 😉 )

Y para poder realizar esos despliegues, se debe configurar un pipeline, que definirá el ciclo de vida de tu aplicación desde que descargas el código de repositorio, hasta que despliegas en el entorno que necesites.

Los pipelines no son nuevos, llevamos años utilizándolos. En mi caso, dónde mas lo he visto ha sido en entornos Linux, para la ejecución de comandos.

Qué es un Pipeline Jenkins

Un pipeline Jenkins es un conjunto de plugins que soporta la implementación e integración de pipelines (tuberías) de despliegue continuo en Jenkins.

Un pipeline es un conjunto de instrucciones del proceso que siga una aplicación desde el repositorio de control de versiones hasta que llega a los usuarios.

Cada cambio en tu software, lleva a un complejo proceso hasta que es desplegado.

Este proceso incluye desde construir software de forma fiable y repetible (conocido como “build”), hasta realizar todos los pasos de testing y despliegues necesarios.

Un pipeline Jenkins provee un gran conjunto de herramientas para dar forma con código a un pipeline de entrega de la aplicación.

Jenkins Pipeline

La definición de un pipeline Jenkins, se escribe en un fichero de texto (llamado Jenkinsfile) que se puede subir al repositorio junto con el resto del proyecto de software.

Ésta es la base del “Pipeline como código”: tratar el pipeline de despliegue continua como parte de la aplicación para que sea versionado y revisado como cualquier otra parte del código.

Para crear el código de ese Jenkinsfile, se hace uso de una sintaxis propia que puedes consultar aquí.

La creación de un Jenkinsfile y su subida al repositorio de control de versiones, otorga una serie de inmediatos beneficios:

  • Crear automáticamente un pipeline de todo el proceso de construcción para todas las ramas y todos los pull request.
  • Revisión del código en el ciclo del pipeline.
  • Auditar todos los pasos a seguir en el pipeline
  • Una sencilla y fiable fuente única, que puede ser vista y editada por varios miembros del proyecto.

Aunque la sintaxis para definir un pipeline Jenkins es igual, tanto a través de la interfaz web como con un Jenkinsfile, generalmente se considera como una mejor práctica realizarlo de la segunda forma y subirlo al repositorio.

Tipos de sintaxis para un pipeline Jenkins

Un Jenkinsfile puede ser escrito usando dos tipos de sintaxis: Declarative (declarativa)  o Scripted (guionizada).

Ambos tipos se construyen de forma diferente.

Un pipeline declarative es una característica reciente en un pipeline Jenkins que:

  • Provee unas características sintácticas más completas que sobre las de tipo scripted.
  • Está hecho para que tanto su escritura como lectura sean más sencillas.

Muchos de los componentes individuales de un Jenkinsfile, llamados pasos (steps), a menudo, son iguales en ambas sintaxis.

Después te enseñaré con más detalle las diferencias entre los dos tipos.

¿Por qué utilizar un Pipeline Jenkins?

Jenkins es, sobretodo, una herramienta que soporta patrones de automatización.

Un Pipeline Jenkins añade un potente conjunto de herramientas de automatización que, soporta casos de uso que van desde una simple integración continua, hasta exhaustivos pipelines de entrega continua.

Dando forma a una serie de tareas relacionadas, los usuarios pueden aprovechar muchas de las características de un pipeline, cómo por ejemplo:

  • Código: los Pipelines Jenkins se implementan en el código y suelen incorporarse al proyecto a través del sistema de control de versiones, facilitando a los equipos la habilidad para editar y revisar a través de su pipeline.
  • Durable: Los pipelines, perduran tanto a los reinicios planificados como a los no planificados del servidor de Jenkins.
  • Pausable: Opcionalmente, pueden parar y esperar la intervención o la aprobación de una persona, antes de continuar su ciclo.
  • Versátil: Soportan complejos requisitos de despliegue continuo, incluyendo la habilidad de hacer forks, loops, o realizar trabajo en paralelo.
  • Extensible: Además, también soporte extensiones personalizadas de su lenguaje específico de dominio, así como múltiples opciones para la integración con otros plugins.

Mientras que Jenkins siempre ha permitido formas rudimentarias de enlazar jobs para realizar tareas secuencialmente, los Pipelines Jenkins hacen de este concepto algo mucho más destacable.

Aquí puedes ver un ejemplo de escenario de despliegue continuo configurable en un Pipeline Jenkins

Pipelines

Conceptos más importantes

  • Pipeline: Modelo definido por un usuario de un proceso de despliegue continuo
  • Node (nodo): Máquina que es parte del entorno de Jenkins y es capaz de ejecutar un Pipeline Jenkins
  • Stage (etapa): Subconjunto de tareas que se realizan a través de todo el ciclo del pipeline (Construir, Probar, Desplegar, etc…), que es utilizado por varios plugins para visualizar o mostrar el estado y progreso del proceso.
  • Step (paso): Cada una de las tareas que componen una etapa. Básicamente, cada paso le dice a Jenkins, que hacer en cada uno de los puntos concretos del ciclo a realizar.

Sintaxis de un Pipeline Jenkins

Éstas son las diferencias entre los dos tipos de sintaxis, la de los Declarative Pipelines, y la de los Scripted Pipelines.

Ten en cuenta que tiene elementos comunes que pueden ser fácil de confundir.

Fundamentos de los Declarative Pipelines

Éste sería un ejemplo:

pipeline { 
    agent any    
    stages { 
        stage('Construir') {  
            steps { 
                //  
            } 
        } 
        stage('Probar') {  
            steps { 
                //  
            } 
        } 
        stage('Desplegar') {  
            steps { 
                //  
            } 
        } 
    } 

En este Pipeline podemos destacar los siguientes elementos:

  1. agent any : Esto indica que el pipeline se ejecutará en cualquiera de los nodos.
  2. stage(‘Construir’): Define la etapa para “Construir”
  3. // : Esta parte contiene cada uno de los pasos a realizar en la etapa de “Construir”

Fundamentos de los Scripted Pipelines

En los Pipelines Scripted, one o más de los bloques del nodo hacen el trabajo principal a través de todo el ciclo. Aunque no es un requisito imprescindible, al encerrar las tareas en el bloque del nodo se consiguen dos cosas:

  1. Programar los pasos del bloque para ejecutarse añadiendo un elemento a la cola de trabajo de Jenkins. Tan pronto como haya una ejecución disponible en un nodo, los pasos se ejecutarán.
  2. Crear un workspace (un directorio específico para un Pipeline particular) donde las tareas se pueden realizar sobre los ficheros descargados del repositorio. Ten en cuenta que dependiendo de la configuración de Jenkins, algunos workspaces no se limpian automáticamente después de un periodo de inactividad.

Y aquí puedes ver un ejemplo de un Scripted Pipeline:

node { 
    stage(‘Construir’) { 
         // 
    } 
    stage(‘Probar’) { 
         // 
    } 
    stage(‘Deploy’) { 
         // 
    } 
} 

En este caso, lo más destacable sería:

  1. node: Esto indica que el pipeline se ejecutará en cualquiera de los nodos.
  2. stage(‘Construir’): Define la etapa de ‘Construir’. Este bloque es opcional en los Scripted Pipelines, pero, facilitará la lectura de cada una de las fases y tareas a seguir en la interfaz de Jenkins.
  3. //: Esta parte contiene cada uno de los pasos a realizar en la etapa de “Construir”

Ejemplo de un Pipeline Jenkins

Aquí puedes ver un ejemplo más completo de un Pipeline Jenkins, utilizando la sintaxis declarativa.

 pipeline {  
    agent any  
    options { 
        skipStagesAfterUnstable() 
    } 
    stages { 
        stage('Construir') {  
            steps {  
                sh 'make'  
            } 
        } 
        stage('Probar'){ 
            steps { 
                sh 'make check' 
                junit 'reports/**/*.xml'  
            } 
        } 
        stage('Desplegar') { 
            steps { 
                sh 'make publish' 
            } 
        } 
    } 
}  

Pues sí, me ha quedado un artículo espesito…pero es lo que tiene la automatización, que se tiene que trabajar más al principio para que todo funcione como es debido 😉


Fuentes:

https://jenkins.io/doc/book/pipeline/

Deja un comentario