Saltar al contenido
Apside

Jenkins

Jenkins, más que un software de integración continua.

José Verdugo ·

⏳ Este artículo tiene 8 años. El contenido puede estar desactualizado.

imagen

En este artículo veremos como Jenkins nos puede ayudar para enmallar procesos batch y al final un listado de códigos que podrá reutilizar para fin.

Como muchos saben, Jenkins es una herramienta open source de integración continua, usada principalmente para orquestar procesos en el desarrollo de software, pero sus grandes capacidades permiten utilizarlo para mas cosas.

Si revisamos sus características, podemos identificar a grandes rasgos las siguientes:

  • Puede orquestar cualquier tipo de proceso.
  • Utilizada para ejecutar tareas manuales, periódicas o automáticas.
  • Cuenta con más de 1400 plugins
  • Puede aumentar su capacidad de cómputo añadiendo nuevos agentes o servidores
  • Fácil de usar
  • Dashboard para visualizar estado de tareas.

Si bien Jenkins fue pensado para orquestar procesos de desarrollo, las siguientes características permite utilizarlo fácilmente como enmallador de procesos:

  • Permite ejecución de procesos secuenciales.
  • Monitoreo de procesos
  • Permite ejecución a horas determinadas
  • Ejecución en base a eventos
  • Ejecución distribuida en varias máquinas
  • Alertas ante problemas en algún proceso

Jenkins resuelve la **secuencialidad **de pasos creando pipelines, que son una secuencia de pasos que se codifican en un archivo que llamaremos Jenkinsfile en lenguaje groovy.

Ejemplo de pipeline

Jenkins trabaja con un servidor master al cual se les puede agregar esclavos o maquinas de diferentes plataformas.

Funcionamiento Master

Si bien es cierto Jenkins, cuenta con varios tipos de job, con el del tipo “Pipeline” es posible orquestar procesos sin mayor problema.

Selector de jobs

Configuración Job del tipo pipeline

Como todo proceso que se enmalla, es posible ejecutarlo a una determinada hora como se indica en la siguiente imagen.

imagen

Ejemplos de Pipeline básico

Uso de stage

node {
    stage('Etapa 1') {
       sleep 3
       echo "Finaliza etapa 1"
    }
    stage('Etapa 2 paralela') {
        parallel(
            'Etapa 2 A': {
                sleep 5
                echo "Finaliza etapa 2 A"           
            },
            'Etapa 2 B': {
                sleep 2
                echo "Finaliza etapa 2 B"
            }
        )
    }
    stage('Etapa 3') {
       sleep 3
       echo "Finaliza etapa 3"
    }
}

Variables

node {
    texto = 'Hola' //Variables string con comillas simples o dobles
    numero = 999  //Puedo o no se indica el tipo de variable
    numero ++
    echo texto + " " + numero
}

Sentencias de control y loop

node {
    stage('Ejemplo') {
        valor = true
        if (valor) {
            echo 'en if'
        } 
        
        for (i = 0; i< 10; i++) {
            echo "For: " + i
        }
    }
}

Métodos

def metodo(texto) { 
   echo texto
}    
node(){
    stage("Saludando") {
        metodo("hola")
    }
}

Importar clases

import java.text.SimpleDateFormat
node() {
    def dateFormat = new SimpleDateFormat("yyyyMMdd")
    def date = new Date()
    fechaConFormato = dateFormat.format(date)
    echo fechaConFormato
}

Sintaxis declarativa

pipeline {
    agent any
    stages {
        stage('Etapa 1')  {
            steps {
                echo  "En Etapa 1"
            }
        }
        stage('Etapa 2') {
            steps {
                 echo  "En Etapa 1"
            }
        }
        stage('Etapa 3') {
            steps {
                 echo  "En Etapa 3"
            }
        }
    }
    post { 
        always { 
            echo 'Ejecuta siempre'
        }
        failure { 
            echo 'Ejecuta en error'
        }
    }
}

Seguí leyendo