Monday, June 24, 2024

Automatización con Jenkins

Temas

  • Pipeline as Code
  • Jenkinsfile
  • Caso Integrado
  • Jenkins Shared Library

Pipeline as Code


¿Qué es un pipeline?
  • Un pipeline es un conjunto de tareas repetitivas y automatizadas que facilitan el trabajo a los equipos de desarrollo y operaciones.
  • En DevOps se hace referencia a los flujos de integracion y entrega continua.

¿Qué es Pipeline as Code?
  • Es una práctica en la que se define la configuración de un pipeline de integración y entrega continua (CI/CD) utilizando código, en lugar de configuraciones manuales o interfaces gráficas de usuario.
Beneficios
  • Versionamiento de código del pipeline
  • Reutilización de etapas repetitivas (Herencia)
  • Flexibilidad
  • Facilidad de colaboración
  • Auditoría

Workflow
Herramientas comunes
  • Jenkins: Utiliza Jenkinsfile para definir pipelines en Groovy.
  • GitLab CI/CD: Utiliza un archivo .gitlab-ci.yml para definir pipelines en YAML.
  • Azure Pipelines: Utiliza archivos YAML para definir pipelines.
  • Travis CI: También usa archivos YAML (.travis.yml).
  • CircleCI: Define pipelines en YAML (.circleci/config.yml).

Estilos de pipelines

En Jenkins, "Pipeline as Code" puede escribirse en dos estilos principales: Scripted Pipeline y Declarative Pipeline. 
  • Declarative Pipeline presents a more simplified and opinionated syntax on top of the Pipeline sub-systems. The basic statements and expressions which are valid in Declarative Pipeline follow the same rules as Groovy’s syntax with the some exceptions.
  • Scripted Pipeline, like Declarative Pipeline, is built on top of the underlying Pipeline sub-system. Unlike Declarative, Scripted Pipeline is effectively a general-purpose DSL built with Groovy. Most functionality provided by the Groovy language is made available to users of Scripted Pipeline, which means it can be a very expressive and flexible tool with which one can author continuous delivery pipelines.


Más info: https://www.jenkins.io/doc/book/pipeline/syntax/

Ejemplo de  código:


El tipo Declarative es moderno, entendible y parecido al lenguaje YAML.


Agent

Especifica donde se ejecutará el pipeline o una etapa específica dependiendo donde se coloque.


Entre los tipos de agentes tenemos:
  • any: Se ejecutará en cualquier agente disponible.
  • none: Se va a ejecutar en el controller (maestro)
  • docker: Se creará un contenedor, ejecutará las tareas indicadas en el pipeline y luego se destruirá.
  • label: Ejecutará el pipeline en un nodo específico que tenga la etiqueta indicada.

Stage

Define una parte del trabajo a realizar. Se ejecutan secuencialmente e incluye pasos, que definen tareas reales.


Step

Ejecuta tareas reales como pruebas unitarias, ejecutar un shell script, entre otras.



Ejercicios

En Jenkinks, instalar los siguientes Plugins:
  • Docker
  • Docker Pipeline
  • docker-build-step
Realizar los siguientes ejercicios, en el cual colocamos los pipelines dentro del Jenkins (esto no es una buena práctica, solo con fines educativos).
  • https://github.com/GalaxyTraining/CURS-000168/blob/master/s03/12-pipeline-as-code.md
  • https://github.com/GalaxyTraining/CURS-000168/blob/master/s03/13-pipeline-as-code-docker.md
  • https://github.com/GalaxyTraining/CURS-000168/blob/master/s03/14-pipeline-as-code-git.md

Jenkinsfile 

Es un archivo de texto que contiene la definición de una canalización de Jenkins y está registrado en el control de código fuente. Considere la siguiente canalización que implementa una canalización básica de entrega continua de tres etapas.

La mejor práctica es tener nuestro pipelines en archivos.



Ejercicios

https://github.com/GalaxyTraining/CURS-000168/blob/master/s03/Jenkinsfiles/Jenkinsfile-scm
https://github.com/GalaxyTraining/CURS-000168/blob/master/s03/Jenkinsfiles/Jenkinsfile-maven
https://github.com/GalaxyTraining/CURS-000168/blob/master/s03/Jenkinsfiles/Jenkinsfile-sonar


