Cómo ejecutar compilaciones en contenedores Docker desde Jenkins

18

Estoy tratando de usar Jenkins para construir un proyecto C ++ en un contenedor Docker. No tengo problemas para construir en Jenkins, o construir en un contenedor fuera de Jenkins.

A continuación se muestra lo que intenté. Estoy omitiendo el mapeo de volúmenes para mayor claridad.

Caso 1

El siguiente comando ejecuta con éxito una compilación en un shell.

docker run --rm --interactive=true --tty=true $IMAGE make

Sin embargo, cuando se ejecuta en Jenkins como un paso "ejecutar shell", Docker devuelve el siguiente error.

cannot enable tty mode on non tty input

Caso 2

El siguiente comando es similar al anterior pero desactiva la interactividad.

docker run --rm $IMAGE make

Jenkins puede ejecutar una compilación con éxito. Sin embargo, hay problemas serios al abortar una compilación. La compilación se marca inmediatamente como abortada, pero el contenedor continúa ejecutándose hasta que se completa la compilación. Además, el contenedor no se retira después de salir.

Cuando se ejecuta en un shell, el comando se compila correctamente pero no es posible interrumpirlo. Además, el contenedor se retira después de salir.

Pregunta

¿Alguien sabría cómo ejecutar compilaciones limpiamente en contenedores Docker desde Jenkins y retener la capacidad de abortar compilaciones?

El uso de cualquiera de los complementos de Jenkins no es una opción porque las llamadas de Docker están dentro de los scripts y no se pueden extraer fácilmente.

marcv81
fuente
1
¿Quizás con un trabajo posterior a la compilación cuya tarea es eliminar el contenedor? Y para los casos en que aborta una compilación, ¿tal vez podría tener una compilación especial que detenga y elimine todos los contenedores espurios? Esto no es óptimo, pero al menos, es una solución fácil de configurar. :-)
lgeorget
1
Esto no coincide con mi definición de limpio :) Pero agradezco la sugerencia, y ciertamente es una solución válida.
marcv81 01 de

Respuestas:

3

La forma más fácil de ejecutar las compilaciones de la ventana acoplable en Jenkins es utilizar el trabajo de canalización. Tiene muchos complementos incorporados que podrían controlar su entorno Docker y sus contenedores.

algunos ejemplos son

    docker.image("image-name").run() -Runs the container from the image 
    docker.image("image-name").inside(){//your commands} -Runs your commands inside the docker container and also removes your container as soon as your commands are executed.

Para más información: https://www.cloudbees.com/blog/orchestrating-workflows-jenkins-and-docker

velsim
fuente
2

Puede implementar el siguiente flujo de trabajo:

  1. cree un contenedor acoplable y especifique un nombre para que pueda consultarlo fácilmente (por ejemplo, en scripts)
  2. iniciarlo y usar algo como punto de entrada que mantenga el contenedor funcionando
  3. Úselo docker exec container cmd ...para emitir sus comandos de compilación y prueba
  4. Detener el contenedor
  5. Eliminar la imagen

El docker exec ...es como un acceso de shell remoto a una máquina de red. Por defecto no es interactivo y tampoco asigna un tty. Esto debería estar bien para compilar y ejecutar conjuntos de pruebas. El comando reenvía correctamente el estado de salida del comando ejecutado dentro del contenedor.

Un trabajo de compilación se puede cancelar mediante:

  • docker stop container (envía TERM y KILL y espera en el medio), o
  • docker kill container, o incluso
  • docker exec container pkill someexecutable

El flujo de trabajo con comandos concretos:

$ docker create --name cxx-devel \
    -v $HOME/src:/srv/src:ro -v $HOME/build:/srv/build \
    gsauthof/fedora-cxx-devel:23
$ docker start cxx-devel     # <- entrypoint is /usr/bin/sleep infinity
$ docker exec cxx-devel /srv/src/projecta/build.sh
$ docker exec cxx-devel /srv/src/projecta/check.sh
$ docker stop cxx-devel
$ docker rm cxx-devel

Para ver un ejemplo real que utiliza este flujo de trabajo, puede ver este archivo .travis.yml , los scripts de CI reales , el script que se ejecuta dentro del contenedor y los archivos acoplables de las imágenes utilizadas.

maxschlepzig
fuente