{"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":"Heqim branch-in e vjetruar t\u00eb funksionalitetit n\u00eb klasterin Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Heqim branch-in e vjetruar t\u00eb funksionalitetit n\u00eb klasterin Kubernetes\" src=\"\/wp-content\/uploads\/2020\/07\/d97c0cce385c587e16f26f6d19b9d108.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>P\u00ebrsh\u00ebndetje! <b>Dega feature<\/b> (aka deploy preview, review app) \u2014 kur \u00ebsht\u00eb kur depozitohet jo vet\u00ebm dega master, por edhe \u00e7do pull request n\u00eb nj\u00eb URL unik. Mund ta kontrolloni n\u00ebse kodi funksionon n\u00eb ambientin prodhues, mund t\u00eb tregoni tiparin p\u00ebr programues t\u00eb tjer\u00eb ose menaxhues produktesh. P\u00ebr sa koh\u00eb q\u00eb jeni duke punuar n\u00eb pull request, \u00e7do commit i ri aktualizon depozitimin p\u00ebr kodin e vjet\u00ebr, nd\u00ebrsa nj\u00eb depozit\u00eb e re p\u00ebr kodin e ri krijohet. Pyetje mund t\u00eb lindin at\u00ebher\u00eb kur ju e bashkoni pull request me deg\u00ebn master. Dega e tipareve (feature branch) nuk ju nevojitet m\u00eb, por burimet Kubernetes ende gjenden n\u00eb klaster.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>M\u00eb shum\u00eb rreth feature branch<\/h2>\n<p><\/p>\n<p>Nj\u00eb nga qasjet p\u00ebr t\u00eb krijuar feature branch n\u00eb Kubernetes \u00ebsht\u00eb p\u00ebrdorimi i namespace-ve. N\u00eb m\u00ebnyr\u00eb t\u00eb shkurt\u00ebr, konfigurimet prodhuese duket 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 feature branch krijohet nj\u00eb namespace me identifikuesin e saj (p.sh., numri i pull request) dhe ndonj\u00eb prefiks\/postfix (p.sh., <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> (aplikacioni q\u00eb ka qasje n\u00eb resurset e klasterit), <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dmytrostriletskyi\/stale-feature-branch-operator\">shkolla p\u00ebr projektin n\u00eb Github<\/a><\/noindex>. Ai eliminon namespace-t q\u00eb i p\u00ebrkasin feature branch-ve t\u00eb vjetra. N\u00eb Kubernetes, n\u00ebse nj\u00eb namespace fshihet, burime t\u00eb tjera n\u00eb at\u00eb namespace fshihen automatikisht gjithashtu.<\/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 se si t\u00eb implementoni feature branch 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 shikojm\u00eb nj\u00eb cik\u00ebl tipik t\u00eb jet\u00ebs s\u00eb nj\u00eb pull requesti me integrimin e vazhduesh\u00ebm (<code>integrimi i vazhduesh\u00ebm<\/code>):<\/p>\n<p><\/p>\n<ol>\n<li>Shtojm\u00eb nj\u00eb commit t\u00eb ri n\u00eb deg\u00eb.<\/li>\n<li>Gjat\u00eb nd\u00ebrtimit, aktivizohen linters dhe\/ose testet.<\/li>\n<li>Konfigurimet Kubernetes t\u00eb pull requestit krijohen n\u00eb fluks (p.sh., numri i tij vendoset n\u00eb nj\u00eb model t\u00eb gatsh\u00ebm).<\/li>\n<li>Me ndihm\u00ebn e kubectl apply, konfigurimet hyjn\u00eb n\u00eb klaster (deploy).<\/li>\n<li>K\u00ebrkesat p\u00ebr t\u00ebrheqje bashkohen n\u00eb deg\u00ebn master.<\/li>\n<\/ol>\n<p><\/p>\n<p>P\u00ebr sa koh\u00eb q\u00eb jeni duke punuar n\u00eb pull request, \u00e7do commit i ri aktualizon depozitimin p\u00ebr kodin e vjet\u00ebr, nd\u00ebrsa nj\u00eb depozit\u00eb e re p\u00ebr kodin e ri krijohet. Por kur pull requesti bashkohet me deg\u00ebn master, vet\u00ebm dega master do t\u00eb nd\u00ebrtohet. Si rezultat, ne harrojm\u00eb p\u00ebr pull requestin, nd\u00ebrsa burimet e tij Kubernetes akoma ndodhen n\u00eb klaster.<\/p>\n<p><\/p>\n<h2>Si t\u00eb p\u00ebrdorim<\/h2>\n<p><\/p>\n<p>Instaloni projektin me komand\u00ebn m\u00eb posht\u00eb:<\/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>Krijo nj\u00eb skedar me p\u00ebrmbajtjen e m\u00ebposhtme dhe vendos 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 requestet nga namespace t\u00eb tjera. P\u00ebr shembull, n\u00ebse klasteri ka namespace t\u00eb m\u00ebposhtme: <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\u00eb vjetra. P\u00ebr shembull, n\u00ebse namespace \u00ebsht\u00eb krijuar <code>3 dit\u00eb 1 or\u00eb<\/code> m\u00eb par\u00eb, dhe n\u00eb parametrin \u00ebsht\u00eb caktuar <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> m\u00eb par\u00eb, dhe n\u00eb parametrin \u00ebsht\u00eb caktuar <code>3 dit\u00eb<\/code>, ky namespace nuk do t\u00eb fshihet.<\/p>\n<p><\/p>\n<p>Ka gjithashtu nj\u00eb paramet\u00ebr tjet\u00ebr, i cili p\u00ebrgjigjet p\u00ebr sa shpesh do t\u00eb skanohet t\u00eb gjith\u00eb namespace-t dhe do t\u00eb kontrollohet p\u00ebr dit\u00ebt pa ndonj\u00eb depozitim \u2014 <b>checkEveryMinutes<\/b>. N\u00eb m\u00ebnyr\u00eb t\u00eb paracaktuar, ai \u00ebsht\u00eb i barabart\u00eb me <code>30 minuta<\/code>.<\/p>\n<p><\/p>\n<h2>Si funksionon<\/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 mjedis 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 klasterin Kubernetes lokal.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-kubectl\">kubectl<\/a><\/noindex> \u2014 nd\u00ebrfaqja e komandave p\u00ebr t\u00eb menaxhuar klasterin.<\/li>\n<\/ol>\n<p><\/p>\n<p>Ngrem\u00eb klasterin 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 n\u00eb baz\u00eb t\u00eb profilit ekzistues.\nDuke filluar kontrollin e planeve minikube n\u00eb klasterin minikube.<\/code><\/pre>\n<p><\/p>\n<p>Tregojm\u00eb <code>kubectl<\/code> p\u00ebrdor klasterin lokal si parazgjedhje:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl config use-context minikube\nSwitched to context \"minikube\".<\/code><\/pre>\n<p><\/p>\n<p>Po shkarkojm\u00eb konfiguratat p\u00ebr ambientin 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>Pasi konfigurimet prodhuese jan\u00eb caktuar p\u00ebr t\u00eb kontrolluar namespace t\u00eb vjetra, dhe n\u00eb klasterin ton\u00eb t\u00eb sapo ngritur nuk ka ato, do t\u00eb z\u00ebvend\u00ebsojm\u00eb variablin e mjedisit <code>IS_DEBUG<\/code> n\u00eb <code>e v\u00ebrtet\u00eb<\/code>. Me k\u00ebt\u00eb vler\u00eb, parametri <code>afterDaysWithoutDeploy<\/code> nuk konsiderohet dhe namespace-t nuk kontrollohen p\u00ebr dit\u00ebt pa ndonj\u00eb depozitim, vet\u00ebm p\u00ebr p\u00ebrfshirjen e nj\u00eb n\u00ebnstringu (<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>Po 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>Po kontrollojm\u00eb q\u00eb resurset jan\u00eb shfaqur n\u00eb klaster <code>StaleFeatureBranch<\/code>:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl api-resources | grep stalefeaturebranches\nEMRI                 ... APIGROUP                             ... LLOJI\nstalefeaturebranches ... feature-branch.dmytrostriletskyi.com ... StaleFeatureBranch<\/code><\/pre>\n<p><\/p>\n<p>Po kontrollojm\u00eb q\u00eb operatori \u00ebsht\u00eb shfaqur n\u00eb klaster:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">$ kubectl get pods --namespace stale-feature-branch-operator\nEMRI                                           ... STATUS  ... MOSHA\nstale-feature-branch-operator-6bfbfd4df8-m7sch ... Duke funksionuar ... 38s<\/code><\/pre>\n<p><\/p>\n<p>N\u00ebse shikoni n\u00eb logjet e tij, ai \u00ebsht\u00eb gati t\u00eb p\u00ebrpunoj\u00eb resurset <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\":\"Operator Version: 0.0.1\"\n...\n... \"msg\":\"Starting EventSource\", ... , \"source\":\"kind source: \/, Kind=\"}\n... \"msg\":\"Starting Controller\", ...}\n... \"msg\":\"Starting workers\", ..., \"worker count\":1}<\/code><\/pre>\n<p><\/p>\n<p>Instalojm\u00eb gotiot <code>fixtures<\/code> (konfigurime t\u00eb gatshme p\u00ebr simulimin e burimeve t\u00eb klas\u00ebs) 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 me n\u00ebnstring <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\nlloji: StaleFeatureBranch\nmetadata:\n  emri: 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\":\"Stale feature branch is being processing.\",\"namespaceSubstring\":\"-pr-\",\"afterDaysWithoutDeploy\":1,\"checkEveryMinutes\":1,\"isDebug\":\"true\"}<\/code><\/pre>\n<p><\/p>\n<p>Instalojm\u00eb <code>fixtures<\/code>, q\u00eb p\u00ebrmbajn\u00eb dy namespace (<code>project-pr-1<\/code>, <code>project-pr-2<\/code>) dhe sh\u00ebrbimet e tyre <code>dispozita<\/code>, <code>, dhe k\u00ebshtu me radh\u00eb:<\/code>, <code>ingress<\/code>, dhe k\u00ebshtu me radh\u00eb:<\/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>Kontrollojm\u00eb q\u00eb t\u00eb gjitha burimet e lartp\u00ebrmendura 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>Duke b\u00ebr\u00eb k\u00ebt\u00eb, <code>debug<\/code>, namespace-t <code>project-pr-1<\/code> dhe <code>project-pr-2<\/code>, gjithashtu t\u00eb gjitha burimet e tjera, 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 should be deleted due to debug mode is enabled.\",\"namespaceName\":\"project-pr-1\"}\n... \"msg\":\"Namespace is being processing.\",\"namespaceName\":\"project-pr-1\",\"namespaceCreationTimestamp\":\"2020-06-16 18:43:58 +0300 EEST\"}\n... \"msg\":\"Namespace has been deleted.\",\"namespaceName\":\"project-pr-1\"}\n... \"msg\":\"Namespace should be deleted due to debug mode is enabled.\",\"namespaceName\":\"project-pr-2\"}\n... \"msg\":\"Namespace is being processing.\",\"namespaceName\":\"project-pr-2\",\"namespaceCreationTimestamp\":\"2020-06-16 18:43:58 +0300 EEST\"}\n... \"msg\":\"Namespace has been deleted.\",\"namespaceName\":\"project-pr-2\"}<\/code><\/pre>\n<p><\/p>\n<p>N\u00ebse kontrolloni disponueshm\u00ebrin\u00eb e burimeve, ato do t\u00eb jen\u00eb n\u00eb statusin <code>Duke u p\u00ebrfunduar<\/code> (procesi i fshirjes) ose tashm\u00eb jan\u00eb fshir\u00eb (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>fixtures<\/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 punon n\u00eb klaster? Ka disa qasje, t\u00eb gjitha nuk jan\u00eb t\u00eb p\u00ebrsosura (dhe disavantazhet e tyre jan\u00eb subjektive), dhe secili vendos se cila \u00ebsht\u00eb m\u00eb e p\u00ebrshtatshme p\u00ebr projektin specifik:<\/p>\n<p><\/p>\n<ol>\n<li>\n<p>T\u00eb fshini branch-in e karakteristikave gjat\u00eb nd\u00ebrtimit t\u00eb integrimit t\u00eb vazhduesh\u00ebm t\u00eb branch-it master.<\/p>\n<p><\/p>\n<ul>\n<li>P\u00ebr k\u00ebt\u00eb \u00ebsht\u00eb e nevojshme t\u00eb dihet se cili pull request i p\u00ebrket commit-it q\u00eb po nd\u00ebrtohet. Duke qen\u00eb se namespace i feature branch p\u00ebrmban identifikuesin e pull requestit \u2014 numrin e tij, ose emrin e deg\u00ebs, identifikuesi gjithmon\u00eb do t\u00eb duhet t\u00eb tregohet n\u00eb commit.<\/li>\n<li>Nd\u00ebrtimet e dega master d\u00ebshtojn\u00eb. P\u00ebr shembull, ju keni k\u00ebto faza: shkarkoni projektin, ekzekutoni testet, nd\u00ebrtoni projektin, b\u00ebni l\u00ebshimin, d\u00ebrgoni njoftime, pastroni feature branch e pull requestit t\u00eb fundit. N\u00ebse nd\u00ebrtimi d\u00ebshton gjat\u00eb d\u00ebrgimit t\u00eb njoftimit, do t'ju duhet t\u00eb largoni t\u00eb gjitha burimet n\u00eb klaster me duar.<\/li>\n<li>Pa kontekst t\u00eb duhur, fshirja e feature branch 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-ve (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.community\/t\/trigger-jenkins-job-when-a-pull-request-is-merged-to-a-branch\/1169\">shembull<\/a><\/noindex>).<\/p>\n<p><\/p>\n<ul>\n<li>Mund\u00ebsisht, kjo nuk \u00ebsht\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 p\u00ebrkrah mund\u00ebsin\u00eb p\u00ebr t\u00eb ruajtur konfigurimet e tij n\u00eb kodin burimor. Kur p\u00ebrdoren webhook, \u00ebsht\u00eb e nevojshme t\u00eb shkruhet nj\u00eb skenar p\u00ebr t'i p\u00ebrpunuar ato. Ky skenar 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>Kosto kohe p\u00ebr t\u00eb shkruar dhe mbajtur.<\/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\">Lidhja me projektin 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 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\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&#039;\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\" \/>\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) 4.9.10\" \/>\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! 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&#039;\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\" \/>\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\udd47Heqim feature branch t\u00eb vjetruar n\u00eb Kubernetes klasterin | ProHoster","description":"P\u00ebrsh\u00ebndetje! Feature branch (e njohur si deploy preview, review app) \u00ebsht\u00eb kur deploy-het jo vet\u00ebm master branch, por \u00e7do pull request n\u00eb nj\u00eb URL unik. Mund t\u00eb kontrolloni n\u00ebse kodi funksionon n\u00eb mjedisin production, dhe mund t'i tregoni fitur p\u00ebr programues t\u00eb tjer\u00eb apo produkteve. Nd\u00ebrsa punoni n\u00eb pull request, \u00e7do commit i ri heq versionin aktual t\u00eb deploy p\u00ebr kodin e vjet\u00ebr dhe krijon nj\u00eb t\u00eb ri.","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! 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'\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","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"},"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}]}}