Gelişmeye devam edin! Python projenizi otomasyondan nasıl yararlanabilirsiniz?

Tam metin 4.955 kelimedir ve beklenen öğrenme süresi 25 dakikadır.

Kaynak: unsplash

Projeniz ister web uygulamaları geliştirmek, ister veri bilimi sorunları veya AI ile ilgilenmek için kullanılsın, iyi yapılandırılmış bir CI / CD, geliştirme sırasında hata ayıklanabilen ve üretim ortamı için optimize edilebilen bir Docker görüntüsü veya diğer bazı kod kalitesi araçları kullanın, Size fayda sağlayabilir.

Bu makale size bunları bir Python projesine nasıl ekleyeceğinizi anlatacak!

Bu, tüm kaynak kodunu ve belgeleri içeren depom: https://github.com/MartinHeinz/python-project-blueprint

Geliştirme için hata ayıklanabilir bir Docker kapsayıcısı

Bazı insanlar Docker'ı sevmez çünkü kapsayıcılarda hata ayıklamak zor olabilir veya görüntülerinin oluşturulması uzun zaman alır. Öyleyse, hızlı bir şekilde oluşturulabilen ve hata ayıklaması kolay olan geliştirme için ideal bir görüntü oluşturarak başlayalım.

Görüntünün hata ayıklamasını kolaylaştırmak için, bash, vim, netcat, wget, cat, find, grep vb. Gibi hata ayıklama için gerekli olabilecek tüm araçları içeren temel bir görüntü gereklidir.

python: 3.8.1-buster bu görev için ideal görünüyor. Varsayılan olarak birçok araç içerir ve tüm eksik şeyleri kolayca kurabiliriz. Bu temel görüntü çok ağır, ancak önemli değil çünkü şu anda yalnızca geliştirme için kullanılacak.

Çok özel bir yansıtma seçtiğimi fark etmiş olabilirsiniz: Python sürümü ve Debian sürümü kilitli. Bu kasıtlıdır, çünkü daha yeni, muhtemelen uyumsuz Python veya Debian sürümlerinin neden olduğu "bozulma" olasılığını en aza indirmek istiyoruz.

Kaynak: techcrunch

Alp tabanlı aynalamayı alternatif olarak kullanabilirsiniz. Ancak bu, Python'un bağlı olduğu glibc yerine musllibc kullandığından bazı sorunlara neden olabilir. Bu nedenle, bu konfigürasyonu seçmeye karar verirseniz, bunu aklınızda bulundurun.

Derlemenin hızına gelince, olabildiğince çok katmanı önbelleğe almak için çok aşamalı bir yapı kullanacağız. Bu şekilde, gcc gibi bağımlılıkları ve araçları ve uygulamanın gerektirdiği tüm kitaplıkları (gereksinimler.txt dosyasında) indirmekten kaçınabilirsiniz.

Bu araçları indirmek ve kurmak için gereken adımlar son çalışan program görüntüsünde önbelleğe alınamadığından, gerekli tüm araçları içeren özel bir temel görüntü oluşturmak için yukarıda belirtilen python: 3.8.1-buster'ı kullanacağız. İşlem hızını daha da iyileştirmek için.

Bunu söyledikten sonra Dockerfile'a bir göz atalım:

# dev.Dockerfile FROMpython: 3.8.1-buster AS oluşturucu ÇALIŞTIR apt-get update apt-get install -y --no-install-önerir --yes python3-venv gcclibpython3-dev \ python3 -m venv / venv \ / venv / bin / pip install --upgradepip Oluşturucu ASbuilder-venv'DEN COPYrequirements.txt /requirements.txt RUN / venv / bin / pipinstall -r /requirements.txt İnşaatçı-venv AStester'DEN COPY. / Uygulama WORKDIR / uygulama RUN / venv / bin / pytest FROMmartinheinz / python-3.8.1-buster-tools: en son AS runner KOPYA - from = tester / venv / venv COPY - from = tester / app / app WORKDIR / uygulama GİRİŞ NOKTASI KULLANICI 1001 ETİKET adı = {NAME} LABELversion = {VERSION}

