Una guía paso a paso para crear el pipeline Jenkins

¿Por qué Jenkins Pipeline?

La entrega continua (CD) es una parte esencial del ciclo de vida DevOps.

Se asegura de que el software/aplicación que los desarrolladores están creando esté siempre listo para la producción. Para que esto suceda, cada vez que el código se actualiza, necesita ser construido, probado y desplegado continuamente. Aquí es donde entra en escena Jenkins Pipeline.

En DevOps, la Integración Continua y la Entrega Continua (CI/CD) se logra a través de Jenkins Pipeline. El uso de Jenkins Pipeline para CD ayuda a entregar el software con lanzamientos más rápidos y frecuentes. Esto ayuda a incorporar la retroalimentación en cada próximo lanzamiento.

¿Qué es Jenkins Pipeline?

Jenkins Pipeline es una combinación de trabajos para entregar software continuamente usando Jenkins.

Asumo que sabe lo que es Jenkins. Si no es así, entonces eche un vistazo a este curso Udemy para dominar Jenkins.

Un pipeline Jenkins consiste en varios estados o etapas, y se ejecutan en una secuencia una tras otra. JenkinsFile es un simple archivo de texto que se utiliza para crear un pipeline como código en Jenkins. Contiene código en Groovy Domain Specific Language (DSL), que es sencillo de escribir y legible por humanos.

Puede ejecutar JenkinsFile por separado, o también puede ejecutar el código del pipeline desde Jenkins Web UI. Hay dos formas de crear un pipeline utilizando Jenkins.

  • Declarativa – una nueva forma de crear Pipeline Jenkins. Aquí usted escribe código groovy que contiene bloques de «pipeline», el cual es verificado en un SCM (Source Code Management)
  • Scripted – forma de escribir código groovy donde el código se define dentro de bloques «nodo».

Antes de entrar en la demostración, si no ha instalado Jenkins, instálelo primero. Asegúrese de que tiene Jenkins instalado y funcionando en su sistema.

Crear una tubería Jenkins

Así es como se ve el flujo de un pipeline Jenkins, que consiste en múltiples etapas entre los desarrolladores que crean un software (codificación) y el software entregado en producción.

Jenkins Pipeline

Vamos a crear un pipeline declarativo.

En el panel de control de Jenkins, haga clic en Nuevo elemento. A continuación, introduzca un nombre de elemento, por ejemplo, ‘Primera canalización’ y seleccione el proyecto ‘Canalización’. Luego haga clic en, Aceptar.

New Item - Jenkins Pipeline

Haga clic en la pestaña Pipeline como se muestra en la imagen de abajo, y ponga su código JenkinsFile (Código Groovy) aquí.

JenkinsFile Code
pipeline {
         agente cualquiera
         etapas {
                 etapa('Build') {
                 etapas {
                     echo 'Hola, GeekFlare. Empezando a construir la App.'
                 }
                 }
                 stage('Prueba') {
                 pasos {
                    input('¿Desea continuar?')
                 }
                 }
                 stage('Desplegar') {
                 paralelo { 
                            stage('Despliegue inicio ') {
                           pasos {
                                echo "Comienza el despliegue .."
                           } 
                           }
                            stage('Desplegando ahora') {
                            agente {
                                    docker {
                                            reuseNode true
                                            imagen 'nginx'
                                           }
                                    }
                            
                              pasos {
                                echo "Docker Creado"
                              }
                           }
                           }
                           }
                 stage('Prod') {
                     pasos {
                                echo "App is Prod Ready"
                              }
                 
              }
}
}

Permítanme explicar los bloques anteriores.

  • El bloque pipeline consiste en todas las instrucciones para construir, probar y entregar software. Es el componente clave de un pipeline Jenkins.
  • Se asigna un agente para ejecutar el pipeline en un nodo y asignar un espacio de trabajo para el pipeline.
  • Una etapa es un bloque que tiene pasos para construir, probar y desplegar la aplicación. Las etapas se utilizan para visualizar los procesos del pipeline Jenkins.
  • Un paso es una sola tarea a realizar, por ejemplo, crear un directorio, ejecutar una imagen docker, eliminar un archivo, etc.

El código Groovy de arriba, lo estoy utilizando para el JenkinsFile. Cualquier agente disponible está siendo asignado a la tubería. Luego estoy definiendo la etapa Build y realizando un simple paso echo. Después he definido la etapa Test donde el paso pregunta si se quiere proceder o no. Después de eso, he creado una etapa Deploy, que tiene dos etapas más en ella que se ejecutan en paralelo. La etapa Deploy start tiene un paso con el comando echo, y la etapa Deploy now tiene un paso que extrae una imagen docker de Nginx en el nodo. Finalmente, hay una etapa Prod con un simple paso echo.

El pipeline explicado arriba tiene etapas que tienen pasos simples para que usted entienda cómo funciona. Una vez que aprenda a crear un Pipeline, puede añadir más complejidad y crear pipelines complejos también.

Una vez que tenga el código en la pestaña Pipeline, haga clic en Aplicar y Guardar. Finalmente, haga clic en Construir ahora para comenzar a construir el Pipeline Jenkins que acaba de crear.

