
Hello! Cawangan ciri (aka deploy preview, review app) — ini adalah apabila anda menggunakan bukan sahaja cawangan induk tetapi juga setiap permintaan tarik ke URL unik. Anda boleh menyemak sama ada kod tersebut berfungsi dalam persekitaran pengeluaran dan anda boleh menunjukkan ciri tersebut kepada pengaturcara atau pengurus produk lain. Semasa anda membuat permintaan tarik, dengan setiap komitmen baharu, penggunaan semasa untuk kod lama akan dipadamkan dan penggunaan baharu untuk kod baharu dilancarkan. Soalan mungkin timbul apabila anda menggabungkan permintaan tarik ke cawangan induk. Anda tidak lagi memerlukan cawangan ciri, tetapi sumber Kubernetes masih berada dalam kelompok.
Lebih lanjut mengenai cawangan ciri
Satu pendekatan untuk mencipta cawangan ciri dalam Kubernetes ialah menggunakan ruang nama. Secara ringkas, konfigurasi pengeluaran kelihatan seperti ini:
kind: Namespace
apiVersion: v1
metadata:
name: habr-back-end
...
kind: Deployment
apiVersion: apps/v1
metadata:
namespace: habr-back-end
spec:
replicas: 3
...Untuk cawangan ciri, ruang nama dicipta dengan pengecamnya (contohnya, nombor permintaan tarik) dan beberapa awalan/paspasan (contohnya, -pr-):
kind: Namespace
apiVersion: v1
metadata:
name: habr-back-end-pr-17
...
kind: Deployment
apiVersion: apps/v1
metadata:
namespace: habr-back-end-pr-17
spec:
replicas: 1
...Bagaimanapun, saya menulis Operator Kubernetes (aplikasi yang mempunyai akses kepada sumber kluster), Ia mengalih keluar ruang nama yang dimiliki oleh cawangan ciri lama. Dalam Kubernetes, jika anda memadamkan ruang nama, sumber lain dalam ruang nama itu juga dipadamkan secara automatik.
$ kubectl get pods --all-namespaces | grep -e "-pr-"
NAMESPACE ... AGE
habr-back-end-pr-264 ... 4d8h
habr-back-end-pr-265 ... 5d7hAnda boleh membaca tentang cara melaksanakan cawangan ciri ke dalam kelompok и .
Motivasi
Mari lihat kitaran hayat permintaan tarik biasa dengan penyepaduan berterusan (continuous integration):
- Tolak komitmen baharu ke cawangan.
- Pada binaan, linter dan/atau ujian dijalankan.
- Konfigurasi permintaan tarik Kubernetes dijana dengan cepat (contohnya, nombornya digantikan ke templat siap sedia).
- Menggunakan kubectl apply, konfigurasi digunakan pada kluster.
- Permintaan tarik digabungkan ke dalam cawangan induk.
Semasa anda mengusahakan permintaan tarik, setiap komit baharu mengalih keluar penggunaan semasa untuk kod lama dan penggunaan baharu untuk kod baharu digunakan. Tetapi apabila permintaan tarik digabungkan ke dalam cawangan induk, hanya cawangan induk akan dibina. Akibatnya, permintaan tarik dilupakan, tetapi sumber Kubernetesnya masih dalam kelompok.
Cara menggunakannya
Pasang projek menggunakan arahan di bawah:
$ kubectl apply -f https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/configs/production.ymlCipta fail dengan kandungan berikut dan pasang melalui kubectl apply -f:
apiVersion: feature-branch.dmytrostriletskyi.com/v1
kind: StaleFeatureBranch
metadata:
name: stale-feature-branch
spec:
namespaceSubstring: -pr-
afterDaysWithoutDeploy: 3Parameter ruang namaSubrentetan Ini diperlukan untuk menapis ruang nama untuk permintaan tarik daripada ruang nama lain. Contohnya, jika kluster mengandungi ruang nama berikut: habr-back-end, habr-front-end, habr-back-end-pr-17, habr-back-end-pr-33, maka calon yang akan dipadamkan ialah habr-back-end-pr-17, habr-back-end-pr-33.
Parameter afterDaysWithoutDeploy diperlukan untuk memadam ruang nama lama. Contohnya, jika ruang nama dicipta 3 дня 1 час belakang, dan parameter menunjukkan 3 дня, ruang nama ini akan dipadamkan. Ini juga berfungsi sebaliknya jika ruang nama dibuat. 2 дня 23 часа belakang, dan parameter menunjukkan 3 дня, ruang nama ini tidak akan dipadamkan.
Terdapat satu lagi parameter, ia bertanggungjawab untuk kekerapan mengimbas semua ruang nama dan menyemak untuk hari tanpa penggunaan - semakEveryMinutesSecara lalai ia adalah sama dengan 30 минутам.
Как это работает
Dalam amalan, anda memerlukan:
- untuk bekerja dalam persekitaran terpencil.
- akan menyediakan kluster Kubernetes secara tempatan.
- — antara muka baris arahan untuk pengurusan kluster.
Kami menyediakan kluster Kubernetes secara tempatan:
$ 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.Kami menunjukkan kubectl gunakan kluster tempatan secara lalai:
$ kubectl config use-context minikube
Switched to context "minikube".Muat turun konfigurasi untuk persekitaran pengeluaran:
$ curl https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/configs/production.yml > stale-feature-branch-production-configs.ymlMemandangkan konfigurasi pengeluaran dikonfigurasikan untuk menyemak ruang nama lama, dan kluster kami yang baru dibuat tidak mempunyainya, kami akan menggantikan pembolehubah persekitaran IS_DEBUG pada trueDengan nilai ini, parameter afterDaysWithoutDeploy tidak diambil kira dan ruang nama tidak disemak selama beberapa hari tanpa penggunaan, hanya untuk kejadian subrentetan (-pr-).
Jika anda berada di Linux:
$ sed -i 's|false|true|g' stale-feature-branch-production-configs.ymlJika anda berada di macOS:
$ sed -i "" 's|false|true|g' stale-feature-branch-production-configs.ymlPasang projek:
$ kubectl apply -f stale-feature-branch-production-configs.ymlKami menyemak bahawa sumber telah muncul dalam kelompok StaleFeatureBranch:
$ kubectl api-resources | grep stalefeaturebranches
NAME ... APIGROUP ... KIND
stalefeaturebranches ... feature-branch.dmytrostriletskyi.com ... StaleFeatureBranchKami menyemak bahawa pengendali telah muncul dalam kelompok:
$ kubectl get pods --namespace stale-feature-branch-operator
NAME ... STATUS ... AGE
stale-feature-branch-operator-6bfbfd4df8-m7sch ... Running ... 38sJika anda melihat lognya, ia sedia untuk memproses sumber. StaleFeatureBranch:
$ kubectl logs stale-feature-branch-operator-6bfbfd4df8-m7sch -n stale-feature-branch-operator
... "msg":"Operator Version: 0.0.1"}
...
... "msg":"Starting EventSource", ... , "source":"kind source: /, Kind="}
... "msg":"Starting Controller", ...}
... "msg":"Starting workers", ..., "worker count":1}Kami memasang yang sudah siap fixtures (konfigurasi sedia untuk memodelkan sumber kluster) untuk sumber tersebut StaleFeatureBranch:
$ kubectl apply -f https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/fixtures/stale-feature-branch.ymlKonfigurasi menentukan untuk mencari ruang nama dengan subrentetan -pr- sekali a 1 минуту.:
apiVersion: feature-branch.dmytrostriletskyi.com/v1
kind: StaleFeatureBranch
metadata:
name: stale-feature-branch
spec:
namespaceSubstring: -pr-
afterDaysWithoutDeploy: 1
checkEveryMinutes: 1Operator telah bertindak balas dan bersedia untuk menyemak ruang nama:
$ 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"}Tetapkan fixtures, mengandungi dua ruang nama (project-pr-1, project-pr-2) dan mereka deployments, services, ingress, dan seterusnya:
$ 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 createdMari kita semak sama ada semua sumber di atas telah berjaya dibuat:
$ 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
...Oleh kerana kami telah memasukkan debug, ruang nama project-pr-1 и project-pr-2, oleh itu, semua sumber lain perlu segera dipadamkan tanpa mengambil kira parameter afterDaysWithoutDeployIni boleh dilihat dalam 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"}Jika anda menyemak ketersediaan sumber, ia akan berada dalam status Terminating (proses pemadaman) atau sudah dipadam (output arahan 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
...Anda boleh mengulangi proses penciptaan fixtures beberapa kali dan pastikan ia dikeluarkan dalam masa seminit.
Alternatif
Apakah yang boleh dilakukan dan bukannya pengendali yang bekerja dalam kelompok? Terdapat beberapa pendekatan, tiada satu pun daripada mereka yang ideal (dan kelemahannya adalah subjektif), dan setiap orang memutuskan sendiri apa yang paling sesuai untuk projek tertentu:
Padamkan cawangan ciri semasa binaan penyepaduan berterusan cawangan induk.
- Untuk melakukan ini, anda perlu mengetahui permintaan tarik mana yang dimiliki oleh komit yang sedang dibina. Memandangkan ruang nama cawangan ciri mengandungi pengecam permintaan tarik—nombor atau nama cawangannya—pengecam akan sentiasa perlu dinyatakan dalam komit.
- Pembinaan cawangan induk gagal. Contohnya, anda mempunyai peringkat berikut: muat turun projek, jalankan ujian, bina projek, buat keluaran, hantar pemberitahuan dan bersihkan cabang ciri permintaan tarik terakhir. Jika binaan gagal semasa menghantar pemberitahuan, anda perlu memadamkan semua sumber dalam kelompok secara manual.
- Tanpa konteks yang betul, mengalih keluar cawangan ciri dalam binaan induk adalah tidak jelas.
Menggunakan webhooks ().
- Ini mungkin bukan pendekatan anda. Contohnya, dalam Hanya satu jenis saluran paip menyokong penyimpanan konfigurasinya dalam kod sumber. Apabila menggunakan webhooks, anda perlu menulis skrip anda sendiri untuk mengendalikannya. Skrip ini perlu dihoskan dalam antara muka Jenkins, yang sukar untuk dikekalkan.
Untuk menulis dan tambahkan gugusan Kubernetes.
- Masa yang dihabiskan untuk menulis dan menyokong.
- Pengendali sudah berfungsi dalam gaya yang sama, didokumenkan dan disokong.
Terima kasih atas perhatian anda terhadap artikel tersebut. .
Sumber: www.habr.com