Yukarıdaki belgeden 3 ara görüntü oluşturacağımızı ve ardından son çalışan görüntüyü oluşturacağımızı görebiliriz. İlk görüntü oluşturucu olarak adlandırılır ve gcc ve Python sanal ortamları dahil olmak üzere son uygulamayı oluşturmak için gereken tüm gerekli kitaplıkları indirir. Kurulum tamamlandıktan sonra, bir sonraki görüntünün kullanması için gerçek sanal ortamı da oluşturacaktır.

Daha sonra, bağımlılıklar listesini (gereksinim.txt) görüntüye kopyalayan ve ardından yükleyen oluşturucu-venv görüntüsü vardır. Bu ara görüntü, önbellek için gereklidir, çünkü kitaplık yalnızca gereksinimler.txt değiştiğinde kurulur, aksi takdirde yalnızca önbellek kullanılır.

Son görüntüyü oluşturmadan önce, önce uygulamaya karşı bir test çalıştırın. Test aynasının yaptığı budur. Kaynak kodunu aynaya kopyalayıp testi çalıştırıyoruz. Geçerse, program koşucuya çalışır.

Koşucu aynası için, sıradan Debian aynasında bulunmayan vim veya netcat gibi bazı ekstra özellikler içeren özel bir ayna kullanıyoruz. Bu görüntüyü burada Docker Hub'da bulabilir ve bu çok basit Dockerfile'ı base.Dockerfile'da kontrol edebilirsiniz.

Bu nedenle, son görüntüdeki çalışma şu şekildedir: önce test görüntüsündeki tüm yüklü bağımlılıkları koruyan sanal ortamı kopyalayın ve ardından test edilen uygulamayı kopyalayın.

Yansıtma artık tüm kaynaklara sahip olduğuna göre, uygulamanın bulunduğu dizine gidin ve ENTRYPOINT'i, yansıtma başladığında uygulamanın çalıştırılabilmesi için ayarlayın. Güvenlik nedeniyle KULLANICI'yı 1001 olarak ayarlayın, çünkü en iyi uygulama bize kapsayıcıları asla kök kullanıcı altında çalıştırmamamız gerektiğini söyler.

Son 2 satır aynanın etiketini belirler. Make komutu derleme ve çalıştırmayı işaret etmek için kullanıldığında, bunlar daha sonra göreceğimiz gibi değiştirilecek veya doldurulacaktır.

Kaynak: unsplash

Üretim için optimize edilmiş Docker konteyner

Ürün düzeyinde aynalardan bahsederken, küçük, güvenli ve hızlı olduklarından emin olmak istiyoruz. Benim kişisel favorim Distroless projesindeki Python aynası. Peki Distroless nedir?

Şu şekilde tanımlanabilir: İdeal bir dünyada, herkes imajını oluşturmak için temel imajı (yani boş imaj) olarak FROM sıfırdan kullanacaktır.

Ancak çoğu insanın yapmak istediği şey bu değil çünkü ikili dosyaların statik bağlantısını gerektiriyor vs. Distroless burada devreye giriyor ve herkes için tasarlanmış bir sıfırdan.

Distroless, Google tarafından hazırlanan ve uygulamanın gerektirdiği minimum gereksinimleri içeren bir dizi resimdir; bu, görüntüyü şişirecek ve güvenlik tarayıcısına (CVE gibi) bir sinyale neden olacak herhangi bir kabuk, paket yöneticisi veya başka bir aracın olmadığı anlamına gelir. Gürültü, kural koymayı zorlaştırır.

Çözülecek problemi bilerek, üretim Dockerfile'ına bir göz atalım ... Aslında burada çok fazla değişikliğe gerek yok, sadece iki satır var:

# prod.Dockerfile # 1. Satır Değiştirme oluşturucu resmi FROMdebian: buster-slim AS builder # ... # 17. Hatasız görüntüye geçiş yapın FROMgcr.io/distroless/python3-debian10 AS runner # ... Dockefile'ın geri kalanı

Değiştirilmesi gereken tek şey, uygulamayı oluşturmak ve çalıştırmak için kullanılan temel görüntüdür!

