Come eseguire build nei contenitori Docker di Jenkins


18

Sto cercando di usare Jenkins per costruire un progetto C ++ in un contenitore Docker. Non ho problemi a costruire a Jenkins, o in un container fuori da Jenkins.

Di seguito è quello che ho provato. Sto omettendo la mappatura dei volumi per chiarezza.

Caso 1

Il seguente comando esegue correttamente una build in una shell.

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

Tuttavia, quando eseguito in Jenkins come passaggio "esegui shell", Docker restituisce il seguente errore.

cannot enable tty mode on non tty input

Caso 2

Il seguente comando è simile al precedente ma disabilita l'interattività.

docker run --rm $IMAGE make

Jenkins può eseguire correttamente una build. Tuttavia, ci sono problemi seri quando si interrompe una build. La compilazione viene immediatamente contrassegnata come interrotta ma il contenitore continua a funzionare fino al completamento della compilazione. Inoltre, il contenitore non viene rimosso dopo essere uscito.

Quando viene eseguito in una shell, il comando viene compilato correttamente ma non è possibile interromperlo. Anche il contenitore viene rimosso dopo essere uscito.

Domanda

Qualcuno saprebbe come eseguire in modo pulito build nei contenitori Docker di Jenkins e conservare la capacità di interrompere le build?

L'uso di uno qualsiasi dei plugin Jenkins non è un'opzione perché le chiamate Docker sono all'interno di script e non possono essere estratte facilmente.


1
Forse con un lavoro post-build il cui compito è rimuovere il contenitore? E per i casi in cui interrompi una build, forse potresti avere una build speciale che si ferma e rimuove tutti i contenitori spuri? Questo non è ottimale ma almeno è una soluzione semplice da configurare. :-)
lgeorget,

1
Questo non corrisponde perfettamente alla mia definizione di pulito :) Ma apprezzo il suggerimento ed è sicuramente una soluzione valida.
marcv81,

Risposte:


3

Il modo più semplice per eseguire le build della finestra mobile in Jenkins è utilizzare il processo della pipeline. Ha molti plugin integrati che possono controllare l'ambiente e i contenitori Docker.

alcuni esempi sono

    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.

Per maggiori informazioni: https://www.cloudbees.com/blog/orchestrating-workflows-jenkins-and-docker


2

È possibile implementare il flusso di lavoro seguente:

  1. creare un contenitore finestra mobile e specificare un nome in modo tale da poterlo facilmente fare riferimento (ad es. negli script)
  2. avviarlo e utilizzare qualcosa come punto di ingresso che mantiene il contenitore in esecuzione
  3. Utilizzare docker exec container cmd ...per emettere i comandi di compilazione e test
  4. Ferma il contenitore
  5. Rimuovi l'immagine

L' docker exec ...è come un accesso shell remota a una macchina rete. Di default non è interattivo e non alloca nemmeno un tty. Questo dovrebbe andare bene per la compilazione e l'esecuzione di test suite. Il comando inoltra correttamente lo stato di uscita del comando eseguito all'interno del contenitore.

Un lavoro di compilazione può quindi essere interrotto tramite:

  • docker stop container (invia TERM e KILL e attende tra), o
  • docker kill container, o anche
  • docker exec container pkill someexecutable

Il flusso di lavoro con comandi concreti:

$ 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

Per un vero esempio che utilizza questo flusso di lavoro, puoi guardare questo file .travis.yml , gli script CI effettivi , lo script in esecuzione all'interno del contenitore e i file docker delle immagini utilizzate.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.