Saat ini agen Jenkins kami membuat docker-compose.yml untuk setiap project Rails kami dan kemudian menjalankan docker-compose up. Docker-compose.yml memiliki container "web" utama yang memiliki rbenv dan semua dependensi Rails lainnya di dalamnya. Ini ditautkan ke penampung DB yang berisi tes Postgres DB.
Masalahnya muncul ketika kita benar-benar perlu menjalankan tes dan menghasilkan kode keluar. Server CI kami hanya akan men-deploy jika skrip pengujian menampilkan exit 0, tetapi docker-compose selalu menampilkan 0, bahkan jika salah satu perintah container gagal.
Masalah lainnya adalah penampung DB berjalan tanpa batas, bahkan setelah penampung web selesai menjalankan pengujian, jadi docker-compose up
tidak pernah kembali.
Adakah cara agar kami dapat menggunakan docker-compose untuk proses ini? Kita harus dapat menjalankan penampung, tetapi keluar setelah penampung web selesai dan mengembalikan kode keluarnya. Saat ini kami terjebak secara manual menggunakan buruh pelabuhan untuk memutar wadah DB dan menjalankan wadah web dengan opsi --link.
sumber
docker-compose
1.12.0 dan yang lebih baru. Mungkin itu kasusmu juga. Contoh bisa menjadi:docker-compose up --exit-code-from test-unit
. Perhatikan bahwa itu tidak berhasil untuk saya sampai saya menambahkanset -e
di awal skrip saya.--exit-code-from
tidak bekerja dengan baik-d
. Ini akan membuang kesalahan ini:using --exit-code-from implies --abort-on-container-exit
dan--abort-on-container-exit and -d cannot be combined.
docker-compose run
adalah cara sederhana untuk mendapatkan status keluar yang Anda inginkan. Sebagai contoh:Alternatifnya, Anda memiliki opsi untuk memeriksa wadah yang mati. Anda dapat menggunakan
-f
bendera untuk mendapatkan status keluar saja.Adapun db container yang tidak pernah kembali, jika Anda menggunakan
docker-compose up
maka Anda perlu sigkill container itu; itu mungkin bukan yang Anda inginkan. Sebagai gantinya, Anda dapat menggunakandocker-compose up -d
untuk menjalankan kontainer Anda dengan daemonized, dan secara manual mematikan kontainer ketika pengujian Anda selesai.docker-compose run
harus menjalankan wadah tertaut untuk Anda, tetapi saya telah mendengar obrolan di SO tentang bug yang mencegahnya berfungsi sebagaimana dimaksud saat ini.sumber
docker-compose logs
-T
Membangun jawaban kojiro:
docker-compose ps -q | xargs docker inspect -f '{{ .State.ExitCode }}' | grep -v '^0' | wc -l | tr -d ' '
Menampilkan berapa banyak kode keluar bukan-0 yang dikembalikan. Akan menjadi 0 jika semuanya keluar dengan kode 0.
sumber
docker-compose ps
, misalnya:docker-compose ps | grep -c "Exit 1"
akan memberi Anda hitungan di mana "Keluar 1" dicocokkan dalam tampilan daridocker-compose ps
(yang menyediakan tabel ringkasan hasil yang dicetak cantik). Kode keluar terdaftar di kolom "Negara".Jika Anda bersedia menggunakan
docker-compose run
untuk memulai pengujian secara manual, menambahkan--rm
tanda, anehnya, menyebabkan Tulis secara akurat mencerminkan status keluar perintah Anda.Inilah contoh saya:
sumber
(docker-compose run --rm ...) || exit $?
untuk penghentian jika terjadi kesalahan. Berguna dalam skrip bash.Gunakan
docker wait
untuk mendapatkan kode keluar:foo
adalah "nama proyek". Dalam contoh di atas, saya menetapkannya secara eksplisit, tetapi jika Anda tidak menyediakannya, itu adalah nama direktori.bar
adalah nama yang Anda berikan ke sistem yang diuji di docker-compose.yml Anda.Perhatikan bahwa
docker logs -f
melakukan hal yang benar juga, keluar saat container berhenti. Jadi Anda bisa meletakkanantara
docker-compose up
dandocker wait
sehingga Anda dapat melihat pengujian Anda berjalan.sumber
--exit-code-from SERVICE
dan--abort-on-container-exit
tidak berfungsi dalam skenario di mana Anda perlu menjalankan semua penampung hingga selesai, tetapi gagal jika salah satu penampung ditutup lebih awal. Contohnya mungkin jika menjalankan 2 setelan pengujian secara bersamaan di penampung yang berbeda.Dengan saran @ spendhil, Anda dapat menggabungkan
docker-compose
skrip yang akan gagal jika ada container yang gagal.Kemudian di server CI Anda cukup ubah
docker-compose up
ke./docker-compose.sh up
.sumber
docker-rails memungkinkan Anda untuk menentukan kode kesalahan penampung mana yang dikembalikan ke proses utama, sehingga server CI Anda dapat menentukan hasilnya. Ini adalah solusi yang bagus untuk CI dan pengembangan rel dengan buruh pelabuhan.
Sebagai contoh
di Anda
docker-rails.yml
akan menghasilkanweb
kode keluar kontainer sebagai hasil dari perintahdocker-rails ci test
.docker-rails.yml
hanyalah pembungkus meta di sekitar standardocker-compose.yml
yang memberi Anda potensi untuk mewarisi / menggunakan kembali konfigurasi dasar yang sama untuk lingkungan yang berbeda, yaitu pengembangan vs pengujian vs pengujian paralel.sumber
Jika Anda mungkin menjalankan lebih banyak layanan penulisan buruh pelabuhan dengan nama yang sama di satu mesin buruh pelabuhan, dan Anda tidak tahu nama persisnya:
echo %?
- mengembalikan kode keluar dari layanan test-chromeManfaat:
sumber
Anda dapat melihat status keluar dengan:
echo $(docker-compose ps | grep "servicename" | awk '{print $4}')
sumber
docker-compose ps | grep servicename | grep -v 'Exit 0' && echo "Automation or integration tests failed." && exit 1