Ancak fark çok büyük: geliştirme aynamız 1.03GB ve bu ayna sadece 103MB, ki bu tamamen farklı!

"Ama Alpine küçülebilir" diyeceğinizi biliyorum Evet, doğru, ancak boyut farkı o kadar önemli değil. Yaygın olmayan bir şekilde, sadece indirirken / yüklerken görselin boyutuna dikkat edeceksiniz. Ayna çalışırken boyut hiç önemli değildir. Boyuttan daha önemli olan güvenliktir.Bu açıdan Distroless'in kesinlikle bir avantajı vardır çünkü Alpine (iyi bir alternatiftir) saldırı yüzeyini artırabilecek birçok ek pakete sahiptir.

Kaynak: unsplash

Distroless hakkında bahsetmeye değer son şey, görüntülerde hata ayıklamaktır. Distroless'in herhangi bir mermi (sh bile değil) içermediği göz önüne alındığında, bu, hata ayıklama ve kontrol gerektiğinde çok zor hale getirir. Bu nedenle, tüm Distroless görüntülerinin hata ayıklama sürümleri vardır.

Bu nedenle, bir sorunla karşılaştığınızda, bir üretim görüntüsü oluşturmak ve onu iş parçacığı dökümü gibi işlemleri yürütebileceği ve gerçekleştirebileceği normal görüntünün yanına yerleştirmek için hata ayıklama etiketini kullanabilirsiniz. Python3 görüntüsünün hata ayıklama sürümü şu şekilde kullanılabilir:

docker run --entrypoint = sh -tigcr.io/distroless/python3-debian10:debug

Tüm durumlar için tek komut

Tüm Dockerfile'ları hazırladıktan sonra, onları otomatikleştirmek için Makefile'ı da kullanabilirsiniz! Yapılacak ilk şey, uygulamayı Docker kullanarak oluşturmaktır. Bu nedenle, geliştirme görüntüsünü oluşturmak için aşağıdaki hedef dosyaları çalıştırmak için make build-dev komutunu çalıştırabiliriz:

# Oluşturulacak ikili (yalnızca taban adı). MODÜL: = plan # Docker görüntüsünün nereye itileceği. KAYIT OL? = Docker.pkg.github.com / martinheinz / python-proje-blueprint GÖRÜNTÜ: = $ (KAYIT) / $ (MODÜL) # Bu sürüm stratejisi, sürüm dizesini ayarlamak için git etiketlerini kullanır ETİKET: = $ (kabuk git tanımla --tags - her zaman --dirty) build-dev: @echo "\ n $ {BLUE} Etiketli Bina Geliştirme resmi: \ n" @echo "ad: $ (MODÜL)" @echo "sürüm: $ (TAG) $ {NC} \ n" @sed \ -e | {AD} | $ (MODÜL) | g '\ -e | {VERSION} | $ (TAG) | g '\ dev.Dockerfile | docker build -t $ (IMAGE): $ (TAG) -f-.

Hedef dosya ilk önce görüntünün adını ve etiketini dev.Dockerfile dosyasının altındaki bir etiketle değiştirerek görüntüyü oluşturur.Etiket git define çalıştırılarak ve ardından docker build çalıştırılarak oluşturulur.

Sonraki adımda, üretim sürümünü oluşturmak için make-prod VERSION = 1.0.0 kullanın:

yap-prod: @echo "\ n $ {BLUE} Şu etiketlerle Bina Üretimgörüntüsü: \ n" @echo "ad: $ (MODÜL)" @echo "sürüm: $ (VERSION) $ {NC} \ n" @sed \ -e | {AD} | $ (MODÜL) | g '\ -e | {VERSION} | $ (SÜRÜM) | g '\ prod.Dockerfile | docker build -t $ (IMAGE): $ (SÜRÜM) -f- ..

Bu, önceki hedef dosyaya çok benzer, ancak sürüm 1.0.0'daki örnekte, sürüm olarak git etiketini kullanmak yerine, sürümü bir parametre olarak geçireceğiz.

Her şeyi Docker'da çalıştırırken, bazen Docker'da hata ayıklamak gerekir.Bunun için aşağıdaki hedef dosyalar vardır:

