Configurando Jenkins en un Entorno Docker: Guía Paso a Paso

En esta guía, recorreremos el proceso de configuración de Jenkins dentro de un entorno Docker, cubriendo la instalación, la gestión de contenedores y la configuración esencial de complementos para flujos de trabajo de CI/CD eficientes.
Índice
configurando-jenkins-en-un-entorno-docker-una-guia-paso-a-paso-2

Setting Up Jenkins with Docker: An Advanced Guide

La Integración Continua (CI) y el Despliegue Continuo (CD) son prácticas esenciales para el desarrollo de software moderno. Una de las herramientas más populares en este ámbito es Jenkins, un servidor de automatización de código abierto que ayuda a automatizar partes del proceso de desarrollo de software. Combinar Jenkins con Docker puede optimizar significativamente tu pipeline de CI/CD, haciéndolo más eficiente y escalable.

This article provides a comprehensive guide to advanced Jenkins setup using Docker, covering installation, configuration, plugins, pipelines, and best practices. By the end of this guide, you will have a solid understanding of how to run Jenkins in a Docker container and leverage its capabilities to streamline your software development lifecycle.

Prerequisites

Antes de proceder con el proceso de configuración, asegúrate de cumplir los siguientes requisitos previos:

  • Familiarity with basic Docker commands.
  • Comprensión básica de Jenkins y su terminología.
  • Docker instalado en su equipo. Puede encontrar la guía de instalación en el... sitio web oficial de Docker.
  • Una conexión a internet confiable para descargar imágenes y complementos de Docker.

¿Qué es Jenkins?

Jenkins es un servidor de automatización de código abierto que admite la construcción, implementación y automatización del proceso de desarrollo de software. Ofrece numerosos plugins para apoyar la construcción e implementación de proyectos. Jenkins está escrito en Java y puede integrarse con varias herramientas y tecnologías, lo que lo hace altamente extensible.

Características principales de Jenkins:

  • Extensible: Admite una amplia gama de plugins para diversas tareas.
  • Compilaciones Distribuidas: Can distribute tasks across multiple machines.
  • Configuración sencilla: A user-friendly web interface for configuration.

Docker es una plataforma de código abierto que permite a los desarrolladores crear, implementar y ejecutar aplicaciones en contenedores. Los contenedores son entornos aislados que contienen todo lo necesario para que una aplicación se ejecute, incluyendo el código, las bibliotecas del sistema, las herramientas y las dependencias. Esto significa que las aplicaciones pueden ejecutarse de manera consistente en cualquier entorno, ya sea en un servidor local, en la nube o en un dispositivo móvil.Docker utiliza la tecnología de contenedores de Linux, que permite que múltiples contenedores se ejecuten en una sola máquina host. Cada contenedor comparte el kernel del sistema operativo host, pero tiene su propio espacio de usuario y sistema de archivos. Esto hace que los contenedores sean mucho más ligeros y rápidos que las máquinas virtuales tradicionales, que requieren un sistema operativo completo para cada instancia.Docker también proporciona una serie de herramientas y servicios para facilitar el desarrollo y la implementación de aplicaciones en contenedores. Estos incluyen:- Docker Hub: Un repositorio de imágenes de contenedores que los desarrolladores pueden usar como base para sus propias aplicaciones.- Docker Compose: Una herramienta para definir y ejecutar aplicaciones de múltiples contenedores.- Docker Swarm: Un orquestador de contenedores que permite a los desarrolladores administrar y escalar aplicaciones en contenedores en múltiples hosts.- Docker Machine: Una herramienta para crear y administrar máquinas host de Docker en diferentes plataformas.En resumen, Docker es una plataforma de contenedores que permite a los desarrolladores crear, implementar y ejecutar aplicaciones de manera consistente en cualquier entorno. Proporciona una serie de herramientas y servicios para facilitar el desarrollo y la implementación de aplicaciones en contenedores, lo que lo convierte en una opción popular para el desarrollo de aplicaciones modernas.

Docker es una plataforma que utiliza la virtualización a nivel de sistema operativo para entregar software en paquetes llamados contenedores. Un contenedor encapsula una aplicación y sus dependencias, permitiendo que se ejecute de manera consistente en diferentes entornos.

Características clave de Docker:

  • AislamientoCada contenedor se ejecuta en su entorno, asegurando que no haya interferencias de otras aplicaciones.
  • Portabilidad: Easily move containers across different systems.
  • EscalabilidadInicia rápidamente múltiples instancias de una aplicación.

Why Use Jenkins with Docker?

Combining Jenkins with Docker provides numerous advantages:

  • Consistency: Containers ensure that Jenkins runs the same way across different environments.
  • Resource EfficiencyLos contenedores utilizan menos recursos en comparación con las máquinas virtuales, lo que permite una asignación de recursos más eficiente.
  • Simplified Updates: Updating Jenkins or its dependencies involves merely pulling a new Docker image.
  • Aislamiento: Each Jenkins instance can run in its container, making it easier to manage multiple versions or configurations.

Configuración de Jenkins con Docker

Paso 1: Instalar Docker

If you haven’t installed Docker yet, follow the installation guide for your operating system provided on the Docker Docs.

Step 2: Pull the Jenkins Docker Image

Once Docker is installed, you can pull the official Jenkins image from Docker Hub. Open your terminal and execute:

docker pull jenkins/jenkins:lts

Este comando extrae la versión de Soporte a Largo Plazo (LTS) de Jenkins.

Paso 3: Ejecuta Jenkins en un contenedor de Docker

Run Jenkins in a Docker container using the following command:

