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

Firmas y autenticación con GPG

En esta entrada se explica cómo firmar claves públicas usando GPG.

Leer

Creación de recursos de tipo Ingress en kubernetes

Para acceder a una aplicación usando una URL es necesario configurar un recurso de tipo ingress. En este caso, se parte de [este despliegue previo](Creación de Servicios)

Leer

Enrutamiento dinámico con OSPF usando routers Linux en GNS3

En este post se muestra el funcionamiento del protocolo de enrutamiento dinámico OSPF, un protocolo de red para enrutamiento dinámico que usa el algoritmo Dijkstra, para calcular la ruta más corta entre dos nodos de la red, en los routers Linux de este escenario basado en la saga “Los juegos del hambre”.

Leer