Selamat siang
Hampir segera setelah menginstal dan mengkonfigurasi CI / CD sesuai dengan instruksi dari posting sebelumnya , tim memiliki pertanyaan tentang bagaimana melakukan pengujian integrasi dengan benar. Kami sudah memiliki pengalaman menjalankan dependensi pengujian dalam wadah buruh pelabuhan, tetapi ini telah menjadi masalah karena perakitan itu sendiri sekarang diluncurkan dalam wadah. Dalam artikel ini, saya ingin menjelaskan dua metode pengujian integrasi yang mungkin di dalam wadah yang sesuai dengan tim saya.
Persyaratan Pengujian Integrasi
Menurut definisi, pengujian integrasi adalah pengujian yang menguji operasi aplikasi dengan komponen dependennya. Contohnya termasuk basis data, antrian, dan layanan lainnya.
Sebagai bagian dari pengujian, kami ingin:
- jalankan tes secara lokal dan jenkins
- Hindari pra-instalasi dan konfigurasi aplikasi yang tergantung
- mendeklarasikan dan menjalankan dependensi menggunakan file dalam repositori proyek
- dapat menjalankan beberapa majelis secara paralel
- disarankan untuk dapat menambahkan dependensi baru di masa depan
- disarankan untuk dapat menguji dengan versi yang berbeda dari ketergantungan yang sama
Berdasarkan persyaratan ini, kami segera membuang gagasan untuk memiliki instalasi umum permanen dari basis data dan antrian uji karena masalah dengan berbagi sumber daya antar majelis, kesulitan mempertahankan dan mengubah infrastruktur ini.
Opsi 1: Solusi Tertanam
Ada beberapa perpustakaan di ekosistem java yang menjalankan dependensi untuk pengujian:
Pendekatan ini sesederhana mungkin dan memenuhi sebagian besar persyaratan yang dijelaskan sebelumnya, tetapi tidak universal dalam hal menambahkan dependensi tes baru (mysql?) Atau menggunakan versi dependensi tertentu atau banyak.
Sangat cocok untuk layanan sederhana dengan 1-2 dependensi.
Opsi 2: testcontainers
Docker adalah cara logis untuk mengatasi kekurangan dari pendekatan sebelumnya: Anda dapat menemukan (atau membuat gambar Docker) untuk setiap ketergantungan dengan versi apa pun. Mungkin beberapa dependensi dalam produksi berjalan menggunakan gambar yang sama.
Jika meluncurkan gambar secara lokal (atau beberapa menggunakan komposisi buruh pelabuhan) tidak menjadi masalah, maka akan ada kesulitan pada CI karena perakitan itu sendiri terjadi dalam wadah. Meskipun dimungkinkan untuk menjalankan buruh pelabuhan di buruh pelabuhan, itu tidak direkomendasikan oleh pencipta dind . Cara yang lebih disukai untuk mengatasi masalah ini adalah dengan menggunakan kembali proses buruh pelabuhan yang sudah berjalan, yang sering disebut saudara buruh pelabuhan. Untuk ini, proses buruh pelabuhan anak /var/run/docker.sock
menggunakan /var/run/docker.sock
dari induknya. Dalam posting sebelumnya, ini sudah digunakan untuk menerbitkan gambar buruh pelabuhan dengan aplikasi yang dikompilasi.
Diputuskan untuk menggunakan perpustakaan testcontainers karena:
- menyediakan api manajemen ketergantungan yang baik
- memiliki integrasi dengan database dan antrian paling populer
- menggunakan pendekatan buruh pelabuhan saat berjalan dalam wadah
- bekerja sama secara lokal dan pada ci
- berhenti wadah setelah perakitan
Sangat cocok untuk layanan yang lebih kompleks atau untuk layanan dengan persyaratan ketergantungan khusus.
Manajemen sumber daya
Selanjutnya, Anda harus memperhatikan konsumsi sumber daya oleh majelis proyek (yang dapat meningkat secara signifikan setelah menambahkan tes integrasi).
Saat ini, rakitan tidak menunjukkan jumlah memori dan cpu yang diperlukan, yang bisa menjadi dua masalah potensial:
- Yang pertama adalah terlalu banyak rakitan paralel pada mesin yang sama, yang akan menghasilkan faktor beban yang tinggi. Majelis mungkin akan lulus, tetapi mereka akan menghabiskan lebih banyak waktu untuk ini.
- Yang kedua adalah OOM kill. Kubernetis mungkin memutuskan bahwa Anda mengkonsumsi terlalu banyak memori dan hanya akan membunuh majelis sebelum mereka selesai.
Anda dapat membatasi sumber daya wadah di perapian menggunakan konstruksi:
resources: requests: cpu: 1 memory: 512Mi limits: cpu: 1 memory: 512Mi
Jdk9 dan di atas sudah memiliki dukungan untuk bekerja dalam wadah (-XX: + UseContainerSupport (diaktifkan secara default), bekerja dalam kombinasi dengan -XX: InitialRAMPercentage / -XX: MaxRAMPercentage)
Contoh lengkap dapat ditemukan di sini .
Agar Jdk8 berfungsi dengan benar, pembaruan 131 atau lebih tinggi diperlukan dengan -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap
untuk membaca memori yang tersedia dari cgroup dan bukan dari mesin host, atau setiap kali menentukan ukuran pinggul yang tersedia secara manual menggunakan Xmx
.
Contoh tersedia di sini .
Perlu dicatat bahwa kubernetes tidak tahu apa-apa tentang sumber daya yang dihabiskan untuk wadah yang menggunakan testcontainers atau sibling-docker. Untuk bekerja dengan benar dalam situasi ini, Anda dapat memesan sumber daya dalam wadah pakar, dengan mempertimbangkan semua dependensi pengujian.
Kesimpulan
Pengujian integrasi saat meluncurkan bangunan dalam wadah adalah mungkin dan bukan tugas yang sulit.
Contoh aplikasi dengan tes integrasi menggunakan testcontainers dapat Anda temukan di sini dan konfigurasi untuk menjalankan Jenkins di kubernetes di sini .