Teks lengkapnya sebanyak 4.955 kata, dan waktu pembelajaran yang diharapkan adalah 25 menit
Sumber: unsplash
Apakah proyek Anda digunakan untuk mengembangkan aplikasi web, menangani masalah ilmu data atau AI, menggunakan CI / CD yang dikonfigurasi dengan baik, image Docker yang dapat di-debug selama pengembangan dan dioptimalkan untuk lingkungan produksi, atau beberapa alat kualitas kode lainnya, Dapat menguntungkan Anda.
Artikel ini akan memberi tahu Anda cara menambahkannya ke proyek Python!
Ini adalah gudang saya, yang berisi kode sumber dan dokumentasi lengkap: https://github.com/MartinHeinz/python-project-blueprint
Container Docker yang dapat di-debug untuk pengembangan
Beberapa orang tidak menyukai Docker karena container sulit untuk di-debug, atau karena image mereka membutuhkan waktu lama untuk dibuat. Jadi mari kita mulai dengan membangun image yang ideal untuk pengembangan, yang dapat dibangun dengan cepat dan mudah untuk di-debug.
Untuk membuat image mudah di-debug, diperlukan image dasar, yang mencakup semua alat yang mungkin diperlukan untuk debugging, seperti bash, vim, netcat, wget, cat, find, grep, dll.
python: 3.8.1-buster tampaknya ideal untuk tugas ini. Ini berisi banyak alat secara default, dan kami dapat dengan mudah menginstal semua hal yang hilang. Gambar dasar ini sangat berat, tetapi tidak penting karena hanya akan digunakan untuk pengembangan saat ini.
Anda mungkin telah memperhatikan bahwa saya memilih mirror yang sangat spesifik: versi Python dan versi Debian dikunci. Ini disengaja, karena kami ingin meminimalkan kemungkinan "korupsi" yang disebabkan oleh versi Python atau Debian yang lebih baru dan mungkin tidak kompatibel.
Sumber: techcrunch
Anda dapat menggunakan pencerminan berbasis Alpine sebagai alternatif. Namun, ini dapat menyebabkan beberapa masalah karena menggunakan musllibc bukan glibc, yang bergantung pada Python. Oleh karena itu, jika Anda memutuskan untuk memilih konfigurasi ini, ingatlah ini.
Untuk kecepatan build, kami akan menggunakan build multi-tahap untuk menyimpan cache sebanyak mungkin. Dengan cara ini, Anda dapat menghindari mengunduh dependensi dan alat seperti gcc dan semua pustaka (dalam requirement.txt) yang diperlukan oleh aplikasi.
Karena langkah-langkah yang diperlukan untuk mengunduh dan menginstal alat ini tidak dapat di-cache dalam gambar program yang sedang berjalan, kami akan menggunakan python yang disebutkan di atas: 3.8.1-buster untuk membuat gambar dasar khusus, yang akan berisi semua alat yang dibutuhkan, Sehingga untuk lebih meningkatkan kecepatan proses.
Karena itu, mari kita lihat Dockerfile:
# dev.Dockerfile FROMpython: 3.8.1-buster AS builder JALANKAN pembaruan apt-get apt-get install -y --no-install-recommends --yes python3-venv gcclibpython3-dev \ python3 -m venv / venv \ / venv / bin / pip instal --upgradepip DARI builder ASbuilder-venv COPYrequirements.txt /requirements.txt RUN / venv / bin / pipinstall -r /requirements.txt DARI builder-venv AStester COPY. / Aplikasi WORKDIR / aplikasi RUN / venv / bin / pytest FROMmartinheinz / python-3.8.1-buster-tools: runner AS terbaru COPY --from = tester / venv / venv COPY --from = tester / app / app WORKDIR / aplikasi TITIK MASUK PENGGUNA 1001 Nama LABEL = {NAME} LABELversion = {VERSION}Dari dokumen di atas, kita dapat melihat bahwa kita akan membuat 3 gambar perantara, dan kemudian membuat gambar akhir yang sedang berjalan. Gambar pertama disebut builder, dan ini mendownload semua pustaka yang diperlukan untuk membangun aplikasi akhir, termasuk lingkungan virtual gcc dan Python. Setelah penginstalan selesai, itu juga akan membuat lingkungan virtual sebenarnya untuk digunakan gambar berikutnya.
Berikutnya adalah gambar builder-venv, yang menyalin daftar dependensi (requirement.txt) ke gambar tersebut dan kemudian menginstalnya. Gambar perantara ini diperlukan untuk cache, karena pustaka hanya dipasang saat requirement.txt berubah, jika tidak, hanya cache yang digunakan.
Sebelum membuat gambar akhir, pertama-tama jalankan pengujian terhadap aplikasi tersebut. Inilah yang dilakukan cermin penguji. Kami menyalin kode sumber ke cermin dan menjalankan pengujian. Jika lolos, program akan berjalan ke pelari.
Untuk runner mirror, kami menggunakan mirror kustom, yang menyertakan beberapa fitur tambahan yang tidak ada di mirror Debian biasa, seperti vim atau netcat. Anda dapat menemukan gambar ini di sini di Docker Hub, dan Anda dapat memeriksa Dockerfile yang sangat sederhana ini di base.Dockerfile di sini.
Oleh karena itu, pekerjaan pada gambar akhir adalah sebagai berikut: pertama-tama salin lingkungan virtual, yang mempertahankan semua dependensi yang terinstal di gambar penguji, lalu salin aplikasi yang diuji.
Sekarang mirror memiliki semua sumber, pindah ke direktori tempat aplikasi berada dan setel ENTRYPOINT sehingga aplikasi dapat dijalankan saat mirror dijalankan. Setel USER ke 1001 untuk alasan keamanan, karena praktik terbaik memberi tahu kita bahwa kita tidak boleh menjalankan container di bawah pengguna root.
2 baris terakhir mengatur label cermin. Ketika perintah make digunakan untuk menunjuk untuk membangun dan menjalankan, ini akan diganti atau diisi, seperti yang akan kita lihat nanti.
Sumber: unsplash
Container Docker dioptimalkan untuk produksi
Saat berbicara tentang cermin tingkat produk, kami ingin memastikan cermin itu kecil, aman dan cepat. Favorit pribadi saya adalah cermin Python dalam proyek Distroless. Jadi apa Distroless itu?
Ini dapat dijelaskan sebagai berikut: Dalam dunia yang ideal, setiap orang akan menggunakan FROM scratch sebagai citra dasar mereka (yaitu, citra kosong) untuk membangun citra mereka.
Tetapi ini bukan yang kebanyakan orang ingin lakukan, karena membutuhkan koneksi statis file biner dll. Di sinilah Distroless berperan. Ini adalah FROM scratch yang dirancang untuk semua orang.
Distroless adalah sekumpulan gambar yang dibuat oleh Google yang berisi persyaratan minimum yang disyaratkan oleh aplikasi, yang berarti tidak ada shell, manajer paket, atau alat lain apa pun yang akan membengkak gambar dan menyebabkan sinyal ke pemindai keamanan (seperti CVE) Kebisingan mempersulit penetapan aturan.
Mengetahui masalah yang harus diselesaikan, mari kita lihat produksi Dockerfile ... Sebenarnya, tidak banyak yang perlu diubah di sini, hanya dua baris:
# prod.Dockerfile # 1. Garis-Ubah gambar pembangun FROMdebian: pembangun AS yang ramping # ... # 17. Line-Switch ke gambar Distroless FROMgcr.io/distroless/python3-debian10 sebagai pelari # ... Sisa dari DockefileYang perlu diubah hanyalah gambar dasar yang digunakan untuk membangun dan menjalankan aplikasi!
Tetapi perbedaannya sangat besar: cermin pengembangan kami adalah 1,03 GB, dan cermin ini hanya 103 MB, yang sangat berbeda!
Saya tahu Anda akan berkata "tetapi Alpine bisa menjadi lebih kecil" Ya, itu benar, tetapi perbedaan ukurannya tidak terlalu penting. Anda hanya akan memperhatikan ukuran gambar saat mengunduh / mengunggahnya, yang tidak umum. Saat cermin berjalan, ukuran sama sekali tidak penting. Yang lebih penting daripada ukuran adalah keamanan, dalam hal ini Distroless tentunya memiliki keunggulan, karena Alpine (yang merupakan alternatif yang baik) memiliki banyak paket tambahan yang dapat meningkatkan permukaan serangan.
Sumber: unsplash
Hal terakhir yang perlu disebutkan tentang Distroless adalah men-debug gambar. Mengingat Distroless tidak mengandung shell apa pun (bahkan sh), ini membuatnya sangat rumit ketika debugging dan pemeriksaan diperlukan. Untuk alasan ini, semua gambar Distroless memiliki versi debug.
Oleh karena itu, saat Anda mengalami masalah, Anda dapat menggunakan tag debug untuk membuat gambar produksi dan menerapkannya di samping gambar biasa, tempat tag tersebut dapat mengeksekusi dan melakukan operasi seperti pembuangan thread. Versi debug dari image python3 dapat digunakan seperti ini:
buruh pelabuhan menjalankan --entrypoint = sh -tigcr.io/distroless/python3-debian10:debugPerintah tunggal untuk semua situasi
Setelah menyiapkan semua Dockerfile, Anda mungkin juga menggunakan Makefile untuk mengotomatiskannya! Hal pertama yang harus dilakukan adalah membangun aplikasi menggunakan Docker. Oleh karena itu, untuk membangun image pengembangan, kita dapat menjalankan perintah make build-dev untuk menjalankan file target berikut:
# Biner yang akan dibangun (hanya nama dasar). MODUL: = cetak biru # Di mana untuk mendorong citra buruh pelabuhan. REGISTRI? = Docker.pkg.github.com / martinheinz / python-project-blueprint GAMBAR: = $ (PENDAFTARAN) / $ (MODUL) # Strategi versi ini menggunakan git taguntuk menyetel string versi TAG: = $ (shell git mendeskripsikan --tags - always --dirty) build-dev: @echo "\ n $ {BIRU} Gambar Pembangunan Gedung dengan label: \ n" @echo "nama: $ (MODULE)" @echo "versi: $ (TAG) $ {NC} \ n" @ed \ -e | {NAMA} | $ (MODUL) | g '\ -e | {VERSI} | $ (TAG) | g '\ dev.Dockerfile | pembuat galangan kapal -t $ (GAMBAR): $ (TAG) -f-.File target pertama-tama membangun gambar dengan mengganti nama dan label gambar dengan label di bagian bawah dev.Dockerfile. Label dibuat dengan menjalankan git description dan kemudian menjalankan docker build.
Langkah selanjutnya-gunakan make build-prod VERSION = 1.0.0 untuk membuat versi produksi:
build-prod: @echo "\ n $ {BLUE} Membangun Produksi gambar dengan label: \ n" @echo "nama: $ (MODULE)" @echo "versi: $ (VERSION) $ {NC} \ n" @ed \ -e | {NAMA} | $ (MODUL) | g '\ -e | {VERSI} | $ (VERSI) | g '\ prod.Dockerfile | pembuat galangan kapal -t $ (GAMBAR): $ (VERSI) -f- ..Ini sangat mirip dengan file target sebelumnya, tetapi dalam contoh pada versi 1.0.0, kami akan meneruskan versi sebagai parameter alih-alih menggunakan tag git sebagai versi.
Saat menjalankan semua yang ada di Docker, terkadang perlu men-debug di Docker. Untuk ini, ada file target berikut:
# Contoh: buat shell CMD = "- c'date > datefile '" shell: build-dev @echo "\ n $ {BLUE} Meluncurkan shell di lingkungan build dalam container ... $ {NC} \ n" @jalan -ti \ --rm \ --entrypoint / bin / bash \ -u $$ (id -u): $$ (id -g) \ $ (GAMBAR): $ (TAG) \ $ (CMD)Seperti yang Anda lihat di atas, bash mencakup titik masuk, dan parameter mencakup perintah kontainer. Dengan cara ini, kita bisa langsung masuk ke container dan men-debugnya atau menjalankan perintah shutdown seperti contoh di atas.
Ketika Anda telah selesai coding dan ingin mendorong image ke registri Docker, Anda dapat menggunakan makepush VERSION = 0.0.2. Lihatlah fungsi file target:
REGISTRI? = Docker.pkg.github.com / martinheinz / python-project-blueprint push: build-prod @echo "\ n $ {BLUE} Mendorong gambar ke GitHub Docker Registry ... $ {NC} \ n" @dockerpush $ (GAMBAR): $ (VERSI)Ini pertama kali menjalankan file build-prod yang terlihat sebelumnya, lalu menjalankan docker push. Diasumsikan bahwa Anda telah masuk ke registri Docker, jadi Anda perlu menjalankan login buruh pelabuhan sebelum menjalankan registri ini.
File target terakhir digunakan untuk membersihkan artefak Docker. Ini menggunakan tag nama yang diganti dengan Dockerfiles untuk memfilter dan menemukan artefak yang perlu dihapus:
buruh pelabuhan-bersih: @docker system prune -f --filter "label = name = $ (MODULE)"CI / CD menggunakan GitHub Actions
Sekarang mulai gunakan semua perintah make target yang mudah digunakan untuk mengatur CI / CD. Kami akan menggunakan GitHub Actions dan GitHub Package Registry untuk membangun pipeline (pekerjaan) dan menyimpan image. Jadi apakah dua hal ini?
· Tindakan Github adalah pekerjaan / jalur pipa yang dapat membantu mengotomatiskan alur kerja pengembangan. Anda dapat menggunakannya untuk membuat tugas individual, lalu menggabungkannya ke dalam alur kerja kustom, lalu menjalankan alur kerja ini setiap kali Anda mendorong ke gudang atau membuat rilis.
· GitHub Package Registry adalah layanan hosting paket yang terintegrasi penuh dengan GitHub. Itu dapat menyimpan berbagai jenis paket, seperti permata Ruby atau paket npm. Kami akan menggunakannya untuk menyimpan gambar Docker.
· Jika Anda tidak terbiasa dengan GitHub Package Registry dan ingin mempelajarinya lebih lanjut, Anda dapat memeriksa posting blog saya: https://martinheinz.dev/blog/6
Sumber: unsplash
Sekarang, untuk menggunakan GitHub Action, Anda perlu membuat alur kerja yang akan dijalankan sesuai dengan pemicu yang dipilih (misalnya, mendorong ke gudang). Alur kerja ini adalah file YAML yang terletak di direktori .github / workflows di gudang:
.github alur kerja build-test.yml push.ymlPekerjaan pertama disebut build, dan ini memverifikasi apakah aplikasi dapat dibangun dengan menjalankan perintah make build-dev. Namun sebelum menjalankannya, pertama kali mengambil gudang dengan melakukan operasi yang disebut checkout yang dipublikasikan di GitHub.
pekerjaan: uji: berjalan-di: ubuntu-terbaru Langkah: -uses: actions / checkout @ v1 -uses: tindakan / pengaturan-python @ v1 dengan: python-versi: '3.8' -name: Instal Dependensi jalankan: | python -m pip install --upgrade pip pip install -r requirement.txt -name: Jalankan tes Makefile run: buat tes -name: Instal Linters jalankan: | pip instal pylint pip instal flake8 pip instal bandit -name: Jalankan Linters jalankan: buat seratTugas kedua sedikit lebih rumit. Ini menjalankan tes terhadap aplikasi dan 3 linter (pemeriksa kualitas kode).
Sama seperti pekerjaan sebelumnya, kami menggunakan operasi checkout @ v1 untuk mendapatkan kode sumber. Setelah itu, jalankan operasi terbitan lain yang disebut setup-python @ v1, yang membantu mengatur lingkungan python (Anda dapat menemukan detailnya di sini).
Sekarang setelah Anda memiliki lingkungan python, Anda juga perlu menggunakan dependensi aplikasi di requirement.txt yang diinstal oleh pip. Pada titik ini, Anda dapat terus menjalankan perintah make test, yang akan memicu Pytest suite. Jika rangkaian pengujian lolos, linter yang disebutkan sebelumnya, yaitu pylint, flake8, dan bandit akan terus dipasang. Terakhir, jalankan perintah make lint, yang akan memicu setiap linter.
Ini adalah keseluruhan proses pembuatan / pekerjaan pengujian, tetapi bagaimana cara mendorongnya? Lihatlah:
di: Dorong: tag: - '*' pekerjaan: Dorong: berjalan-di: ubuntu-terbaru Langkah: -uses: actions / checkout @ v1 -name: Setel env run: echo :: set-envname = RELEASE_VERSION :: $ (echo $ {GITHUB_REF: 10}) -name: Masuk keRegistry run: echo "$ {{secret.REGISTRY_TOKEN}}" | buruh pelabuhan masuk docker.pkg.github.com -u $ {{github.actor}} --password-stdin -name: Dorong ke GitHubPackage Registry jalankan: buat pushVERSION = $ {{env.RELEASE_VERSION}}4 baris pertama menentukan kapan harus memicu tugas ini. Kami menentukan bahwa pekerjaan dimulai hanya ketika tag didorong ke gudang (* dalam kasus ini, nama tag yang ditentukan dapat dalam mode apa pun), sehingga gambar Docker tidak akan didorong ke GitHub Package Registry setiap kali didorong ke gudang. Ini hanya didorong ke GitHubPackage Registry saat label versi baru dari aplikasi yang ditentukan didorong.
Sekarang sampai pada pekerjaan utama, yang dimulai dari mengambil kode sumber dan menyetel variabel lingkungan RELEASE_VERSION ke tag git yang didorong. Ini dilakukan melalui fungsi built-in :: setenv dari GitHub Actions.
Selanjutnya, ia menggunakan REGISTRY_TOKEN yang disimpan dalam rahasia repositori untuk masuk ke registri Docker dan masuk ke pengguna yang memulai alur kerja (github.actor). Terakhir, di baris terakhir, ini menjalankan perintah push, yang membangun image produksi dan mendorongnya ke registri, menggunakan tag git yang didorong sebelumnya sebagai tag image.
Daftar kode lengkap dapat diambil di sini: https://github.com/MartinHeinz/python-project-blueprint/tree/master/.github/workflows
Gunakan CodeClimate untuk pemeriksaan kualitas kode
Last but not least, Anda juga harus menggunakan CodeClimate dan SonarCloud untuk menambahkan pemeriksaan kualitas kode. Ini akan dipicu bersama dengan tugas pengujian yang ditunjukkan di atas. Oleh karena itu, kami menambahkan beberapa baris ke dalamnya:
# uji, lint ... -name: Kirim laporan keCodeClimate jalankan: | ekspor GIT_BRANCH = "$ {GITHUB_REF / refs \ / heads \ //}" curl -Lhttps: //codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter chmod + x ./cc-test-reporter ./cc-test-reporter format-coverage -t coverage.py coverage.xml ./cc-test-reporter upload-coverage -r "$ {{secret.CC_TEST_REPORTER_ID}}" -name: SonarCloudscanner penggunaan: sonarsource / sonarcloud-github-action @ master env: GITHUB_TOKEN: $ {{secret.GITHUB_TOKEN}} SONAR_TOKEN: $ {{rahasia.SONAR_TOKEN}}Mulai dari CodeClimate, ekspor variabel GIT_BRANCH terlebih dahulu, lalu gunakan variabel lingkungan GITHUB_REF untuk mengambilnya kembali. Kedua, unduh program laporan pengujian CodeClimate dan buat itu dapat dieksekusi. Kemudian, gunakan untuk memformat laporan cakupan yang dihasilkan oleh rangkaian pengujian dan mengirimkannya ke CodeClimate dengan ID reporter pengujian di baris terakhir, yang disimpan dalam rahasia repositori.
Sedangkan untuk SonarCloud, kita perlu membuat file sonar-project.properties seperti yang ditunjukkan di bawah ini di gudang (nilai dalam file dapat ditemukan di sudut kanan bawah dasbor SonarCloud):
.organisasi = martinheinz-github sonar.projectKey = MartinHeinz_python-project-blueprint sonar.sources = cetak biruSelain itu, cukup gunakan sonarcloud-github-action yang ada untuk membantu kami menyelesaikan semua pekerjaan. Yang harus Anda lakukan adalah menyediakan 2 token: token GitHub (terletak di gudang secara default) dan token SonarCloud (tersedia dari situs web SonarCloud).
Catatan: Untuk langkah-langkah tentang cara mendapatkan dan mengatur semua token dan kunci di atas, silakan lihat file README: https://github.com/MartinHeinz/python-project-blueprint/blob/master/README.md
Sumber: unsplash
Dengan alat, konfigurasi, dan kode di atas, Anda dapat membangun dan mengotomatiskan semua aspek proyek Python Anda berikutnya. Silakan dan coba!
Komentar Suka Ikuti
Mari berbagi manfaat pembelajaran dan pengembangan AI
Jika mencetak ulang, silakan tinggalkan pesan di latar belakang dan ikuti spesifikasi pencetakan ulang
- Distrik Xinxiang Utara akan segera lepas landas! Total investasi lebih dari 846 juta direncanakan untuk membangun rumah sakit baru dan lembah olahraga dan rekreasi yang besar
- "Pemandangan Musim Semi Terindah" di desa-desa di Distrik Yongding, arena penyerangan hari ini-Kota Xinqiao