# Örnek: kabuk yapmak CMD = "- c'date > tarih dosyası '" kabuk: build-dev @echo "\ n $ {BLUE} Kapsayıcıya alınmış derleme ortamında bir kabuk başlatılıyor ... $ {NC} \ n" @docker çalıştır \ -ti \ --rm \ - giriş noktası / bin / bash \ -u $$ (id -u): $$ (id -g) \ $ (GÖRÜNTÜ): $ (TAG) \ $ (CMD)

Yukarıdan da görebileceğiniz gibi, bash giriş noktasını kapsar ve parametreler konteyner komutunu kapsar. Bu şekilde doğrudan konteynere girip hata ayıklayabilir veya yukarıdaki örnekte olduğu gibi bir kapatma komutu çalıştırabiliriz.

Kodlamayı bitirdiğinizde ve görüntüyü Docker kayıt defterine göndermek istediğinizde makepush VERSION = 0.0.2 kullanabilirsiniz. Hedef dosyanın işlevine bir göz atın:

KAYIT OL? = Docker.pkg.github.com / martinheinz / python-proje-blueprint push: build-prod @echo "\ n $ {BLUE} Görüntü GitHub Docker Registry'ye aktarılıyor ... $ {NC} \ n" @dockerpush $ (GÖRÜNTÜ): $ (SÜRÜM)

Önce daha önce görülen build-prod dosyasını çalıştırır ve ardından docker push'u çalıştırır. Docker kayıt defterinde oturum açtığınız varsayılmaktadır, bu nedenle bu kayıt defterini çalıştırmadan önce docker oturumunu çalıştırmanız gerekir.

Son hedef dosya, Docker yapıtlarını temizlemek için kullanılır. Silinmesi gereken yapıları filtrelemek ve bulmak için Dockerfiles ile değiştirilen ad etiketini kullanır:

docker-clean: @docker system prune -f --filter "label = isim = $ (MODÜL)"

GitHub Eylemlerini kullanan CI / CD

Şimdi CI / CD'yi kurmak için tüm bu uygun hedef oluşturma komutlarını kullanmaya başlayın. Ardışık düzenler (işler) oluşturmak ve görüntüleri depolamak için GitHub Eylemlerini ve GitHub Paket Kayıt Defterini kullanacağız. Peki bu iki şey nedir?

· Github Eylemleri, geliştirme iş akışının otomatikleştirilmesine yardımcı olabilecek işler / ardışık düzenlerdir. Bunları ayrı görevler oluşturmak için kullanabilir, ardından bunları özel bir iş akışında birleştirebilir ve ardından bir depoya her gönderdiğinizde veya bir sürüm oluşturduğunuzda bu iş akışlarını yürütebilirsiniz.

· GitHub Paket Kayıt Defteri, GitHub ile tamamen entegre bir paket barındırma hizmetidir. Ruby gems veya npm paketleri gibi çeşitli paket türlerini depolayabilir. Docker görüntülerini depolamak için kullanacağız.

· GitHub Paket Kayıt Defterine aşina değilseniz ve bunun hakkında daha fazla bilgi edinmek istiyorsanız, blog yazıma bakabilirsiniz: https://martinheinz.dev/blog/6

Kaynak: unsplash

Şimdi GitHub Action'ı kullanmak için, seçilen tetikleyiciye göre yürütülecek iş akışları oluşturmanız gerekir (örneğin, depoya itme). Bu iş akışları, depodaki .github / iş akışları dizininde bulunan YAML dosyalarıdır:

.github iş akışları build-test.yml push.yml

İlk iş derleme olarak adlandırılır ve uygulamanın make build-dev komutunu çalıştırarak oluşturulup oluşturulamayacağını doğrular. Ancak çalıştırmadan önce, GitHub'da yayınlanan teslim alma adı verilen bir işlemi gerçekleştirerek depoyu alır.

