Closed gsyjdcg closed 2 years ago
He probado a utilizar como agente docker la imagen "youmoni/jdk11-docker" que incluye la jdk y docker y con esto funciona.
pipeline { agent { docker { image 'youmoni/jdk11-docker' args '--network ci --mount type=volume,source=ci-maven-home,target=/root/.m2' } } .... }
Hola @gsyjdcg gracias por el mensaje y confirmar además cómo lo resolviste.
En esencia es como comentas: el comando docker no estaba disponible en el contenedor que estaba ejecutando el pipeline. En el caso del primer setup sobre el que monté la workshop, utilizaba como "truco" el binding del comando ejecutable docker de mi propia máquina dentro del contenedor, de forma que cuando ejecutaba docker el pipeline, realmente lo ejecutaba directamente en mi máquina.
Como tú lo has resuelto es una buena alternativa.
Otra forma de hacerlo, además más elegante para uso productivo y si tienes una plataforma Kubernetes a tu disposición, es lanzar el pipe en un pod con más de un contenedor, p.ej. uno con java/maven, otro con docker (o con kaniko como alternativa viable a docker). Algo así como:
pipeline {
agent {
kubernetes {
yaml '''
metadata:
namespace: nombre-del-namespace
labels:
slave-pod: java17-builder
spec:
containers:
- name: maven
image: url-al-container-registry/maven:3.8.4-eclipse-temurin-17
### resto de config del contenedor
- name: kaniko
image: url-al-container-registry/kaniko:stable
### resto de config del contenedor
### resto de la definición del pod
'''
}
}
}
Mucho más elegante sería definir el Yaml de tu "builder pod" como pod template en Jenkins. Así además de ser fácilmente reutilizable de un pipe a otro, si necesitas hacer cambios que afecten a todos tus pipes del mismo arquetipo de proyecto (p.ej. todos los pipes Java Spring Boot con Maven) solo tienes que cambiar el pod template y los pipes no tienes que tocarlos.
Hola Jorge.
Estoy aprendiendo a usar Jenkins y vi tu vídeo en Internet donde explicabas como usabais vosotros Jenkins y me pareció muy interesante y lógica la manera en la que diseñais vuestros Pipelines.
Me decidí a intentar ejecutar dicho Pipeline pero me da un error en el paso donde se intenta correr la imagen de la aplicación en un contenedor de docker. El error concretamente es:
/var/jenkins_home/workspace/docker-image-agent-pipeline@tmp/durable-61c26a45/script.sh: 1: /var/jenkins_home/workspace/docker-image-agent-pipeline@tmp/durable-61c26a45/script.sh: docker: Permission denied
Y la línea donde está intentado arrancar el contenedor con la imagen de la aplicación es:
sh "docker run --name ${TEST_CONTAINER_NAME} --detach --rm --network ci --expose ${APP_LISTENING_PORT} --expose 6300 --env JAVA_OPTS='-Dserver.port=${APP_LISTENING_PORT} -Dspring.profiles.active=ci -javaagent:/jacocoagent.jar=output=tcpserver,address=*,port=6300' ${ORG_NAME}/${APP_NAME}:latest"
He probado simplementa a ejecutar sh "docker --version" y el resultado es el mismo.
No soy un experto en Jenkins pero no se si este paso se está intentando ejecutar dentro del agente que se ha configurado al principio que es un docker con la imagen de la sdk de java y puede ser que este contenedor no tenga docker instalado y por eso falle. O puede se que me falte por instalar algún plugin o configurar algo.
Muchas gracias por compartir tus conocimientos.