Instalación de Jenkins usando Docker como runner

Índice

En primer lugar, en un equipo con Docker instalado instalamos también Jenkins.

sudo apt update
sudo apt install fontconfig openjdk-17-jre
sudo wget -O /usr/share/keyrings/jenkins-keyring.asc \
  https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
  https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
  /etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt update
sudo apt install jenkins

Para que Jenkins pueda usar docker como runner hay que añadir el usuario jenkins al grupo docker.

sudo usermod -aG docker jenkins

Para configurar la aplicación se accede a la IP de la máquina en el puerto 8080 y se indica la contraseña que se ha generado en el directorio /var/lib/jenkins/secrets/initialAdminPassword durante la instalación.

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

En adelante, la instalación es interactiva a través de la interfaz gráfica del navegador.

Para poder usar Jenkins con Docker, en el menú Administrar Jenkins -> Plugins se instalan los plugins Docker y Docker Pipeline.

Después se configura una nueva cloud en Administrar Jenkins -> Nodes -> Clouds. Esta nube debe ser de tipo docker y, en la configuración, se indica el socket unix de docker.

unix:///var/run/docker.sock

Para aplicar la configuración hay que reiniciar el servicio.

sudo systemctl restart jenkins.service

Y después, se puede hacer una prueba con un pipeline de ejemplo.

pipeline {
    agent {
        docker { image 'python:3' }
    }
    stages {
        stage('Test') {
            steps {
                sh 'python --version'
            }
        }
    }
}

La ejecución de este pipeline tiene el siguiente resultado:

Started by user admin
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /var/lib/jenkins/workspace/Prueba@2
[Pipeline] {
[Pipeline] isUnix
[Pipeline] withEnv
[Pipeline] {
[Pipeline] sh
+ docker inspect -f . python:3

Error: No such object: python:3
[Pipeline] isUnix
[Pipeline] withEnv
[Pipeline] {
[Pipeline] sh
+ docker pull python:3
3: Pulling from library/python
a492eee5e559: Pulling fs layer
32b550be6cb6: Pulling fs layer
35af2a7690f2: Pulling fs layer
7576b00d9bb1: Pulling fs layer
42c54e83066f: Pulling fs layer
d49ecfcc3fa9: Pulling fs layer
b2eee27aad58: Pulling fs layer
42c54e83066f: Waiting
d49ecfcc3fa9: Waiting
b2eee27aad58: Waiting
7576b00d9bb1: Waiting
32b550be6cb6: Verifying Checksum
32b550be6cb6: Download complete
a492eee5e559: Verifying Checksum
a492eee5e559: Download complete
35af2a7690f2: Verifying Checksum
35af2a7690f2: Download complete
42c54e83066f: Verifying Checksum
42c54e83066f: Download complete
b2eee27aad58: Verifying Checksum
b2eee27aad58: Download complete
d49ecfcc3fa9: Verifying Checksum
d49ecfcc3fa9: Download complete
a492eee5e559: Pull complete
32b550be6cb6: Pull complete
7576b00d9bb1: Verifying Checksum
7576b00d9bb1: Download complete
35af2a7690f2: Pull complete
7576b00d9bb1: Pull complete
42c54e83066f: Pull complete
d49ecfcc3fa9: Pull complete
b2eee27aad58: Pull complete
Digest: sha256:08471c63c5fdf2644adc142a7fa8d0290eb405cda14c473fbe5b4cd0933af601
Status: Downloaded newer image for python:3
docker.io/library/python:3
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] withDockerContainer
Jenkins does not seem to be running inside a container
$ docker run -t -d -u 104:109 -w /var/lib/jenkins/workspace/Prueba@2 -v /var/lib/jenkins/workspace/Prueba@2:/var/lib/jenkins/workspace/Prueba@2:rw,z -v /var/lib/jenkins/workspace/Prueba@2@tmp:/var/lib/jenkins/workspace/Prueba@2@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 ******** -e ******** -e ******** -e ******** python:3 cat
$ docker top 9e57b359c48d8132334c635b8e6e98a7893f54c52fa02a2007cf81e1262ef040 -eo pid,comm
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] sh
+ python --version
Python 3.13.2
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
$ docker stop --time=1 9e57b359c48d8132334c635b8e6e98a7893f54c52fa02a2007cf81e1262ef040
$ docker rm -f --volumes 9e57b359c48d8132334c635b8e6e98a7893f54c52fa02a2007cf81e1262ef040
[Pipeline] // withDockerContainer
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
comments powered by Disqus

Relacionados

Cómo configurar Windows 11 sin conexión a Internet

Hoy, en la empresa en la que estoy haciendo mis prácticas, he tenido que configurar un nuevo equipo con Windows 11. Por varias razones puede que, cuando nos enfrentemos a esta tarea, no tengamos acceso a Internet. En este caso, la red local requiere una validación para poder acceder a ella pero, en otros, puede ocurrir que simplemente no tengas una red wifi a la conectarte o un cable de red a mano. El asistente de configuración de Windows 11 tal y como viene programado por defecto en los nuevos equipos no permite configurar el sistema operativo si no se establece una conexión entre el ordenador e Internet. Pero hay una forma de evitar esta limitación.

Leer

Instalación de Docker

Existen dos opciones para instalar Docker en Debian: usando la distribución de Docker Community Edition o usando los repositorios oficiales de Debian. En este post se muestra un ejemplo de cada caso

Leer

Creación de un escenario con varios contenedores con docker compose

Para implantar una aplicación nextcloud en un contenedor docker conectada a otro contenedor con una base de datos MariaDB se puede usar un fichero docker compose para configurar el escenario.

Leer