Próbuję użyć Jenkinsa do zbudowania projektu C ++ w kontenerze Docker. Nie mam problemu z budowaniem w Jenkins ani budowaniem w kontenerze poza Jenkins.
Poniżej próbowałem. Dla jasności pomijam mapowanie woluminów.
Przypadek 1
Następujące polecenie z powodzeniem uruchamia kompilację w powłoce.
docker run --rm --interactive=true --tty=true $IMAGE make
Jednak po uruchomieniu w Jenkinsie jako „wykonanie powłoki” krok Docker zwraca następujący błąd.
cannot enable tty mode on non tty input
Przypadek 2
Poniższe polecenie jest podobne do poprzedniego, ale wyłącza interaktywność.
docker run --rm $IMAGE make
Jenkins może pomyślnie uruchomić kompilację. Istnieją jednak poważne problemy podczas przerywania kompilacji. Kompilacja jest natychmiast oznaczana jako przerwana, ale kontener działa, dopóki kompilacja nie zostanie ukończona. Również pojemnik nie jest usuwany po wyjściu.
Po uruchomieniu w powłoce polecenie buduje się pomyślnie, ale nie można go przerwać. Również pojemnik jest wyjmowany po wyjściu.
Pytanie
Czy ktokolwiek wiedziałby, jak czysto uruchamiać kompilacje w kontenerach Docker od Jenkinsa i zachować możliwość przerywania kompilacji?
Użycie żadnej wtyczki Jenkins nie jest opcją, ponieważ wywołania Docker znajdują się w skryptach i nie można ich łatwo wyodrębnić.
Odpowiedzi:
Najprostszym sposobem na uruchomienie kompilacji dokerów w Jenkins jest użycie zadania potoku. Ma wiele wbudowanych wtyczek, które mogą kontrolować twoje środowisko Dockera i kontenery.
kilka przykładów to
Aby uzyskać więcej informacji: https://www.cloudbees.com/blog/orchestrating-workflows-jenkins-and-docker
źródło
Możesz wdrożyć następujący przepływ pracy:
docker exec container cmd ...
do wydawania poleceń kompilacji i testowaniaTo
docker exec ...
jest jak zdalny dostęp powłoki do komputera sieciowego. Domyślnie nie jest interaktywny i nie przydziela tty. Powinno to być odpowiednie do kompilowania i wykonywania zestawów testowych. Polecenie poprawnie przekazuje status wyjścia polecenia wykonanego w kontenerze.Zadanie kompilacji można następnie przerwać przez:
docker stop container
(wysyła TERM i KILL i czeka pomiędzy), lubdocker kill container
, lub nawetdocker exec container pkill someexecutable
Przepływ pracy z konkretnymi poleceniami:
Dla prawdziwego przykładu, który korzysta z tego przepływu pracy, możesz zobaczyć ten plik .travis.yml , rzeczywiste skrypty CI , skrypt działający w kontenerze i pliki dokera używanych obrazów.
źródło