Caso Integrado

Crear un pipeline para gradle con los siguientes stages:
  • Checkout
  • Build
  • Unit Test
  • SonarQube
  • Build Image
  • Publish Image
  • Run Container
Notas:
  • Jenkinsfile: https://github.com/aldo2510/galaxy-jenkins-lab-gradle/blob/main/Jenkinsfile
  • Crear configuración entre Jenkins y Docker Hub
  • Instalar plugin "Copy Artifact"

Recursos

Monday, June 17, 2024

Ambiente CI/CD con Jenkins

Contenido:

  • ¿Qué es Jenkins? 
  • Prácticas técnicas
  • Gestión de la Consola de Jenkins
  • Gestión de Jobs

¿Qué es Jenkins?

  • Es una herramienta de automatización / Servidor de automatización
  • Principales competidores de Jenkins:
    • Azure DevOps
    • GitHub Actions
    • GitLab
    • CloudBees
    • TC
  • ¿Porque utilizar Jenkins?
    • Jenkins es una herramienta Open Source.
    • Jenkins fue creada inicialmente para Java y luego fue abarcando otras tecnologías.
    • Jenkins es más  utilizado en entornos on-prmises, sin embargo, también funciona para cloud. 
    • Jenkins es la herramienta que cuenta con más plugins en el mercado a diferencia de sus competidores.
    • Jenkins es bastante robusto porque tiene como soporte a un lenguaje de programación por detrás. Esto es más poderoso que solo usar YAML.
  • En un ecosistema DevSecOps, Jenkins puede desempeñar un papel crucial como orquestador, ayudando a integrar la seguridad en todo el ciclo de vida del desarrollo de software.
  • Arquitectura de Jenkins. 
 

Prácticas técnicas

Las prácticas de "Integración Continua", "Entrega Continua" y "Despliegue Continuo" son esenciales en el desarrollo ágil y en la implementación de DevOps, permitiendo ciclos de desarrollo más rápidos y eficientes, y una mejor calidad de software.

  • Integración Continua (CI - Continuous Integration):
    • Desarrolladores -> Integración -> Pruebas Automatizadas -> Código Verificado
  • Entrega Continua (CD - Continuous Delivery):
    • Desarrolladores -> Integración -> Pruebas Automatizadas -> Código Desplegable -> (Despliegue Manual a Producción)
  • Despliegue Continuo (CD - Continuous Deployment):
    • Desarrolladores -> Integración -> Pruebas Automatizadas -> Código Desplegable -> Despliegue Automático a Producción

Integración Continua

La integración Continua es la epata donde generamos un compilado para cual se debe pasar por ciertas validaciones: pruebas unitarias, análisis de código estático, detección de secretos, análisis de dependencias, etc. Si todo está ok, el resultado final es un artefacto que sube a un repositorio de artefactos que luego podrá ser desplegado en cualquier ambiente.


Entrega Continua

Para poder desplegar en producción se requiere una intervención manual. 

Despliegue Continuo

El despliegue en producción es de forma automática. Este enfoque va a depender de la madurez de tus aplicaciones.


Gestión de la Consola de Jenkins

Gestión de Jobs

Levantar instancia Jenkins:
  • cd /home/galaxytraining/CURS-000168/s02/jenkins/01-install
  • docker-compose -f docker-compose-v1.yaml up -d
  • docker ps
Acceder al contenedor:
  • docker exec -it dde956c8226d bash

¿Qué es un Job?
  • En Jenkins, los "jobs" son unidades básicas de trabajo que Jenkins ejecuta. Un job puede representar cualquier cosa que necesita ser ejecutada regularmente, como una compilación de software, una prueba, una implementación o cualquier otro proceso automatizado. Aquí hay algunas de las funciones principales de los jobs en Jenkins:
    • Automatización de Compilación
    • Ejecución de Pruebas
    • Integración Continua
    • Entrega Continua
    • Despliegue Automatizado
    • Tareas de Mantenimiento
    • Notificaciones y Reportes
    • Integración con otras herramientas
  • Los jobs en Jenkins se configuran y ejecutan a través de la interfaz de Jenkins, y pueden ser desencadenados manualmente, por cambios en el control de versiones, en un horario determinado, o como parte de un pipeline de integración continua.
