Jenkins como servidor de integración

¿Porque automatizamos?

Es claro que para ninguna «persona» es agradable ejecutar procesos de forma manual constantemente, a largo plazo suele volverse monótono y aburridor. Con esta in «comodidad» el operador se confía y puede descuidar o desatender alguna etapa del procedimiento, acá es donde surge el error… Ese error que no queremos y podría resultar costoso.

Así mismo, la automatización trae ciertas ventajas al delegar el trabajo que se realiza de forma manual a una máquina que lo hace mejor, e invirtiendo el tiempo en escribir código u en otras actividades.

¿Qué podemos automatizar?

Pruebas, deployments, disponibilidad de servicios, backups, procesos de storage, en general cualquier tarea que pueda ser programable.

¿Qué es Jenkins?

Jenkins es open source y probablemente el software de automatización más usado de todos, escrito en Java por ende se ejecuta en JVM. De mucha conveniencia al ser una herramienta extensible al tener un ecosistema de plugins que te permiten extenderlo, se pueden escribir tus propios plugins con Java, la comunidad ha desarrollado gran variedad de los mismos.

Ventajas de utilizar Jenkins
  • Extensibilidad (Plugins: Maven, Ansible, SonarQube, Docker y más)
  • Comunidad
  • Escalabilidad (Horizontal y vertical)
  • Innovación constante. (Releases de Seguridad)
  • Flexible
  • Fácil instalación y configuración

Jenkins va de la mano de DevOps, que no es mas que una cultura que intenta reducir la brecha que existe actualmente entre la parte DEV (desarrolladores) y la parte OPS (operadores y administradores de sistemas), con el fin de realizar el paso a producción.

¿ Qué es continuous Integration y continuous Delivery?

No es más que como entregamos una aplicación a producción de la forma mas automatizada posible (Haciendo un click, push, etc). Jenkins va a encargarse de desplegar la aplicación a producción.

Requerimientos

Minimos

  • 256 MB of RAM
  • 1 GB of drive space (although 10 GB is a recommended minimum if running Jenkins as a Docker container)

Configuración recomendada para un equipo pequeño

  • 1 GB+ of RAM
  • 50 GB+ of drive space

No es mandatorio pero sería lo ideal que para la total comprensión de estos conceptos se tengan nociones o conocimientos en contenedores (Docker).

– Si va a utilizar alguna distribución Fedora, utilice hasta la versión 30, a partir de la 31 cambia un componente del kernel que inhabilita la operación de contenedores, pueden funcionar con unos ajustes a ciertos parámetros del sistema pero no es del alcance del post.

Docker y Fedora 32 https://fedoramagazine.org/docker-and-fedora-32/

Se puede instalar en una máquina física, virtual, proveedor de nube y el sistema operativo de su preferencia. Para mayor información puede consultar las guías que provee el fabricante.

https://www.jenkins.io/doc/

Instalación 1 (Máquina virtual)

Nota: Para la instalación de Jenkins se debe disponer de la versión 8 de java.

apt install openjdk-8-jdk wget gnupg

Ahora se añade el repositorio de Jenkins para la versión estable (LTS).

wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > \
    /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins

A continuación se procede a validar el estado del servicio

service jenkins status

Instalación 2 (Contenedor Docker)

Para nuestro escenario, se utilizará una máquina Fedora 30 donde se instalará Docker para crear un contenedor del servicio de Jenkins. (Existen diversas implementaciones para este servicio pero esta es una de las mas comunes).

Instalación de Docker

Es muy sencillo, visitamos la web https://developer.fedoraproject.org/tools/docker/docker-installation.html

Configuración del repositorio
yum update

sudo dnf -y install dnf-plugins-core  #Instala un paquete para Fedora para administrar repositorios

dnf config-manager \
    --add-repo \
    https://download.docker.com/linux/fedora/docker-ce.repo
Instalación
sudo dnf install docker-ce -y

sudo systemctl start docker

sudo systemctl status docker

sudo docker run hello-world
Añadir usuario a grupo de docker
docker ps
sudo usermod -aG docker <whoami>
docker ps
Instalación de Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo  chmod +x /usr/local/bin/docker-compose

docker-compose

docker-compose --version
Instalación de Jenkins

Nota: La imagen de jenkinsci/jenkins está deprecada, así que en vez de esa, deberías usar esta: jenkins/jenkins .

jenkinsci/jenkins https://hub.docker.com/r/jenkinsci/jenkins/

Docker funciona por medio de imágenes, una imagen es una plantilla donde viene la configuración del servicio que queremos.

docker pull jenkinsci/jenkins

docker images

mkdir jenkins

chown 1000 jenkins
Creación de archivo *.yml
cd jenkins

touch docker-compose.yml

version: '3'
services:
  jenkins:
    container_name: jenkins
    image: jenkinsci/jenkins
    ports:
      - "8080:8080"
    volumes:
      - $PWD/jenkins_home:/var/jenkins_home
    networks:
      - net
networks:
  - net:


mkdir jenkins_home

docker-compose up -d

docker ps

Opcion 1
docker logs -f jenkins

Opcion 2
cat jenkins_home/secrets/initialAdminPassword

Opcion 3
docker exec -ti jenkins bash

exit

Para detener el contenedor debes entrar a la carpeta de jenkins creada previamente, y ejecutar el siguiente comando.

docker-compose stop

Para eliminar el servicio se utiliza el comando

docker-compose down

Jobs, tareas o proyectos, son los pasos que utilizamos para automatizar nuestras tareas.

Referencias

Docker Compose Installation https://docs.docker.com/compose/install/

Fedora installation https://docs.docker.com/engine/install/fedora/

https://poweruser.blog/how-to-install-docker-on-fedora-32-f2606c6934f1