{"id":86902,"date":"2020-07-01T07:42:28","date_gmt":"2020-07-01T05:42:28","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/udalyaem-ustarevshuyu-feature-branch-v-kubernetes-klastere"},"modified":"2020-07-01T07:42:28","modified_gmt":"2020-07-01T05:42:28","slug":"udalyaem-ustarevshuyu-feature-branch-v-kubernetes-klastere","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/udalyaem-ustarevshuyu-feature-branch-v-kubernetes-klastere","title":{"rendered":"Hoqim marramend\u00ebsit e vjetruar t\u00eb feature branch n\u00eb klasterin Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Hoqim marramend\u00ebsit e vjetruar t\u00eb feature branch n\u00eb klasterin Kubernetes\" src=\"\/wp-content\/uploads\/2020\/07\/d97c0cce385c587e16f26f6d19b9d108.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\ud83e\udd47Si t\u00eb arrish n\u00eb qiell dhe t\u00eb b\u00ebhesh pilot | ProHoster <b>Devi n\u00eb ve\u00e7ori<\/b> (aka deploy preview, review app) \u2014 kur \u00ebsht\u00eb kur depelohet jo vet\u00ebm dega master, por edhe \u00e7do pull request n\u00eb nj\u00eb URL unik. Mund t\u00eb kontrolloni n\u00ebse kodi punon n\u00eb mjedisin production, dhe funksionalitetin mund ta tregoni programuesve t\u00eb tjer\u00eb ose menaxher\u00ebve t\u00eb produkteve. Nd\u00ebrsa punoni mbi pull request, \u00e7do commit i ri fshin deploy-in aktual p\u00ebr kodin e vjet\u00ebr, dhe nj\u00eb deploy i ri p\u00ebr kodin e ri krijohet. Pyetje mund t\u00eb lindin kur e keni bashkuar pull request-in n\u00eb deg\u00ebn master. Dega e funksionalitetit nuk ju nevojitet m\u00eb, por burimet e Kubernetes jan\u00eb ende n\u00eb klaster.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>S\u00ebrish mbi deg\u00ebt e funksionalitetit<\/h2>\n<p><\/p>\n<p>Nj\u00eb nga qasjet si t\u00eb b\u00ebni deg\u00ebt e funksionalitetit n\u00eb Kubernetes \u2014 t\u00eb p\u00ebrdorni namespace. N\u00ebse flasim shkurt, konfigurimet production duken k\u00ebshtu:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">kind: Namespace\napiVersion: v1\nmetadata:\n  name: habr-back-end\n...\n\nkind: Deployment\napiVersion: apps\/v1\nmetadata:\n  namespace: habr-back-end\nspec:\n  replicas: 3\n...<\/code><\/pre>\n<p><\/p>\n<p>P\u00ebr deg\u00ebn e funksionalitetit krijohet nj\u00eb namespace me identifikuesin e saj (p\u00ebr shembull, numrin e pull request-it) dhe nj\u00eb prefiks\/sufiks (p\u00ebr shembull, <b>-pr-<\/b>):<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">kind: Namespace\napiVersion: v1\nmetadata:\n  name: habr-back-end-pr-17\n...\n\nkind: Deployment\napiVersion: apps\/v1\nmetadata:\n  namespace: habr-back-end-pr-17\nspec:\n  replicas: 1\n...<\/code><\/pre>\n<p><\/p>\n<p>N\u00eb p\u00ebrgjith\u00ebsi, un\u00eb shkrova <b>Kubernetes Operator<\/b> (nj\u00eb aplikacion q\u00eb ka qasje n\u00eb burimet e klasterit), <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dmytrostriletskyi\/stale-feature-branch-operator\">linku p\u00ebr projektin n\u00eb Github<\/a><\/noindex>. Ai fshin namespace-t q\u00eb i p\u00ebrkasin deg\u00ebve t\u00eb vjetra t\u00eb funksionalitetit. N\u00eb Kubernetes, n\u00ebse fshihni nj\u00eb namespace, burimet e tjera n\u00eb k\u00ebt\u00eb namespace fshihen gjithashtu automatikisht.<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl get pods --all-namespaces | grep -e \"-pr-\"\nNAMESPACE            ... AGE\nhabr-back-end-pr-264 ... 4d8h\nhabr-back-end-pr-265 ... 5d7h<\/code><\/pre>\n<p><\/p>\n<p>P\u00ebr m\u00ebnyr\u00ebn si t\u00eb implementoni deg\u00ebt e funksionalitetit n\u00eb klaster, mund t\u00eb lexoni <noindex><a rel=\"nofollow\" href=\"https:\/\/itnext.io\/feature-deployments-in-kubernetes-c74bdcff0d8e\">k\u00ebtu<\/a><\/noindex> dhe <noindex><a rel=\"nofollow\" href=\"https:\/\/codefresh.io\/kubernetes-tutorial\/dynamically-creating-k8s-namespaces-every-branch-pull-request-2\">k\u00ebtu<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h2>Motivimi<\/h2>\n<p><\/p>\n<p>Le t\u00eb shohim nj\u00eb cik\u00ebl t\u00eb zakonsh\u00ebm jet\u00ebsor t\u00eb nj\u00eb pull request-i me integrimin e vazhduesh\u00ebm (<code>integrim i vazhduesh\u00ebm<\/code>):<\/p>\n<p><\/p>\n<ol>\n<li>D\u00ebrgojm\u00eb nj\u00eb commit t\u00eb ri n\u00eb deg\u00eb.<\/li>\n<li>N\u00eb nd\u00ebrtim, lan\u00e7ohet linterat dhe\/ose testet.<\/li>\n<li>Konfigurimet e Kubernetes p\u00ebr pull request-in krijohen n\u00eb flak\u00eb (p\u00ebr shembull, numri i tij vendoset n\u00eb nj\u00eb model t\u00eb gatsh\u00ebm).<\/li>\n<li>Me ndihm\u00ebn e kubectl apply, konfigurimet shkojn\u00eb n\u00eb klaster (implementohet).<\/li>\n<li>K\u00ebrkesa e t\u00ebrheqjes bashkohet n\u00eb deg\u00ebn master.<\/li>\n<\/ol>\n<p><\/p>\n<p>Nd\u00ebrsa punoni n\u00eb pull request, \u00e7do commit i ri fshin deploy-in aktual p\u00ebr kodin e vjet\u00ebr, dhe nj\u00eb deploy i ri p\u00ebr kodin e ri krijohet. Por kur pull request-i bashkohet n\u00eb deg\u00ebn master, do t\u00eb nd\u00ebrtohet vet\u00ebm dega master. Si rezultat, ne harrojm\u00eb p\u00ebr pull request-in, nd\u00ebrsa burimet e tij n\u00eb Kubernetes jan\u00eb ende n\u00eb klaster.<\/p>\n<p><\/p>\n<h2>Si t\u00eb p\u00ebrdorni<\/h2>\n<p><\/p>\n<p>Instaloni projektin me komand\u00ebn e m\u00ebposhtme:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl apply -f https:\/\/raw.githubusercontent.com\/dmytrostriletskyi\/stale-feature-branch-operator\/master\/configs\/production.yml<\/code><\/pre>\n<p><\/p>\n<p>Krijoni nj\u00eb sked\u00eb me p\u00ebrmbajtjen e m\u00ebposhtme dhe instaloni p\u00ebrmes <code>kubectl apply -f<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: feature-branch.dmytrostriletskyi.com\/v1\nkind: StaleFeatureBranch\nmetadata:\n  name: stale-feature-branch\nspec:\n  namespaceSubstring: -pr-\n  afterDaysWithoutDeploy: 3<\/code><\/pre>\n<p><\/p>\n<p>Parametri <b>namespaceSubstring<\/b> nevojitet, p\u00ebr t\u00eb filtruar namespace-t p\u00ebr pull request-et nga namespace t\u00eb tjera. P\u00ebr shembull, n\u00ebse n\u00eb klaster ka k\u00ebto namespace: <code>habr-back-end<\/code>, <code>habr-front-end<\/code>, <code>habr-back-end-pr-17<\/code>, <code>habr-back-end-pr-33<\/code>, at\u00ebher\u00eb kandidat\u00ebt p\u00ebr fshirje do t\u00eb jen\u00eb <code>habr-back-end-pr-17<\/code>, <code>habr-back-end-pr-33<\/code>.<\/p>\n<p><\/p>\n<p>Parametri <b>afterDaysWithoutDeploy<\/b> nevojitet p\u00ebr t\u00eb fshir\u00eb namespace-t e vjetra. P\u00ebr shembull, n\u00ebse namespace \u00ebsht\u00eb krijuar <code>3 dit\u00eb 1 or\u00eb<\/code> mbrapa, dhe n\u00eb parametrin \u00ebsht\u00eb e p\u00ebrcaktuar <code>3 dit\u00eb<\/code>, ky namespace do t\u00eb fshihet. Funksionon edhe n\u00eb an\u00ebn tjet\u00ebr, n\u00ebse namespace \u00ebsht\u00eb krijuar <code>2 dit\u00eb 23 or\u00eb<\/code> mbrapa, dhe n\u00eb parametrin \u00ebsht\u00eb e p\u00ebrcaktuar <code>3 dit\u00eb<\/code>, ky namespace nuk do t\u00eb fshihet.<\/p>\n<p><\/p>\n<p>Ka nj\u00eb paramet\u00ebr tjet\u00ebr, ai p\u00ebrcakton se sa shpesh t\u00eb skanohet t\u00eb gjitha namespace-t dhe t\u00eb kontrollohen p\u00ebr dit\u00ebt pa deploy \u2014 <b>checkEveryMinutes<\/b>. N\u00eb m\u00ebnyr\u00eb default, ai \u00ebsht\u00eb baras <code>30 minutave<\/code>.<\/p>\n<p><\/p>\n<h2>Si funksionon kjo<\/h2>\n<p><\/p>\n<p>N\u00eb praktik\u00eb, do t\u00eb nevojitet:<\/p>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/get-docker\">Docker<\/a><\/noindex> p\u00ebr t\u00eb punuar n\u00eb nj\u00eb ambient t\u00eb izoluar.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-minikube\">Minikube<\/a><\/noindex> do t\u00eb ngrej\u00eb klusterin Kubernetes lokal.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-kubectl\">kubectl<\/a><\/noindex> \u2014 nd\u00ebrfaqe komandash p\u00ebr menaxhimin e klusterit.<\/li>\n<\/ol>\n<p><\/p>\n<p>Ngrem\u00eb klusterin Kubernetes lokal:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ minikube start --vm-driver=docker\nminikube v1.11.0 n\u00eb Darwin 10.15.5\nDuke p\u00ebrdorur drejtuesin docker duke u bazuar n\u00eb profilin ekzistues.\nDuke nisur pik\u00ebn e kontrollit minikube n\u00eb klusterin minikube.<\/code><\/pre>\n<p><\/p>\n<p>Specifikoni <code>kubectl<\/code> p\u00ebrdor klusterin lokal si default:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl config use-context minikube\nKaluan n\u00eb kontekstin \"minikube\".<\/code><\/pre>\n<p><\/p>\n<p>Shkarkojm\u00eb konfigurimet p\u00ebr mjedisin e production-it:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ curl https:\/\/raw.githubusercontent.com\/dmytrostriletskyi\/stale-feature-branch-operator\/master\/configs\/production.yml &gt; stale-feature-branch-production-configs.yml<\/code><\/pre>\n<p><\/p>\n<p>Duke pasur parasysh se konfigurimet production jan\u00eb t\u00eb vendosura p\u00ebr t\u00eb kontrolluar namespace-t e vjetra, dhe n\u00eb klasterin ton\u00eb t\u00eb sapo ngritur nuk ka atyre, do t\u00eb z\u00ebvend\u00ebsojm\u00eb variablin e ambientit <code>IS_DEBUG<\/code> n\u00eb <code>true<\/code>. Me k\u00ebt\u00eb vler\u00eb, parametri <code>afterDaysWithoutDeploy<\/code> nuk merret parasysh dhe namespace-t nuk kontrollohen p\u00ebr dit\u00ebt pa deploy, vet\u00ebm p\u00ebr p\u00ebrfshirjen e n\u00ebnstring\u00ebs (<code>-pr-<\/code>).<\/p>\n<p><\/p>\n<p>N\u00ebse jeni n\u00eb <code>Linux<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ sed -i 's|false|true|g' stale-feature-branch-production-configs.yml<\/code><\/pre>\n<p><\/p>\n<p>N\u00ebse jeni n\u00eb <code>macOS<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ sed -i \"\" 's|false|true|g' stale-feature-branch-production-configs.yml<\/code><\/pre>\n<p><\/p>\n<p>Instalojm\u00eb projektin:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl apply -f stale-feature-branch-production-configs.yml<\/code><\/pre>\n<p><\/p>\n<p>Kontrollojm\u00eb q\u00eb n\u00eb kluster \u00ebsht\u00eb shfaqur burimi <code>StaleFeatureBranch<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl api-resources | grep stalefeaturebranches\nEMRI                 ... GRUPI I API-s\u00eb                             ... LLOJI\nstalefeaturebranches ... feature-branch.dmytrostriletskyi.com ... StaleFeatureBranch<\/code><\/pre>\n<p><\/p>\n<p>Kontrollojm\u00eb q\u00eb n\u00eb kluster \u00ebsht\u00eb shfaqur operatori:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl get pods --namespace stale-feature-branch-operator\nEMRI                                           ... STATUS  ... MOSH\u00cb\nstale-feature-branch-operator-6bfbfd4df8-m7sch ... Duke punuar ... 38s<\/code><\/pre>\n<p><\/p>\n<p>N\u00ebse shohim n\u00eb logjet e tij, ai \u00ebsht\u00eb gati p\u00ebr t\u00eb procesuar burimet <code>StaleFeatureBranch<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl logs stale-feature-branch-operator-6bfbfd4df8-m7sch -n stale-feature-branch-operator\n... \"msg\":\"Versioni e Operatorit: 0.0.1\"\n...\n... \"msg\":\"Duke filluar EventSource\", ... , \"source\":\"burimi i llojit: \/, Lloji=\"}\n... \"msg\":\"Duke filluar Kontrolluesin\", ...}\n... \"msg\":\"Duke filluar pun\u00ebtor\u00ebt\", ..., \"numri i pun\u00ebtor\u00ebve\":1}<\/code><\/pre>\n<p><\/p>\n<p>Instalojm\u00eb fixtures-n\u00eb <code>aparatet<\/code> (konfigurata t\u00eb gatshme p\u00ebr modelimin e burimeve t\u00eb klasterit) p\u00ebr burimin <code>StaleFeatureBranch<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl apply -f https:\/\/raw.githubusercontent.com\/dmytrostriletskyi\/stale-feature-branch-operator\/master\/fixtures\/stale-feature-branch.yml<\/code><\/pre>\n<p><\/p>\n<p>N\u00eb konfigurime, \u00ebsht\u00eb e specifikuar t\u00eb k\u00ebrkohen namespace-t me nj\u00eb n\u00ebnstring\u00eb <code>-pr-<\/code> nj\u00eb her\u00eb n\u00eb <code>1 minut\u00eb<\/code>.:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: feature-branch.dmytrostriletskyi.com\/v1\nkind: StaleFeatureBranch\nmetadata:\n  name: stale-feature-branch\nspec:\n  namespaceSubstring: -pr-\n  afterDaysWithoutDeploy: 1 \n  checkEveryMinutes: 1<\/code><\/pre>\n<p><\/p>\n<p>Operatori ka reaguar dhe \u00ebsht\u00eb gati p\u00ebr t\u00eb kontrolluar namespace-t:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl logs stale-feature-branch-operator-6bfbfd4df8-m7sch -n stale-feature-branch-operator\n... \"msg\":\"Duke procesuar branch-in e vjet\u00ebr t\u00eb ve\u00e7orive.\",\"namespaceSubstring\":\"-pr-\",\"afterDaysWithoutDeploy\":1,\"checkEveryMinutes\":1,\"isDebug\":\"true\"}<\/code><\/pre>\n<p><\/p>\n<p>Instalojm\u00eb <code>aparatet<\/code>, q\u00eb p\u00ebrfshin dy namespace (<code>project-pr-1<\/code>, <code>project-pr-2<\/code>) dhe t\u00eb tyre <code>deployed<\/code>, <code>sh\u00ebrbimet<\/code>, <code>ingress<\/code>, etj.:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ 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\n...\nnamespace\/project-pr-1 created\ndeployment.apps\/project-pr-1 created\nservice\/project-pr-1 created\nhorizontalpodautoscaler.autoscaling\/project-pr-1 created\nsecret\/project-pr-1 created\nconfigmap\/project-pr-1 created\ningress.extensions\/project-pr-1 created\nnamespace\/project-pr-2 created\ndeployment.apps\/project-pr-2 created\nservice\/project-pr-2 created\nhorizontalpodautoscaler.autoscaling\/project-pr-2 created\nsecret\/project-pr-2 created\nconfigmap\/project-pr-2 created\ningress.extensions\/project-pr-2 created<\/code><\/pre>\n<p><\/p>\n<p>Po kontrollojm\u00eb q\u00eb t\u00eb gjitha burimet e m\u00ebsip\u00ebrme jan\u00eb krijuar me sukses:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-1 &amp;&amp; kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-2\n...\nNAME                              ... READY ... STATUS  ... AGE\npod\/project-pr-1-848d5fdff6-rpmzw ... 1\/1   ... Running ... 67s\n\nNAME                         ... READY ... AVAILABLE ... AGE\ndeployment.apps\/project-pr-1 ... 1\/1   ... 1         ... 67s\n...<\/code><\/pre>\n<p><\/p>\n<p>Pasi kemi aktivizuar <code>debug<\/code>, namespace-t <code>project-pr-1<\/code> dhe <code>project-pr-2<\/code>, pra edhe t\u00eb gjitha burimet e tjera, do t\u00eb duhet t\u00eb fshihen menj\u00ebher\u00eb pa marr\u00eb parasysh parametrin <code>afterDaysWithoutDeploy<\/code>. N\u00eb log\u00ebt e operatorit kjo \u00ebsht\u00eb e dukshme:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl logs stale-feature-branch-operator-6bfbfd4df8-m7sch -n stale-feature-branch-operator\n... \"msg\":\"Namespace duhet t\u00eb fshihet pasi q\u00eb \u00ebsht\u00eb aktivizuar moda e DEBUG.\",\"namespaceName\":\"projekt-pr-1\"}\n... \"msg\":\"Namespace \u00ebsht\u00eb duke u procesuar.\",\"namespaceName\":\"projekt-pr-1\",\"namespaceCreationTimestamp\":\"2020-06-16 18:43:58 +0300 EEST\"}\n... \"msg\":\"Namespace \u00ebsht\u00eb fshir\u00eb.\",\"namespaceName\":\"projekt-pr-1\"}\n... \"msg\":\"Namespace duhet t\u00eb fshihet pasi q\u00eb \u00ebsht\u00eb aktivizuar moda e DEBUG.\",\"namespaceName\":\"projekt-pr-2\"}\n... \"msg\":\"Namespace \u00ebsht\u00eb duke u procesuar.\",\"namespaceName\":\"projekt-pr-2\",\"namespaceCreationTimestamp\":\"2020-06-16 18:43:58 +0300 EEST\"}\n... \"msg\":\"Namespace \u00ebsht\u00eb fshir\u00eb.\",\"namespaceName\":\"projekt-pr-2\"}<\/code><\/pre>\n<p><\/p>\n<p>N\u00ebse kontrolloni pranin\u00eb e burimeve, ato do t\u00eb jen\u00eb n\u00eb statusin <code>Terminating<\/code> (procesi i fshirjes) ose tashm\u00eb t\u00eb fshira (dalja e komand\u00ebs \u00ebsht\u00eb e zbraz\u00ebt).<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-1 &amp;&amp; kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-2\n...<\/code><\/pre>\n<p><\/p>\n<p>Mund t\u00eb p\u00ebrs\u00ebrisni procesin e krijimit <code>aparatet<\/code> disa her\u00eb dhe t\u00eb siguroheni q\u00eb ato do t\u00eb fshihen brenda nj\u00eb minute.<\/p>\n<p><\/p>\n<h2>Alternativat<\/h2>\n<p><\/p>\n<p>\u00c7far\u00eb mund t\u00eb b\u00ebni n\u00eb vend t\u00eb operatorit q\u00eb funksionon n\u00eb klaster? Ka disa qasje, t\u00eb gjitha jan\u00eb t\u00eb pafund dhe t\u00eb metat e tyre jan\u00eb subjektive, dhe secili vendos se cila \u00ebsht\u00eb m\u00eb e p\u00ebrshtatshme p\u00ebr projektin e tij:<\/p>\n<p><\/p>\n<ol>\n<li>\n<p>T\u00eb fshihen branch-at e ve\u00e7orive gjat\u00eb nd\u00ebrtimit t\u00eb branch-it master t\u00eb integrimit t\u00eb vazhduesh\u00ebm.<\/p>\n<p><\/p>\n<ul>\n<li>P\u00ebr k\u00ebt\u00eb, duhet t\u00eb dihet se cili pull request i p\u00ebrket commit-it q\u00eb po nd\u00ebrtohet. Duke qen\u00eb se namespace i branch-it t\u00eb ve\u00e7orive p\u00ebrmban identifikuesin e pull request-it - numri i tij, ose emri i branch-it, identifikuesi gjithmon\u00eb do t\u00eb duhet t\u00eb shpallet n\u00eb commit.<\/li>\n<li>Nd\u00ebrtimet e branch-eve master d\u00ebshtojn\u00eb. P\u00ebr shembull, keni k\u00ebto hapa: shkarko projektin, ekzekuto testet, nd\u00ebrto projektin, b\u00ebj nj\u00eb publikim, d\u00ebrgo njoftime, pastroni branch-in e ve\u00e7orive t\u00eb pull request-it m\u00eb t\u00eb fundit. N\u00ebse nd\u00ebrtimi d\u00ebshton gjat\u00eb d\u00ebrgimit t\u00eb njoftimeve, do t'ju duhet t\u00eb fshini \u00e7do burim n\u00eb klaster manualisht.<\/li>\n<li>Pa kontekstin e duhur, fshirja e branch-it t\u00eb ve\u00e7orive n\u00eb nd\u00ebrtimin master nuk \u00ebsht\u00eb e qart\u00eb.<\/li>\n<\/ul>\n<p>\n<\/li>\n<li>\n<p>P\u00ebrdorimi i webhook-\u00ebve (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.community\/t\/trigger-jenkins-job-when-a-pull-request-is-merged-to-a-branch\/1169\">\u00ebsht\u00eb<\/a><\/noindex>).<\/p>\n<p><\/p>\n<ul>\n<li>Mund t\u00eb mos jet\u00eb qasja juaj. P\u00ebr shembull, n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jenkins.io\">Jenkins<\/a><\/noindex>, vet\u00ebm nj\u00eb lloj pipeline-i mb\u00ebshtet mund\u00ebsin\u00eb p\u00ebr t\u00eb ruajtur konfigurimet e tij n\u00eb kodin burimor. Kur p\u00ebrdorni webhook-\u00eb, duhet t\u00eb shkruani skriptin tuaj p\u00ebr p\u00ebrpunimin e tyre. Ky skript do t\u00eb duhet t\u00eb vendoset n\u00eb nd\u00ebrfaqen e Jenkins-it, e cila \u00ebsht\u00eb e v\u00ebshtir\u00eb p\u00ebr t'u mbajtur.<\/li>\n<\/ul>\n<p>\n<\/li>\n<li>\n<p>Shkruani <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/cron-jobs\/\">Cronjob<\/a><\/noindex> dhe shtoni klasterin Kubernetes.<\/p>\n<p><\/p>\n<ul>\n<li>Koha e shpenzuar p\u00ebr shkruarjen dhe mb\u00ebshtetje.<\/li>\n<li>Operatori tashm\u00eb funksionon n\u00eb nj\u00eb stil t\u00eb ngjash\u00ebm, \u00ebsht\u00eb dokumentuar dhe mb\u00ebshtetet.<\/li>\n<\/ul>\n<p>\n<\/li>\n<\/ol>\n<p><\/p>\n<p>Faleminderit p\u00ebr v\u00ebmendjen ndaj artikullit. <strong><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dmytrostriletskyi\/stale-feature-branch-operator\">Shqyrtimi i projektit n\u00eb Github<\/a><\/noindex><\/strong>.<\/p>\n<p>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/508534\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442! Feature branch (aka deploy preview, review app) \u2014 \u044d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e master \u0432\u0435\u0442\u043a\u0430, \u043d\u043e \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 pull request \u043d\u0430 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 URL. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043b\u0438 \u043a\u043e\u0434 \u0432 production-\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438, \u0444\u0438\u0447\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c \u0438\u043b\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u043b\u043e\u0433\u0430\u043c. \u041f\u043e\u043a\u0430 \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u0432 pull request&#8217;\u0435, \u043a\u0430\u0436\u0434\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 commit \u0442\u0435\u043a\u0443\u0449\u0438\u0439 deploy \u0434\u043b\u044f \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f, \u0430 \u043d\u043e\u0432\u044b\u0439 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":86903,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-86902","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442!\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/udalyaem-ustarevshuyu-feature-branch-v-kubernetes-klastere\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0443\u044e feature branch \u0432 Kubernetes \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442!\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/udalyaem-ustarevshuyu-feature-branch-v-kubernetes-klastere\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-07-01T05:42:28+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-01T05:42:28+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Fshijm\u00eb branch-in e ve\u00e7orive t\u00eb vjetruara n\u00eb klasterin Kubernetes | ProHoster","description":"\ud83e\udd47Si t\u00eb arrish n\u00eb qiell dhe t\u00eb b\u00ebhesh pilot | ProHoster","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/udalyaem-ustarevshuyu-feature-branch-v-kubernetes-klastere","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0443\u044e feature branch \u0432 Kubernetes \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442!","og:url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/udalyaem-ustarevshuyu-feature-branch-v-kubernetes-klastere","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-07-01T05:42:28+00:00","article:modified_time":"2020-07-01T05:42:28+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"86902","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 14:03:55","updated":"2022-10-03 08:48:02","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/86902","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=86902"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/86902\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/86903"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=86902"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=86902"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=86902"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}