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.
Respuestas:
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
Para más información: https://www.cloudbees.com/blog/orchestrating-workflows-jenkins-and-docker
fuente
Puede implementar el siguiente flujo de trabajo:
docker exec container cmd ...
para emitir sus comandos de compilación y pruebaEl
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), odocker kill container
, o inclusodocker exec container pkill someexecutable
El flujo de trabajo con comandos concretos:
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.
fuente