Hello! Cabang fitur (alias nyebarake pratinjau, aplikasi review) - iki nalika ora mung cabang master disebarake, nanging uga saben panjaluk narik menyang URL unik. Sampeyan bisa mriksa manawa kode kasebut bisa digunakake ing lingkungan produksi; fitur kasebut bisa ditampilake menyang programer utawa spesialis produk liyane. Nalika sampeyan nggarap panyuwunan narik, saben panyebaran komit anyar kanggo kode lawas bakal dibusak, lan penyebaran anyar kanggo kode anyar diluncurake. Pitakonan bisa uga muncul nalika sampeyan nggabungake panjaluk tarik menyang cabang master. Sampeyan ora perlu maneh cabang fitur, nanging sumber daya Kubernetes isih ing kluster.
Liyane babagan cabang fitur
Salah sawijining pendekatan kanggo nggawe cabang fitur ing Kubernetes yaiku nggunakake spasi jeneng. Ing cendhak, konfigurasi produksi katon kaya iki:
Umumé, aku nulis Operator Kubernetes (aplikasi sing nduweni akses menyang sumber daya kluster), pranala menyang proyek ing Github. Mbusak spasi jeneng sing kalebu cabang fitur lawas. Ing Kubernetes, yen sampeyan mbusak spasi jeneng, sumber daya liyane ing ruang jeneng kasebut uga bakal dibusak kanthi otomatis.
$ kubectl get pods --all-namespaces | grep -e "-pr-"
NAMESPACE ... AGE
habr-back-end-pr-264 ... 4d8h
habr-back-end-pr-265 ... 5d7h
Sampeyan bisa maca babagan carane ngetrapake cabang fitur menyang kluster kene и kene.
Motivasi
Ayo goleki siklus urip panjaluk tarik khas kanthi integrasi terus-terusan (continuous integration):
Kita push komitmen anyar menyang cabang.
Ing mbangun, linter lan / utawa tes ditindakake.
Konfigurasi panyuwunan narik Kubernetes digawe kanthi cepet (contone, nomer kasebut dilebokake ing cithakan sing wis rampung).
Nggunakake aplikasi kubectl, konfigurasi ditambahake menyang kluster (nyebar).
Panjaluk tarik digabung menyang cabang master.
Nalika sampeyan nggarap panyuwunan narik, saben panyebaran komit anyar kanggo kode lawas bakal dibusak, lan penyebaran anyar kanggo kode anyar diluncurake. Nanging nalika panjalukan narik digabungake menyang cabang master, mung cabang master sing bakal dibangun. Akibaté, dadi metu sing kita wis lali bab panjalukan narik, lan sumber daya Kubernetes isih ing kluster.
Parameter namespaceSubstring perlu kanggo nyaring namespaces kanggo panjalukan narik saka namespaces liyane. Contone, yen kluster duwe spasi jeneng ing ngisor iki: habr-back-end, habr-front-end, habr-back-end-pr-17, habr-back-end-pr-33, banjur calon kanggo pambusakan bakal habr-back-end-pr-17, habr-back-end-pr-33.
Parameter afterDaysWithoutDeploy perlu kanggo mbusak spasi jeneng lawas. Contone, yen namespace digawe 3 дня 1 час bali, lan parameter nuduhake 3 дня, namespace iki bakal dibusak. Uga dianggo ing arah ngelawan yen namespace digawe 2 дня 23 часа bali, lan parameter nuduhake 3 дня, namespace iki ora bakal dibusak.
Ana siji parameter liyane, tanggung jawab kanggo sepira kerepe mindhai kabeh ruang jeneng lan mriksa dina tanpa panyebaran - mriksaEveryMinutes. Kanthi gawan iku padha 30 минутам.
Minikube bakal ngunggahake kluster Kubernetes sacara lokal.
kubectl - antarmuka baris printah kanggo manajemen kluster.
Kita ngunggahake kluster Kubernetes sacara lokal:
$ minikube start --vm-driver=docker
minikube v1.11.0 on Darwin 10.15.5
Using the docker driver based on existing profile.
Starting control plane node minikube in cluster minikube.
Indikasi kubectl gunakake kluster lokal kanthi gawan:
$ kubectl config use-context minikube
Switched to context "minikube".
Amarga konfigurasi produksi dikonfigurasi kanggo mriksa ruang jeneng lawas, lan kluster sing mentas diangkat ora duwe, kita bakal ngganti variabel lingkungan. IS_DEBUG ing true. Kanthi nilai iki parameter afterDaysWithoutDeploy ora dianggep lan spasi jeneng ora dicenthang nganti pirang-pirang dina tanpa nyebarake, mung kanggo kedadeyan substring (-pr-).
Yen sampeyan lagi ing Linux:
$ sed -i 's|false|true|g' stale-feature-branch-production-configs.yml
Yen sampeyan lagi ing macOS:
$ sed -i "" 's|false|true|g' stale-feature-branch-production-configs.yml
Kita mriksa manawa operator wis muncul ing kluster:
$ kubectl get pods --namespace stale-feature-branch-operator
NAME ... STATUS ... AGE
stale-feature-branch-operator-6bfbfd4df8-m7sch ... Running ... 38s
Yen katon ing log sawijining, iku siap kanggo proses sumber daya StaleFeatureBranch:
Operator wis nanggapi lan siyap mriksa spasi jeneng:
$ kubectl logs stale-feature-branch-operator-6bfbfd4df8-m7sch -n stale-feature-branch-operator
... "msg":"Stale feature branch is being processing.","namespaceSubstring":"-pr-","afterDaysWithoutDeploy":1,"checkEveryMinutes":1,"isDebug":"true"}
Instal fixtures, ngemot rong spasi jeneng (project-pr-1, project-pr-2) lan wong-wong mau deployments, services, ingress, lan liya-liyane:
$ kubectl apply -f https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/fixtures/first-feature-branch.yml -f https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/fixtures/second-feature-branch.yml
...
namespace/project-pr-1 created
deployment.apps/project-pr-1 created
service/project-pr-1 created
horizontalpodautoscaler.autoscaling/project-pr-1 created
secret/project-pr-1 created
configmap/project-pr-1 created
ingress.extensions/project-pr-1 created
namespace/project-pr-2 created
deployment.apps/project-pr-2 created
service/project-pr-2 created
horizontalpodautoscaler.autoscaling/project-pr-2 created
secret/project-pr-2 created
configmap/project-pr-2 created
ingress.extensions/project-pr-2 created
Kita priksa manawa kabeh sumber daya ing ndhuwur wis kasil digawe:
$ kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-1 && kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-2
...
NAME ... READY ... STATUS ... AGE
pod/project-pr-1-848d5fdff6-rpmzw ... 1/1 ... Running ... 67s
NAME ... READY ... AVAILABLE ... AGE
deployment.apps/project-pr-1 ... 1/1 ... 1 ... 67s
...
Awit kita kalebu debug, spasi jeneng project-pr-1 и project-pr-2, mula kabeh sumber daya liyane kudu langsung dibusak tanpa njupuk parameter afterDaysWithoutDeploy. Iki bisa dideleng ing log operator:
$ kubectl logs stale-feature-branch-operator-6bfbfd4df8-m7sch -n stale-feature-branch-operator
... "msg":"Namespace should be deleted due to debug mode is enabled.","namespaceName":"project-pr-1"}
... "msg":"Namespace is being processing.","namespaceName":"project-pr-1","namespaceCreationTimestamp":"2020-06-16 18:43:58 +0300 EEST"}
... "msg":"Namespace has been deleted.","namespaceName":"project-pr-1"}
... "msg":"Namespace should be deleted due to debug mode is enabled.","namespaceName":"project-pr-2"}
... "msg":"Namespace is being processing.","namespaceName":"project-pr-2","namespaceCreationTimestamp":"2020-06-16 18:43:58 +0300 EEST"}
... "msg":"Namespace has been deleted.","namespaceName":"project-pr-2"}
Yen sampeyan mriksa kasedhiyan sumber daya, padha bakal ing status Terminating (proses pambusakan) utawa wis dibusak (output printah kosong).
$ kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-1 && kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-2
...
Sampeyan bisa mbaleni proses nggawe fixtures kaping pirang-pirang lan priksa manawa lagi dibusak ing menit.
Pilihan
Apa sing bisa ditindakake tinimbang operator sing kerja ing kluster? Ana sawetara pendekatan, kabeh mau ora sampurna (lan kekurangane subyektif), lan saben wong mutusake apa sing paling apik kanggo proyek tartamtu:
Mbusak cabang fitur sajrone mbangun integrasi terus saka cabang master.
Kanggo nindakake iki, sampeyan kudu ngerti panjaluk tarik sing ana gandhengane karo komitmen sing dibangun. Wiwit spasi jeneng cabang fitur ngemot pengenal panyuwunan tarik - nomer, utawa jeneng cabang, pengenal mesthi kudu ditemtokake ing komit.
Master cabang mbangun gagal. Contone, sampeyan duwe tahapan ing ngisor iki: download proyek, mbukak tes, mbangun proyek, nggawe rilis, ngirim kabar, mbusak cabang fitur saka panjalukan tarik pungkasan. Yen mbangun gagal nalika ngirim kabar, sampeyan kudu mbusak kabeh sumber daya ing kluster kanthi manual.
Tanpa konteks sing tepat, mbusak cabang fitur ing master build ora jelas.
Iki bisa uga dudu pendekatan sampeyan. Contone, ing Jenkins, mung siji jinis pipa ndhukung kemampuan kanggo nyimpen konfigurasi ing kode sumber. Nalika nggunakake webhooks, sampeyan kudu nulis skrip dhewe kanggo ngolah. Skrip iki kudu diselehake ing antarmuka Jenkins, sing angel dijaga.
Kanggo nulis Cronjob lan nambah kluster Kubernetes.
Mbuwang wektu kanggo nulis lan ndhukung.
Operator wis kerjane kanthi gaya sing padha, didokumentasikake lan didhukung.