Saya mencoba menggunakan Jenkins untuk membangun proyek C ++ di wadah Docker. Saya tidak punya masalah membangun di Jenkins, atau membangun di wadah di luar Jenkins.
Di bawah ini yang saya coba. Saya menghilangkan pemetaan volume untuk kejelasan.
Kasus 1
Perintah berikut berhasil menjalankan build di shell.
docker run --rm --interactive=true --tty=true $IMAGE make
Namun ketika dijalankan di Jenkins sebagai "eksekusi shell" langkah Docker mengembalikan kesalahan berikut.
cannot enable tty mode on non tty input
Kasus 2
Perintah berikut ini mirip dengan yang sebelumnya tetapi menonaktifkan interaktivitas.
docker run --rm $IMAGE make
Jenkins dapat menjalankan build dengan sukses. Namun ada masalah serius saat membatalkan pembangunan. Bangunan segera ditandai sebagai dibatalkan tetapi wadah terus berjalan sampai selesai. Juga wadah tidak dilepas setelah keluar.
Ketika dijalankan di shell, perintah berhasil dibuat tetapi tidak mungkin untuk menghentikannya. Wadah juga dilepas setelah keluar.
Pertanyaan
Adakah yang tahu cara menjalankan build dengan rapi dalam wadah Docker dari Jenkins dan mempertahankan kemampuan untuk membatalkan build?
Menggunakan salah satu plugin Jenkins bukanlah suatu pilihan karena panggilan Docker ada di dalam skrip dan tidak dapat diekstraksi dengan mudah.
Jawaban:
Cara termudah untuk menjalankan bangunan buruh pelabuhan di Jenkins adalah dengan menggunakan pekerjaan saluran pipa. Sudah ada banyak plugin bawaan yang dapat mengontrol lingkungan dan wadah Docker Anda.
beberapa contohnya
Untuk info lebih lanjut: https://www.cloudbees.com/blog/orchestrating-workflows-jenkins-and-docker
sumber
Anda dapat menerapkan alur kerja berikut:
docker exec container cmd ...
untuk mengeluarkan perintah build dan test AndaIni
docker exec ...
seperti akses shell jarak jauh ke mesin jaringan. Secara default itu tidak interaktif dan juga tidak mengalokasikan tty. Ini harus baik untuk mengkompilasi dan menjalankan test suite. Perintah dengan benar meneruskan status keluar dari perintah yang dieksekusi di dalam wadah.Pekerjaan build kemudian dapat dibatalkan melalui:
docker stop container
(mengirim TERM dan KILL dan menunggu di antaranya), ataudocker kill container
, atau bahkandocker exec container pkill someexecutable
Alur kerja dengan perintah konkret:
Untuk contoh nyata yang menggunakan alur kerja ini, Anda dapat melihat file .travis.yml ini , skrip CI aktual , skrip yang berjalan di dalam wadah dan file buruh pelabuhan dari gambar yang digunakan.
sumber