Tipos de Jobs
  • Freestyle Project: Son adecuados para tareas simples y configuraciones rápidas. Se usa la interfaz gráfica para su creación.
  • Pipeline: Ofrecen una mayor flexibilidad y son más adecuados para flujos de trabajo complejos y avanzados que requieren integración y entrega continua. Se contruyen usando código (Apache Groovy).

Ejercicios Freestyle Project
  • https://github.com/GalaxyTraining/CURS-000168/blob/master/s02/jenkins/02-jobs/lab02-jenkins-jobs/01_jobs.md

Ejercicios de Settings y Jobs
  • https://github.com/GalaxyTraining/CURS-000168/tree/master/s03
  • Para integrar Jenkinks y Docker
    • Bajamos el servicio: docker-compose -f docker-compose-v1.yaml down
    • Levantar servicio: docker-compose -f docker-compose-v3.yaml up -d

Pipelines como código

  • Configurar sonarqube: https://github.com/GalaxyTraining/CURS-000168/blob/master/s03/07-Configurar-Sonarqube.md



Wednesday, June 12, 2024

Despliegue con Docker

¿Qué es Docker?

Es un mecanismo mediante el cual se empaquetan aplicaciones con todas las librerías y recursos necesarios. Esta tecnología nos permite ejecutar aplicaciones de forma aislada. A un contenedor se le facilita acceso a los recursos que necesita.

Arquitectura, Containers vs Virtual Machines




Definición de imágenes, Dockerfile, Docker Compose y Dockerhub

Docker Compose

  • Herramienta que permite gestionar múltiples contenedores de Docker de forma simultanea. 
  • Es capaz de crear, arrancar, parar, borrar múltiples con un solo comando y un fichero de configuración (docker-compose.yml).
  • Comando: docker-compose up -d
  • Tip: cuando Docker se atasca en descargar un layer, usar el siguiente comando "sudo service docker restart"

Dockerfile

  • Es un archivo de definición de imagen
  • Toma imagen parte de otra imagen (imagen base es "alpine")

  • Comandos
  • abc

Imágenes docker

  • La instancia de una imagen se denomina contenedor

Ejecutando Build, Push, Push y otros comandos

  • docker help 
  • Ver imagenes: docker images
  • Descargar una imagen: docker pull
  • Ver contenedores en ejecución: docker ps
  • Detener todo los contenedores: docker stop $(docker ps -q)
  • Eliminar contenedores: docker rm $(docker ps -aq) -f
  • Limpiar recursos: docker system prune -a

Las contenedores deben correr en background, como si fuera un servicio.
docker run -d -p 8086:80 --name nginx-devops nginx:alpine

docker exec -it b2137459629c bash


Ejercicio: Crear contenedor de jenkins con las siguientes características:

  • Nombre: jenkins-dev
  • Puerto: 9999
  • En background
  • Volumen: jenkins_home
  • Tag:lts-jdk17
docker run -d -p 9999:8080 --name jenkins-dev -v $PWD/jenkins_home:/var/jenkins_home jenkins/jenkins:lts-jdk17

Taller: Dockerizar una aplicación

  • Siempre usar una versión LTS (versión estable)

Tuesday, June 4, 2024

Control de Versiones con Git

Definición de control de versiones

  • El control de versiones, también conocido como "control de código fuente", es la práctica de rastrear y gestionar los cambios en el código de software.
  • Tipos de control de versiones
    • Local computer
    • Central VCS Server
    • Distribuido
  • ¿Qué es GIT?
    • Es  un sistema de control de versiones distribuido que facilita el trabajo en equipo.
    • Ventaja: Auditoría de código, Control de cambios en el tiempo, Uso de etiquetas para versionar, Trabajo en equipo.
    • Desventajas: Curva de aprendizaje
  • Instalación GIT
  • Comandos