Build Now

Este es el aspecto que tendrá la interfaz de usuario cuando se ejecute el pipeline. Si ha seguido todos los pasos correctamente, su compilación tendrá éxito y mostrará un color azul para la compilación (#27). Si hay errores en la compilación, le dará un color rojo a la compilación (#27).

Jenkins Build 27

Ahora haga clic en build #27 y luego en Console Output para comprobar qué ocurrió exactamente en el back-end cuando se ejecutó.

Jenkins Build

Así es como se verá la salida terminando con un mensaje de ÉXITO.

Salida de la consola de éxito

Iniciado por el usuario geekflare
Ejecutando en nivel de Durabilidad MAX_SUPERVIVENCIA
[Pipeline] Inicio de tubería
nodo [Pipeline]
Ejecutándose en Jenkins en /var/lib/jenkins/workspace/First Pipeline
[Pipeline] {
[Pipeline] etapa
[Pipeline] { (Build)
[Pipeline] eco
Hola, GeekFlare. Comenzando a construir la App.
[Pipeline] }
[Pipeline] // stage
[Pipeline] etapa
[Pipeline] { (Prueba)
[Pipeline] entrada
¿Desea proceder?
Proceder o abortar
Aprobado por geekflare
[Tubería] }
[Pipeline] // etapa
[Pipeline] etapa
[Pipeline] { (Despliegue)
[Pipeline] paralelo
[Pipeline] { (Rama: Inicio de despliegue )
[Canalización] { (Rama: Desplegando ahora)
[Canalización] etapa
[Canalización] { (Inicio de despliegue )
[Canalización] etapa
[Canalización] { (Desplegar ahora)
[Canalización] getContext
[Canalización] isUnix
[Canalización] sh
[Pipeline] echo
Inicia el despliegue ..
[Pipeline] }
  docker inspect -f . nginx
[Pipeline] // escenario
[Pipeline] }

Error: No such object: nginx
[Canalización] isUnix
[Canalización] sh
  docker pull nginx
Usando etiqueta por defecto: latest
latest: Extrayendo de library/nginx
8d691f585fa8: Extrayendo capa fs
5b07f4e08ad0: Extrayendo capa fs
abc291867bca: Extrayendo capa fs
abc291867bca: Verificando checksum
abc291867bca: Descarga completada
5b07f4e08ad0: Verificando Checksum
5b07f4e08ad0: Descarga finalizada
8d691f585fa8: Verificando Checksum
8d691f585fa8: Descarga completada
8d691f585fa8: Pull completado
5b07f4e08ad0: Pull completo
abc291867bca: Pull completo
Digest: sha256:922c815aa4df050d4df476e92daed4231f466acc8ee90e0e774951b0fd7195a4
Estado: Descargada imagen más nueva para nginx:latest
[Pipeline] withDockerContainer
Jenkins no parece estar ejecutándose dentro de un contenedor
$ docker run -t -d -u 125:131 -w "/var/lib/jenkins/workspace/First Pipeline" -v "/var/lib/jenkins/workspace/First Pipeline:/var/lib/jenkins/workspace/First Pipeline:rw,z" -v "/var/lib/jenkins/workspace/First Pipeline@tmp:/var/lib/jenkins/workspace/First Pipeline@tmp:rw,z" -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** nginx cat
$ docker top 3141793b98f315dc90a57d810068b8eedb6f62debafb9040de06635b558f2943 -eo pid,comm
[Pipeline] {
[Pipeline] echo
Docker Creado
[Pipeline] }
$ docker stop --time=1 3141793b98f315dc90a57d810068b8eedb6f62debafb9040de06635b558f2943
$ docker rm -f 3141793b98f315dc90a57d810068b8eedb6f62debafb9040de06635b558f2943
[Canalización] // withDockerContainer
[Tubería] }
[Pipeline] // stage
[Pipeline] }
[Tubería] // paralelo
[tubería] }
[Tubería] // etapa
[Pipeline] etapa
[Pipeline] { (Prod)
[Pipeline] echo
La aplicación está lista para Prod
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Tubería] // nodo
[tubería] Fin de la tubería
Finalizado: ÉXITO

El Pipeline Jenkins anterior ha creado una imagen docker de Nginx. Puede verificarlo ejecutando el siguiente comando. Puede ver que la imagen docker de Nginx también aparece en la lista.

geekflare@chef-geekflare:~$ docker image ls
REPOSITORIO ETIQUETA IMAGEN ID CREADO TAMAÑO
nginx latest 540a289bab6c hace 2 semanas 126MB
httpd latest 7d85cc3b2d80 hace 2 meses 154MB
redis latest f7302e4ab3a8 hace 2 meses 98.2MB
geekflare_mongodb latest 095d17727ca0 hace 3 meses 325MB

Conclusión

Espero que esto le dé una idea de las ventajas de los pipelines Jenkins y de cómo puede crear uno. Lo anterior es una simple demostración, y la mejor manera de aprender es tratando de construir pipelines complejos.