Meslekler: Ölçek: çalışır durumda: ubuntu-en son adımlar: kullanımları: işlemler / ödeme @ v1 kullanımları: eylemler / setup-python @ v1 ile: python sürümü: '3.8' -name: Bağımlılıkları Yükle çalıştır: | python -m pip kurulumu - yükseltme pip pip kurulum -r gereksinimleri.txt -name: Makefile testini çalıştır çalıştır: test yap -name: Linters'ı Yükle çalıştır: | pip pylint kurmak pip kurulum flake8 pip bandit yüklemek -name: Linters'ı Çalıştır koş: tüy bırak

İkinci görev biraz daha karmaşıktır. Uygulamaya ve 3 linter'e (kod kalitesi denetleyicileri) karşı testler çalıştırır.

Önceki çalışmayla aynı şekilde, kaynak kodunu almak için checkout @ v1 işlemini kullanıyoruz. Bundan sonra, python ortamının kurulmasına yardımcı olan setup-python @ v1 adlı başka bir yayınlanmış işlemi çalıştırın (bununla ilgili ayrıntıları burada bulabilirsiniz).

Artık bir python ortamınız olduğuna göre, pip tarafından yüklenen gereksinimler.txt dosyasındaki uygulama bağımlılıklarını da kullanmanız gerekir. Bu noktada, Pytest paketini tetikleyecek olan make test komutunu çalıştırmaya devam edebilirsiniz. Test paketi geçerse, daha önce bahsedilen linterler, yani pylint, flake8 ve bandit kurulmaya devam edilecektir. Son olarak, her linter'i tetikleyecek olan make lint komutunu çalıştırın.

Bu, tüm inşa / test çalışması sürecidir, ancak nasıl ilerletilmelidir? Bir göz at:

üzerinde: it: etiketleri: - '*' Meslekler: it: çalışır durumda: ubuntu-en son adımlar: kullanımları: işlemler / ödeme @ v1 -name: env ayarla run: echo :: set-envname = RELEASE_VERSION :: $ (echo $ {GITHUB_REF: 10}) -name: Kayıt Giriş çalıştır: echo "$ {{secrets.REGISTRY_TOKEN}}" | docker girişi docker.pkg.github.com -u $ {{github.actor}} --password-stdin -name: GitHubPackage Kayıt Defterine Gönderin çalıştır: pushVERSION = $ {{env.RELEASE_VERSION}} yap

İlk 4 satır, bu görevin ne zaman tetikleneceğini tanımlar. İşin yalnızca etiket depoya itildiğinde başladığını belirtiyoruz (* bu durumda, belirtilen etiket adı herhangi bir modda olabilir), böylece Docker görüntüsü depoya her gönderildiğinde GitHub Paket Kayıt Defterine gönderilmeyecektir. Yalnızca belirtilen uygulamanın yeni sürümünün etiketi itildiğinde GitHubPackage Kayıt Defterine gönderilir.

Şimdi, kaynak kodunu almak ve RELEASE_VERSION ortam değişkenini itilen git etiketine ayarlamakla başlayan işin ana gövdesi geliyor. Bu, GitHub Eylemlerinin yerleşik :: setenv işlevi aracılığıyla yapılır.

Ardından, Docker kayıt defterinde oturum açmak ve iş akışını başlatan kullanıcıya (github.actor) oturum açmak için depo sırlarında depolanan REGISTRY_TOKEN'i kullanır. Son olarak, son satırda, daha önce itilen git etiketini görüntü etiketi olarak kullanarak bir üretim görüntüsü oluşturan ve bunu kayıt defterine gönderen push komutunu çalıştırır.

Tam kod listesi buradan alınabilir: https://github.com/MartinHeinz/python-project-blueprint/tree/master/.github/workflows

Kod kalite denetimi için CodeClimate kullanın

Son fakat en az değil, kod kalitesi kontrolleri eklemek için CodeClimate ve SonarCloud'u da kullanmalısınız. Bunlar, yukarıda gösterilen test işi ile birlikte tetiklenecektir. Bu nedenle, ona birkaç satır ekliyoruz:

