Construcción de una imagen Docker en un pipeline de Jenkins

Índice

Para crear una imagen Docker desde un pipeline de Jenkins es necesario conectar este servicio a la cuenta de DockerHub a la que debe subir la imagen. Para ello, en el menú Administrar Jenkins -> Credenciales -> Global -> Add Credentials se crea una nueva credencial de tipo nombre de usuario y contraseña.

Así, para crear una imagen a partir de la aplicación que se testea en esta otra entrada, en el pipeline, se añade una fase que se ejecuta en la misma máquina en la que esté instalado Jenkins (agent any). Esta fase tiene tres etapas: crear la imagen, subirla a DockerHub y borrarla de la máquina local.

pipeline {
    environment {
        IMAGEN = "fjhuete/polls"
        USUARIO = 'DockerHub'
    }
    agent none
    stages {
        ...
        stage('Creación de la imagen') {
            agent any
            stages {
                stage('Build') {
                    steps {
                        script {
                            newApp = docker.build "$IMAGEN:$BUILD_NUMBER"
                        }
                    }
                }
                stage('Deploy') {
                    steps {
                        script {
                            docker.withRegistry( '', USUARIO ) {
                                newApp.push()
                            }
                        }
                    }
                }
                stage('Clean Up') {
                    steps {
                        sh "docker rmi $IMAGEN:$BUILD_NUMBER"
                        }
                }
            }
        }
    }
}

Junto al Jenkinsfile, en el repositorio se deben incluir también el resto de ficheros que permiten la construcción de la imagen como el Dockerfile, el script de inicio de la imagen Docker o el fichero docker-compose que permite desplegar la imagen junto a una base de datos.

  • Dockerfile
  • Script
  • docker-compose
FROM python:3.12.1-bookworm
WORKDIR /usr/src/app
COPY * .
COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
RUN chmod +x /usr/local/bin/docker-entrypoint.sh \
&& pip install mysqlclient \
&& pip install --no-cache-dir --break-system-packages -r requirements.txt
EXPOSE 3000
ENV URL_BASE=http://localhost
ENV DJANGO_MAIL=mail@mail.org
ENV DJANGO_USER=admin
ENV DJANGO_PASS=admin
CMD /usr/local/bin/docker-entrypoint.sh
#!/bin/bash
export DJANGO_SUPERUSER_PASSWORD=$DJANGO_PASS
cd /usr/src/app
curl https://raw.githubusercontent.com/vishnubob/wait-for-it/refs/heads/master/wait-for-it.sh > wait-for-it.sh
chmod +x wait-for-it.sh
./wait-for-it.sh db:3306 --timeout=30 --strict
python3 manage.py migrate
python3 manage.py createsuperuser --username $DJANGO_USER --email $DJANGO_MAIL --noinput
python3 manage.py runserver 0.0.0.0:3000
services:
  app:
    container_name: publicaciones
    image: fjhuete/polls
    restart: always
    environment:
      URL_BASE: ${URL_BASE}
      DB_HOST: ${DB_HOST}
      DB_USER: ${DB_USER}
      DB_PASS: ${DB_PASS}
      DB: ${DB}
      DJANGO_MAIL: ${DJANGO_MAIL}
      DJANGO_USER: ${DJANGO_USER}
      DJANGO_PASS: ${DJANGO_PASS}
    ports:
      - ${PUERTO}:3000
    depends_on:
      - db
  db:
    container_name: django_db
    image: mariadb:${VERSION_MARIADB}
    restart: always
    environment:
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    volumes:
      - django_data:/var/lib/mysql
volumes:
    django_data:

Adicionalmente, se puede configurar el pipeline de Jenkins para que se envíe un correo electrónico cada vez que se ejecute la tarea con el resultado de la ejecución.

pipeline {
    ...
    stages {
    ...
    }
    post {
        always {
        mail to: 'correo@javihuete.site',
        subject: "Estado del pipeline: ${currentBuild.fullDisplayName}",
        body: "El despliegue ${env.BUILD_URL} ha tenido como resultado: ${currentBuild.result}"
        }
    }
}
comments powered by Disqus

Relacionados

Configuración y activación de SELinux

En esta entrada se configura el sistema de seguridad avanzada de SELinux en un sistema operativo Rocky Linux 9 para permitir el uso de diferentes protocolos de comunicación en red.

Leer

Configuración de un proxy inverso en Apache2

A través de un caso práctica se muestran diferentes ejemplos de configuración de un proxy inverso usando Apache2.

Leer

Creación de Replica Sets en kubernetes

Para crear un ReplicaSet, en primer lugar, se declara el recurso en un fichero yaml.

Leer