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

Guía básica de configuración de Nginx

En este post se recoge una guía básica del uso del servidor web Nginx a partir de un supuesto práctico.

Leer

Creación de credenciales en Jenkins

Las credenciales en Jenkin se crean en el menú Administrar Jenkins -> Credenciales -> Global -> Add Credentials.

Leer

Manejo y modificación de módulos del kernel

Aquí se recogen algunos ejercicios en los que se ponen en práctica diferentes herramientas para trabajar con los módulos del kernel de Linux.

Leer