docker run -d -p 8080:8080 -p 50000:50000 --name jenkins 
-v jenkins_home:/var/jenkins_home jenkins/jenkins:lts

Explicación del Comando:

  • -: Runs the container in detached mode.
  • -p 8080:8080Mapea el puerto 8080 de tu localhost al puerto 8080 en el contenedor.
  • -p 50000:50000: Los mapas del puerto 50000 para los agentes de Jenkins.
  • –nombre jenkins: Names the container ‘jenkins’.
  • -v jenkins_home:/var/jenkins_home: Persists Jenkins data in a Docker volume named jenkins_home.

You can verify that Jenkins is running by checking the logs:

docker logs jenkins

Configurando Jenkins

Step 1: Access Jenkins

Abre tu navegador web y ve a http://localhost:8080. Deberías ver el asistente de configuración de Jenkins. Para desbloquear Jenkins, necesitas la contraseña de administrador inicial, que se puede encontrar ejecutando:

docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

Copia el resultado y pégalo en el asistente de configuración.

Ahora que ha instalado el servidor de compilación, necesita instalar los plugins de Gradle para Scala y para el servidor de compilación.

Jenkins te pedirá que instales complementos. Puedes elegir los complementos recomendados o seleccionar específicos. Para una configuración de CI/CD, te recomendamos instalar:

  • Git plugin
  • Plugin de Docker
  • Pipeline plugin
  • Blue Ocean plugin

Paso 3: Crear un Usuario Administrador

Tras instalar los plugins, tendrás la opción de crear un usuario administrador. Completa la información requerida y finaliza el proceso de configuración.

Creación de un Pipeline de Jenkins

Step 1: Create a New Pipeline Job

  1. From the Jenkins dashboard, click on “New Item”.
  2. Ingrese un nombre para su canalización y seleccione “Canalización”.
  3. Click “OK” to create the pipeline job.

Paso 2: Define tu PipelineEn este paso, definirás tu pipeline de procesamiento de datos. Un pipeline es una serie de pasos que se ejecutan en secuencia para procesar datos. En este caso, tu pipeline consistirá en los siguientes pasos:1. Cargar los datos desde un archivo CSV. 2. Limpiar los datos eliminando filas con valores faltantes. 3. Transformar los datos aplicando una función de normalización. 4. Guardar los datos procesados en un nuevo archivo CSV.Para definir tu pipeline, necesitarás crear una clase que herede de la clase Pipeline de la biblioteca scikit-learn. Esta clase te proporcionará los métodos necesarios para definir y ejecutar tu pipeline.Aquí tienes un ejemplo de cómo podrías definir tu pipeline:```python from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler# Define tu pipeline pipeline = Pipeline([ ('load_data', LoadData()), ('clean_data', CleanData()), ('normalize_data', StandardScaler()), ('save_data', SaveData()) ])# Ejecuta tu pipeline pipeline.fit_transform(X) ```En este ejemplo, `LoadData`, `CleanData` y `SaveData` son clases personalizadas que implementan los pasos de carga, limpieza y guardado de datos, respectivamente. `StandardScaler` es una clase de scikit-learn que normaliza los datos.Una vez que hayas definido tu pipeline, puedes ejecutarlo utilizando el método `fit_transform` de la clase Pipeline. Este método ejecutará todos los pasos de tu pipeline en secuencia, pasando los datos de un paso al siguiente.¡Eso es todo! Ahora tienes un pipeline definido y listo para procesar tus datos.

En la página de configuración del pipeline, puedes definir tu script de pipeline, ya sea directamente en el área de texto o cargándolo desde un sistema de control de versiones. Aquí tienes un ejemplo de un script de pipeline simple:

pipeline {
    agent any 
    stages {
        stage('Build') {
            steps {
                echo 'Construyendo...'
            }
        }
        stage('Test') {
            steps {
                echo 'Probando...'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Desplegando...'
            }
        }
    }
}

Guarda el pipeline y podrás ejecutarlo haciendo clic en el botón “Build Now”.

Best Practices for Jenkins in Docker

  1. Utiliza Volúmenes de DockerPersiste siempre tus datos de Jenkins utilizando volúmenes de Docker para evitar la pérdida de datos cuando los contenedores se eliminan o se recrean.

  2. Mantener Jenkins ActualizadoExtrae con regularidad la última imagen de Docker de Jenkins y actualiza tu contenedor para aprovechar los parches de seguridad y las nuevas funcionalidades.

  3. Utiliza un proxy inverso: Secure your Jenkins instance using a reverse proxy like Nginx or Traefik to handle HTTPS and improve performance.

  4. Implementar las mejores prácticas de seguridad: Configure security settings in Jenkins, such as enabling CSRF protection and restricting access to the Jenkins dashboard.

  5. Copia de seguridad de datos de JenkinsRealice copias de seguridad periódicas de su directorio home de Jenkins para evitar la pérdida de datos.

  6. Utiliza Pipelines Declarativas: Prefer declarative syntax for Jenkins pipelines as they are easier to read and maintain.

Conclusión

Setting up Jenkins with Docker provides a robust and flexible solution for automating your software development processes. By encapsulating Jenkins in a container, you gain enhanced portability, scalability, and resource efficiency. Following the steps outlined in this article, you can create a powerful CI/CD pipeline that streamlines development and deployment.

A medida que continúas utilizando Jenkins, considera explorar funciones avanzadas como bibliotecas compartidas, imágenes Docker personalizadas para entornos de compilación e integración con otras herramientas de tu ecosistema de CI/CD. Al aprovechar al máximo el potencial de Jenkins y Docker, estarás bien preparado para abordar los retos del desarrollo y entrega de software moderno.