# test, tüysüz ... -name: RaporuCodeClimate'a gönder çalıştır: | dışa aktar GIT_BRANCH = "$ {GITHUB_REF / başvuru \ / kafalar \ //}" curl -Lhttps: //codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter chmod + x ./cc-test-reporter ./cc-test-reporter format-kapsam -t kapsam.py kapsama.xml ./cc-test-reporter yükleme kapsamı -r "$ {{secrets.CC_TEST_REPORTER_ID}}" -name: SonarCloudscanner kullanım: sonarsource / sonarcloud-github-action @ master env: GITHUB_TOKEN: $ {{secrets.GITHUB_TOKEN}} SONAR_TOKEN: $ {{sır.SONAR_TOKEN}}

CodeClimate'dan başlayarak, önce GIT_BRANCH değişkenini dışa aktarın ve ardından onu almak için GITHUB_REF ortam değişkenini kullanın. İkinci olarak, CodeClimate test raporu programını indirin ve çalıştırılabilir hale getirin. Ardından, test paketi tarafından oluşturulan kapsama raporunu biçimlendirmek için kullanın ve depo sırlarında saklanan son satırdaki test raportörü kimliği ile CodeClimate'a gönderin.

SonarCloud'a gelince, aşağıda gösterildiği gibi depoda bir sonar-project.properties dosyası oluşturmamız gerekiyor (dosyadaki değerler SonarCloud panosunun sağ alt köşesinde bulunabilir):

.organization = martinheinz-github sonar.projectKey = MartinHeinz_python-proje-blueprint sonar.sources = taslak

Ek olarak, tüm işi tamamlamamıza yardımcı olması için mevcut sonarcloud-github-eylemini kullanın. Tek yapmanız gereken 2 jeton sağlamaktır: GitHub jetonu (varsayılan olarak depoda bulunur) ve SonarCloud jetonu (SonarCloud web sitesinden edinilebilir).

Not: Yukarıdaki tüm belirteçlerin ve anahtarların nasıl elde edileceğine ve ayarlanacağına ilişkin adımlar için lütfen README dosyasına bakın: https://github.com/MartinHeinz/python-project-blueprint/blob/master/README.md

Kaynak: unsplash

Yukarıdaki araçlar, yapılandırma ve kod ile bir sonraki Python projenizin tüm yönlerini oluşturabilir ve otomatikleştirebilirsiniz. Git ve dene!

Yorum Beğen Takip Et

Yapay zeka öğrenme ve geliştirmenin kuru mallarını paylaşalım

Yeniden yazdırıyorsanız, lütfen arka planda bir mesaj bırakın ve yeniden yazdırma şartnamelerine uyun

Kod yazmak, roman yazmak gibi mi? Jupyter edebi programlamayı gerçeğe dönüştürüyor
önceki
Yetkili Tanıma | Jitai Test Merkezi, CNAS tarafından akredite edilmiştir
Sonraki
Birden fazla bloğun yıkılmasını içeren Beiyuan Caddesi'ndeki 100 günlük zorlu projelerin listesi burada
Xinxiang Kuzey Bölgesi havalanmak üzere! Yeni bir hastane ve büyük bir spor ve eğlence vadisi inşa etmek için toplam 846 milyonun üzerinde yatırım planlanıyor
Niu Tail Chong, Paiya Dağı, Jingzhou: İlkel ormanda kalan bir masal dünyası
Chen Youweier "Bin mil, on bin mil yürüyor, Fenghuang'da tünemek istemiyor"
Yongding Bölgesi köylerindeki "En Güzel Bahar Manzarası", bugünkü yumruk ring maçı, Xinqiao Kasabasında
Salgın karşıtı kahramanların ilk hattı | Huang Changyi: kurtarmada "Ying"
Jingzhou: Şakayık çiçekleri "zenginleşiyor"
Teknolojik yenilik de çok ilginç olabilir - Chenzhou Madencilik yeraltı akıllı yükseltme
Xiangtan İlçe Halk Hastanesinden Zeng Ling: Koruyucu kıyafetleri çıkarın ve beyaz önlük giyin
Sıcaklık testi, tıbbi izolasyon ... bu ilkokulun günlüğü ilk seviyeye nasıl açtığını görün
Dilin ucunda yay! Bu bahar lezzetleri kaçırılmamalı
Bugün Xinsheng | Teknoloji Tarihe Tanık! Dünyanın dört bir yanından 140 ünlü evde çevrimiçi konserler veriyor
To Top