Menggunakan GitHub CI untuk Proyek Elixir

Pada bulan Oktober, Github meluncurkan tindakan yang memungkinkan Anda untuk mengeksekusi CI tanpa meninggalkan meja kas tempat kode ini disimpan. Ini benar-benar sangat nyaman. Segera setelah seseorang mengirim permintaan tarik , atau hanya mengunggah perubahan baru ke server, atau sesuatu yang spesial (daftar peristiwa yang tindakannya dapat dikencangkan dapat ditemukan dalam dokumentasi resmi ), majelis dimulai. Tugas berulang yang dijadwalkan ( berbasis cron ) juga didukung.


Anda bisa membuat pipa aksi yang disebut alur kerja . Dan semua ini indah, dan tampak seperti masa depan yang cerah - dengan pengecualian dokumentasi.


Butuh waktu lebih dari satu jam untuk mencari cara membuat wadah dengan layanan pihak ketiga untuk menguji aplikasi. Inilah yang saya berhasil temukan. Harap dicatat bahwa dokumentasi resmi itu benar-benar canggung, tidak lengkap, dan seringkali salah.


Tindakan CI standar menggunakan file konfigurasi dengan sintaksis yang sangat mirip dengan yang digunakan oleh CircleCI . Ini hanya YAML tua yang baik, yang memungkinkan Anda untuk mengonfigurasi OS target, lingkungan, perintah untuk dieksekusi, dll. Tindakan itu sendiri menerima nama unik , yang memungkinkan Anda untuk merujuk ke tindakan lain dan bergantung padanya.


Selain itu, konfigurasi memungkinkan Anda menentukan layanan . Layanan harus berjalan di suatu tempat di cloud, dan GH akan memetakan port kontainer ke port yang diekspos oleh layanan ini, sesuai dengan konfigurasi. Bagian ini tidak tercakup dalam dokumentasi resmi, dan bahkan apa yang dijelaskan mengandung kesalahan.


Berikut adalah contoh konfigurasi yang berfungsi untuk proyek Elixir yang membutuhkan layanan RabbitMQ dan Redis untuk diuji.


 name: Tests for My Project on: [push, pull_request] jobs: build: runs-on: ubuntu-latest container: image: elixir:1.9.1-slim services: rabbitmq: image: rabbitmq ports: - 5672:5672 env: RABBITMQ_USER: guest RABBITMQ_PASSWORD: guest RABBITMQ_VHOST: "/" redis: image: redis ports: - 6379:6379 steps: - uses: actions/checkout@v1 - name: Install Dependencies run: | MIX_ENV=ci mix local.rebar --force MIX_ENV=ci mix local.hex --force MIX_ENV=ci mix deps.get - name: Run All Tests run: | MIX_ENV=ci mix test env: RABBITMQ_HOST: rabbitmq RABBITMQ_PORT: ${{ job.services.rabbitmq.ports[5672] }} REDIS_HOST: redis REDIS_PORT: ${{ job.services.redis.ports[6379] }} 

Seperti yang Anda lihat, tes akan berjalan di Ubuntu menggunakan Elixir v1.9.1. Layanan dijelaskan di bawah layanan utama, dan di sini dimulai kisah detektif murni. Port fisik tempat port layanan akan diikat dipilih secara acak oleh mesin kontainer pada saat run time dan disimpan dalam variabel shell internal bernama job.services.rabbitmq.ports[5672] . rabbitmq adalah nama layanan, seperti yang ditunjukkan dalam file ini di bagian layanan , dan 5672 adalah port sumber. Variabel internal memiliki sintaks $ {{foo}} dan diteruskan ke variabel lingkungan RABBITMQ_PORT (blok pengaturan terakhir, di bawah kunci env ). Di RABBITMQ_HOST - Anda harus memasukkan nama layanan, seperti di bawah kunci layanan . Sekarang aplikasi dapat membaca variabel lingkungan seperti biasa dan port akan digulir dengan benar.


Ini adalah bagaimana kita akan membaca variabel lingkungan ini dari lingkungan (ini adalah konfigurasi untuk Elixir , untuk bahasa lain akan ada sesuatu yang sangat mirip).


 import Config config :my_app, rabbitmq: [ host: System.get_env("RABBITMQ_HOST"), password: "guest", port: String.to_integer(System.get_env("RABBITMQ_PORT", "5672")), username: "guest", virtual_host: "/", x_message_ttl: "4000" ] 

Dalam file proyek, saya membuat lingkungan khusus :ci , untuk membedakan antara konfigurasi untuk tes yang dilakukan di lingkungan lokal, dan untuk tes yang sama yang dilakukan di suatu tempat di luar sana di awan.


Selain itu, dalam pipa CI , saya menjalankan dialyzer pada sumber saya. Karena berjalan di dalam wadah, tugas tersebut membutuhkan waktu, karena Anda harus membangun kembali plts dari awal setiap kali. Itu sebabnya saya melakukan ini sekali sehari menggunakan opsi konfigurasi schedule .


 name: Dialyzer for My Project on: schedule: - cron: "0 1 * * *" jobs: build: runs-on: ubuntu-latest container: image: elixir:1.9.1-slim steps: - uses: actions/checkout@v1 - name: Install Dependencies run: | MIX_ENV=ci mix local.rebar --force MIX_ENV=ci mix local.hex --force MIX_ENV=ci mix deps.get - name: Run All Tests run: | MIX_ENV=ci mix code_quality 

di sini code_quality adalah tugas alias yang dideklarasikan di mix.exs


 defp aliases do [ code_quality: ["format", "credo --strict", "dialyzer"] ] end 

Di sini, secara umum, hanya itu yang kami butuhkan untuk pengujian bahagia suatu proyek dengan dependensi eksternal dalam alur kerja Github baru.


Integrasi berkelanjutan yang berhasil!

Source: https://habr.com/ru/post/id481846/


All Articles