Diferencias GitHub vs GitLab vs Bitbucket

  • Free private repositories
  • Free public repositories
  • Integrated CI functionality
  • Navigation usability
  • File storage
  • Open Source
  • Integration
  • Project Analytics

Iniciando con GIT

  • Configuración
    • git config --global user.name "Javier Guerrero"
    • git config --global user.email "javierguerrero.tech@gmail.com"
    • git config --global -l
  • Comandos básicos
    • git init
    • git status
    • git add <directory> o <file>  // git add .
    • git commit -"mensaje"
    • git rm -cached <file>
    • git log: Historial de cambios
    • git commit --amend -m "mensaje cambiado"
    • git reset --hard commit_hash
    • git reflog

Estrategias de branching

Gitflow

  • Ramas
    • master: rama productiva, siempre disponible en el tiempo.
    • develop: copia de master
    • feature: rama de funcionalidad
    • release: rama que se despliega
  • ¿Que sucede si subiste varios features a develop, pero solo quieres desplegar un feature?
    • Hay que quitar features que no se quieren :(

Trunk based Development


GitHub Flow

  • abc








Notas:

  • Estrategias de branching enfocadas en CI/CD: ABC y XYZ
  • No se recomienda tener ramas por ambiente porque causan confusiones, conflictos, etc.
  • Una misma rama se despliega en los 3 ambienes (Dev, QA, Production).

Resources

Sunday, June 2, 2024

DevOps: Tecnologías y Cambio Cultural

.

Antecedentes

  • Metodologías tradicionales
    • Retos típicos: Backlog de producto enorme, Baja calidad, entrega manual, entregas poco frecuentes.
    • En un contexto de constantes cambios, donde la tecnología es un habilitador estragético para las organizaciones, no es recomendable esperar tanto tiempo para entregar software.
  • -

¿Qué es DevOps?

  • "Muro de la confusión". En el lado izquierdo tenemos al área de Desarrollo a quienes se les mide por generar nuevas funcionalidades. En el lado derecho está Operaciones, a quienes se les mide por mantener la estabilidad operativa de las aplicaciones.
  • DevOps es la unión de personas, procesos y productos para permitir la entrega continua de valor a los usuarios finales..
  • El cambio a DevOps...
  • Aspectos de DevOps
  • Valores CALMS: DevOps es un enfoque transversal en que se trabaja con las personas, ayudándoles implementando la automatización.
    • Cultura
    • Automatización: Uso de prácticas como Continuous Integration (CI), Continuous Deployment (CD) y Continuous Learning & Monitoring.
    • LEAN: Eliminar los desperdicios.
    • Medición: DORA metrics (métricas conocidas)
    • Colaboración (Sharing): No silos, Autonomous teams
  • Herramientas de Automatización. En cada etapa se usan diversas herramientas.
  • Beneficios DevOps
  • Antipatrones

  • Principales roles de un equipo DevOps
 

Ciclo de vida DevOps

  • Desde el punto de vista de la agilidad, el marco de trabajo que se viene usando en las organizaciones es Scrum. El primer sprint es conocido como "Sprint 0".
  • Dentro de las practicas DevOps tenemos lo siguiente:
  • Continuos Integration (CI): Etapa donde construimos nuestro software. Se realizan análisis de detección de secretos, análisis de dependencias, análisis de código estático, pruebas unitarias , etc. La idea es realizar un conjunto de validaciones antes de desplegar.
  • Continuous Delivery (CD): La Continuos Integration (CI) está embebida dentro de la Continuos Delivery.
  • Roles DevOps:
    • DevOps Automation Engineer: Son los que construyen los Pipelines.
  • Certificaciones: Las certificadoras más conocidas son "DevOps Institute" y "DASA"

Dudas

  • Como se integra el ciclo de vida DevOps y el marco de trabajo Scrum
  • Que tal el libro "El Proyecto Unicornio"
  • Ruta para convertirme de desarrollador en DevOps


Resources



Cuando el código funciona, pero no tiene tests: ¿y ahora qué?

Seguramente te ha pasado alguna vez. Te dan acceso al repositorio de un nuevo proyecto. Lo abres con curiosidad, esperas encontrar una estru...