Staram się, aby Jenkins uruchomił następujące polecenie w oknie dokowanym na niewolniku Jenkins:
docker run -i -v `pwd`:/opt/myapp -w /opt/myapp -t mydockerimage /bin/bash -c "./setup_dev_env.sh && make all"
Problem polega na tym, że kiedy to uruchomię z wnętrza Jenkins Proces Dockera jest wywoływany, ale Jenkins nie czeka na niego i natychmiast zwraca sukces. Jeśli jednak zastąpię polecenie Docker nieskończoną pętlą, Jenkins będzie czekał, zgodnie z oczekiwaniami.
Kiedy uruchamiam to polecenie bezpośrednio z kompilatora slave, jako użytkownik Jenkinsa, system czeka na zakończenie komendy (co chcę zrobić).
Próbowałem zrobić docker attach
, ale to również wraca natychmiast. docker wait
spowoduje, że Jenkins będzie na to czekał, ale nie zobaczę żadnego wyjścia.
Być może źle to rozumiem ...
- Jak mogę sprawić, by Jenkins poczekał na zakończenie tego polecenia?
- Jak mogę uzyskać od Jenkinsa dane wyjściowe polecenia uruchomionego w kontenerze dokowania?
- Jak mogę ustawić kod wyjścia polecenia uruchomionego w programie Docker tak, aby Jenkins mógł określić, czy udało się, czy nie?
Odpowiedzi:
8 dla odpowiedzi № 1Okazuje się, że problemem był -t
w linii poleceń. Usuwanie -t
spowodował, że Jenkins poczekał na dokera, aby zakończyć to, co robi.
Miałem przeczucie, że tak było, ponieważ ttys mogączasami dziwne, a Jenkins prawdopodobnie używa innego typu tty (lub wcale) niż ja, kiedy uruchamiam to samo polecenie w wierszu poleceń powłoki.
W końcu ta komenda zadziałała:
docker run -i -v `pwd`:/opt/myapp -w /opt/myapp mydockerimage /bin/bash -c "./setup_dev_env.sh && make all"