{"id":65,"date":"2012-01-18T11:01:39","date_gmt":"2012-01-18T10:01:39","guid":{"rendered":"http:\/\/blog.2day.sk\/?p=65"},"modified":"2012-04-20T07:29:49","modified_gmt":"2012-04-20T06:29:49","slug":"jednoduchy-git-workflow","status":"publish","type":"post","link":"https:\/\/www.2day.sk\/blog\/jednoduchy-git-workflow\/","title":{"rendered":"Jednoduch\u00fd GIT workflow"},"content":{"rendered":"<p>Dnes by som v\u00e1m r\u00e1d predstavil jednoduch\u00fa produk\u010dn\u00fa sch\u00e9mu, ktor\u00fa pou\u017e\u00edvame v <a href=\"http:\/\/2day.sk\">2day<\/a>. T\u00e1to sch\u00e9ma pozost\u00e1va z jedn\u00e9ho produk\u010dn\u00e9ho servera, jedn\u00e9ho testovacieho servera a zop\u00e1r v\u00fdvoj\u00e1rskych stan\u00edc, v z\u00e1vislosti od po\u010dtu k\u00f3derov, ktor\u00ed pracuj\u00fa na projekte.<!--more--><\/p>\n<h4>Popis sch\u00e9my<\/h4>\n<p>Ako je mo\u017en\u00e9 vidie\u0165 na obr\u00e1zku ni\u017esie, ka\u017ed\u00fd v\u00fdvoj\u00e1r m\u00e1 svoju vlastn\u00fa pracovn\u00fa k\u00f3piu projektu (vr\u00e1tane datab\u00e1zy). Testovac\u00ed server funguje ako pred-produk\u010dn\u00e9 prostredie, v ktorom s\u00fa vykon\u00e1van\u00e9 v\u0161etky testy pred t\u00fdm, ako je k\u00f3d nasaden\u00fd do ostrej prev\u00e1dzky na produk\u010dnom serveri. D\u00f4le\u017eitou vlastnos\u0165ou takejto sch\u00e9my je to, \u017ee po \u00favodnej konfigur\u00e1cii sa u\u017e nerobia \u017eiadne zmeny priamo v k\u00f3de na testovacom, alebo produk\u010dnom serveri.<\/p>\n<h4>Nastavenie<\/h4>\n<p>Predpokladajme, \u017ee m\u00e1me GIT nain\u0161talovan\u00fd na v\u0161etk\u00fdch po\u010d\u00edta\u010doch, ktor\u00e9 maj\u00fa by\u0165 s\u00fa\u010das\u0165ou v\u00fdvojovej sch\u00e9my a z\u00e1rove\u0148 m\u00e1me nachystan\u00fd k\u00f3d na\u0161ej web str\u00e1nky na v\u00fdvoj\u00e1rovom po\u010d\u00edta\u010di. Ako prv\u00fd krok je potrebn\u00e9 urobi\u0165 z tohto k\u00f3du GIT repozit\u00e1r (<em>repository<\/em>). Na v\u00fdvoj\u00e1rovom po\u010d\u00edta\u010di spust\u00edme:<\/p>\n<pre>$cd website\r\n$git init\r\n$git add .\r\n$git commit -m \"Initial commit\"<\/pre>\n<p>Tieto pr\u00edkazy inicializuj\u00fa GIT repozit\u00e1r (git init), pripravia v\u0161etky s\u00fabory na z\u00e1pis do repozit\u00e1ru (git add .) a n\u00e1sledne ich do repozit\u00e1ru ulo\u017eia (git commit). (Toto je ve\u013emi zjednodu\u0161en\u00fd pr\u00edklad, detailami o pr\u00edprave s\u00faborov na z\u00e1pis a o nastaven\u00ed ignorovania s\u00faborov sa budeme zaobera\u0165 inokedy). Ke\u010f m\u00e1me n\u00e1\u0161 lok\u00e1lny repozit\u00e1r nastaven\u00fd, m\u00f4\u017eeme prejs\u0165 ku konfigur\u00e1cii vzdialen\u00e9ho repozit\u00e1ru na testovacom serveri. Pre nastavenie potrebujeme SSH pr\u00edstup na testovac\u00ed server, ide\u00e1lne aj s nastaven\u00fdmi ssh k\u013e\u00fa\u010dmi, aby sme namuseli zad\u00e1va\u0165 heslo pri ka\u017edom pripojen\u00ed. Na testovacom serveri teraz vytvor\u00edme GIT repozit\u00e1r, ktor\u00fd bude presn\u00fdm obrazok n\u00e1\u0161ho lok\u00e1lneho repozit\u00e1ru:<\/p>\n<pre>$ mkdir website.git &amp;&amp; cd website.git\r\n$ git init --bare<\/pre>\n<p>N\u00e1sledne mus\u00edme definova\u0165 post-receive hook, ktor\u00fd zabezpe\u010d\u00ed, \u017ee po ulo\u017een\u00ed k\u00f3du do vzdialen\u00e9ho repozit\u00e1ra bude tento k\u00f3d automaticky zap\u00edsan\u00fd aj do pracovn\u00e9ho adres\u00e1ra n\u00e1\u0161ho webservera na testovacom serveri (tento adres\u00e1r mus\u00ed existova\u0165, GIT ho nevytvor\u00ed za n\u00e1s!):<\/p>\n<pre>$ mkdir \/var\/www\/www.mywebsite.com\r\n$ vim hooks\/post-receive\r\n\r\nGIT_WORK_TREE=\/var\/www\/www.mywebsite.com git checkout -f\r\n\r\n$ chmod +x hooks\/post-receive<\/pre>\n<p>Teraz m\u00f4\u017eeme na\u0161e dva repozit\u00e1re spoji\u0165 (<em>git remote add<\/em>) a nahra\u0165 obsah lok\u00e1lneho repozit\u00e1ra na testovac\u00ed server (<em>git push<\/em>). Na v\u00fdvoj\u00e1rovom po\u010d\u00edta\u010di spust\u00edme:<\/p>\n<pre>$ git remote add test ssh:\/\/devtest.server.com\/home\/\r\nunluckyPete\/website.git\r\n$ git push test +master:refs\/heads\/master<\/pre>\n<p>Testovac\u00ed server teraz obsahuje \u00faplne presn\u00fd obraz n\u00e1\u0161ho lok\u00e1lneho repozit\u00e1ru.<\/p>\n<p>Pre nastavenie produk\u010dn\u00e9ho serveru postupujeme rovnako, akur\u00e1t v predch\u00e1dzaj\u00facich krokoch nahrad\u00edm Testovac\u00ed server za Produk\u010dn\u00fd server a V\u00fdvoj\u00e1rov po\u010d\u00edta\u010d za Testovac\u00ed server.<\/p>\n<h4>Pridanie nov\u00e9ho v\u00fdvoj\u00e1ra do sch\u00e9my<\/h4>\n<p>Predstavme si, \u017ee n\u00e1m na projekte pribudol nov\u00fd v\u00fdvoj\u00e1r, ktor\u00fd potrebuje svoju lok\u00e1lnu k\u00f3piu k\u00f3du, aby mohol za\u010da\u0165 pracova\u0165. Jedin\u00e9, \u010do mus\u00ed urobi\u0165 je stiahnu\u0165 repozit\u00e1r (<em>pull<\/em>) z testovacieho servera na jeho lok\u00e1lny po\u010d\u00edta\u010d, prida\u0165 si testovac\u00ed server ako vzdialen\u00fd repozit\u00e1r a m\u00f4\u017ee za\u010da\u0165!<\/p>\n<h4>Workflow<\/h4>\n<p>Nov\u00e1 funkcionalita na ktorej n\u00e1\u0161 v\u00fdvoj\u00e1r pracoval je hotov\u00e1 a pripraven\u00e1 na nahranie do testovacieho prostredia. Prv\u00e1 vec, ktor\u00fa mus\u00ed v\u00fdvoj\u00e1r urobi\u0165 je skontrolova\u0165 (<em>fetch<\/em>), \u010di od jeho poslednej aktualiz\u00e1cie nenastali na testovacom serveri nov\u00e9 zmeny. Ak nejak\u00e9 zmeny a spolu s nimi aj konflikty v k\u00f3de nastali a zmeny nie je mo\u017en\u00e9 spoji\u0165 automaticky, GIT v\u00fdvoj\u00e1ra vyzve, aby tieto konflikty vyrie\u0161il. Po vyrie\u0161en\u00ed konfliktov a zap\u00edsan\u00ed zmien do lok\u00e1lneho repozit\u00e1ra (<em>commit<\/em>) je k\u00f3d priprave\u0144y na zap\u00edsanie na testovac\u00ed server. Jedin\u00e9, \u010do program\u00e1tor mus\u00ed urobi\u0165 je nap\u00edsa\u0165\u00a0 <code>git push test<\/code> a k\u00f3d je automaticky nahran\u00fd do vzdialen\u00e9ho repozit\u00e1ra a zap\u00edsan\u00fd do pracovn\u00e9ho adres\u00e1ra web serveru (v\u010faka post-receive hook-u). Ostatn\u00ed v\u00fdvoj\u00e1ri z\u00edskaj\u00fa jeho zmeny pri ich najbli\u017esej aktualiz\u00e1cii ich lok\u00e1lneho repozit\u00e1ru (<em>fetch<\/em>).<\/p>\n<p>Ak boli v\u0161etky testy na testovacom serveri \u00faspe\u0161n\u00e9, m\u00f4\u017ee by\u0165 k\u00f3d zap\u00edsan\u00fd do produk\u010dn\u00e9ho prostredia. Na testovacom serveri sta\u010d\u00ed spusti\u0165:<\/p>\n<pre>git push <strong>prod<\/strong><\/pre>\n<p>Jednoduch\u0161ie to u\u017e nejde.<\/p>\n<h4>V\u00fdhody<\/h4>\n<ul>\n<li><strong>Jednoduchos\u0165.<\/strong> T\u00fdm, \u017ee po nastaven\u00ed sa u\u017e nevykon\u00e1vaj\u00fa \u017eiadne zmeny priamo v k\u00f3de na testovacom ani produk\u010dnom serveri je mo\u017en\u00e9 pred\u00eds\u0165 mnoh\u00fdm probl\u00e9mom. Z\u00e1rove\u0148 je prenos k\u00f3du medzi jednotliv\u00fdmi v\u00fdvojov\u00fdmi krokmi ve\u013emi jednoduch\u00fd a r\u00fdchly.<\/li>\n<li><strong>Konzistentnos\u0165.<\/strong> V\u010faka tomu, \u017ee m\u00e1 ka\u017ed\u00fd v\u00fdvoj\u00e1r svoju vlastn\u00fa pracovn\u00fa k\u00f3piu, nedoch\u00e1dza k ne\u017eiad\u00facemu prepisovaniu k\u00f3du. Z\u00e1rove\u0148 je pri k\u00f3d pri prenose v\u017edy najsk\u00f4r skomprimovan\u00fd, n\u00e1sledne prenesen\u00fd a potom naraz zap\u00edsan\u00fd v novom prostred\u00ed. S\u00fa tak minimalizovan\u00e9 chyby vznikaj\u00face pri z\u00e1pise s\u00faborov na server, ktor\u00fdch d\u00f4sledkom s\u00fa biele str\u00e1nky zobrazen\u00e9 pou\u017e\u00edvate\u013eom.<\/li>\n<li><strong>Redundancia.<\/strong> Ka\u017ed\u00fd repozit\u00e1r obsahuje kompletn\u00fa hist\u00f3riu verzi\u00ed a zmien cel\u00e9ho projektu, tak\u017ee v pr\u00edpade po\u0161kodenia alebo zlyhania niektor\u00e9ho repozit\u00e1ra je mo\u017en\u00e9 ho obnovi\u0165 z hociktor\u00e9ho in\u00e9ho. D\u00e1ta s\u00fa tak viacn\u00e1sobne z\u00e1lohovan\u00e9.<\/li>\n<\/ul>\n<p>Pokia\u013e sa v\u00e1m na spravovanie GIT repozit\u00e1ra nep\u00e1\u010di konzola, m\u00f4\u017eem vrelo odporu\u010di\u0165\u00a0 <a href=\"http:\/\/www.git-tower.com\/\" target=\"_blank\">Tower GIT client pre Mac<\/a>.<\/p>\n<p>Picard out.<\/p>\n<p>p.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dnes by som v\u00e1m r\u00e1d predstavil jednoduch\u00fa produk\u010dn\u00fa sch\u00e9mu, ktor\u00fa pou\u017e\u00edvame v 2day. T\u00e1to sch\u00e9ma pozost\u00e1va z jedn\u00e9ho produk\u010dn\u00e9ho servera, jedn\u00e9ho testovacieho servera a zop\u00e1r v\u00fdvoj\u00e1rskych stan\u00edc, v z\u00e1vislosti od po\u010dtu k\u00f3derov, ktor\u00ed pracuj\u00fa na projekte.<\/p>\n","protected":false},"author":3,"featured_media":76,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-65","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programming"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.2day.sk\/blog\/wp-json\/wp\/v2\/posts\/65","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.2day.sk\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.2day.sk\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.2day.sk\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.2day.sk\/blog\/wp-json\/wp\/v2\/comments?post=65"}],"version-history":[{"count":0,"href":"https:\/\/www.2day.sk\/blog\/wp-json\/wp\/v2\/posts\/65\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.2day.sk\/blog\/wp-json\/wp\/v2\/media\/76"}],"wp:attachment":[{"href":"https:\/\/www.2day.sk\/blog\/wp-json\/wp\/v2\/media?parent=65"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.2day.sk\/blog\/wp-json\/wp\/v2\/categories?post=65"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.2day.sk\/blog\/wp-json\/wp\/v2\/tags?post=65"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}