{"id":559,"date":"2019-03-18T12:55:06","date_gmt":"2019-03-18T12:55:06","guid":{"rendered":"http:\/\/www.iprogrammable.com\/?p=559"},"modified":"2019-04-19T05:53:47","modified_gmt":"2019-04-19T05:53:47","slug":"mcet-sec-repo","status":"publish","type":"post","link":"https:\/\/www.iprogrammable.com\/pl\/2019\/03\/18\/mcet-sec-repo\/","title":{"rendered":"MCET-SEC 2: Repo"},"content":{"rendered":"<p><\/p>\n<p style=\"text-align: justify;\">To jest druga cz\u0119\u015b\u0107 serii <a href=\"http:\/\/www.iprogrammable.com\/2019\/03\/03\/mcet-sec\/\">MCET-SEC<\/a>, gdzie tworz\u0119 nowoczesny i wydajny toolchain dla ma\u0142ych ale bystrych firm z bran\u017cy in\u017cynierii oprogramowania. Zarz\u0105dzam ma\u0142ym przedsi\u0119biorstwem posiadaj\u0105cym zesp\u00f3\u0142 sk\u0142adaj\u0105cy si\u0119 z ponad dziesi\u0119ciu programist\u00f3w. Specjalizujemy si\u0119 w platformie .NET(desktopy,web i serwisy) ale tworzymy tak\u017ce w nowoczesnych technologiach webowych(Angular\/TS) i mobilnych(Xaramin, natywny Android i IOS). Troch\u0119 czasu min\u0119\u0142o, od kiedy napisa\u0142em ,,<a href=\"https:\/\/www.amazon.com\/Continuous-Integration-NET-Marcin-Kawalerowicz\/dp\/1935182552\">Continuous Integration in .NET<\/a>&#8221; i zbudowa\u0142em toolchain dla swojej firmy. Teraz pora na jego renowacje. Zacznijmy od utworzenia nowego repozytorium. Repozytorium jest powszechn\u0105 w\u015br\u00f3d programist\u00f3w nazw\u0105, kt\u00f3r\u0105 okre\u015blaj\u0105 najwa\u017cniejsze narz\u0119dzie w ich zestawie: bibliotek\u0119 kodu \u017ar\u00f3d\u0142owego. Miejsce, w kt\u00f3rym przechowujemy owoce naszej ci\u0119\u017ckiej pracy &#8211; tekst, kt\u00f3ry zamienia si\u0119 w oprogramowanie.<\/p>\n<p style=\"text-align: justify;\">Fascynuj\u0105ce jest spojrzenie na to jak rozwin\u0119\u0142y si\u0119 narz\u0119dzia do zarz\u0105dzania kodem \u017ar\u00f3d\u0142owym na przestrzeni ostatnich lat. Pami\u0119tam jak na pocz\u0105tku mojej kariery korzystali\u015bmy z SourceSafe. Nast\u0119pnie pojawi\u0142 si\u0119 Subversion w formie <a href=\"https:\/\/www.visualsvn.com\/\">VisualSVN<\/a>. To by\u0142o \u015bwietne narz\u0119dzie. Proste i niezawodne. Jeden centralny server, do tego lokalne repozytorium na maszynie developera. Niebawem po tym pojawi\u0142 si\u0119 git, kt\u00f3ry wzni\u00f3s\u0142 sztuk\u0119 zarz\u0105dzania kodem na zupe\u0142nie nowy poziom. Innowacyjno\u015b\u0107 polega\u0142a na dzieleniu si\u0119 swoimi repozytoriami. Ka\u017cdy programista trzyma\u0142 historie projektu na swoim komputerze. Dodawa\u0142 ga\u0142\u0119zie i nowe porcje kodu lokalnie. Bardzo szybko okaza\u0142o si\u0119, \u017ce brakuje czego\u015b wi\u0119cej. Praca dru\u017cynowa i potrzeba ci\u0105g\u0142ego monitorowania jako\u015bci kodu by\u0142y naturalnym bod\u017acem do za\u0142o\u017cenia jednego centralnego servera z owocami naszej pracy. Odkryli\u015bmy <a href=\"https:\/\/www.scm-manager.org\/\">SCM-Manager<\/a>: male\u0144ki server, kt\u00f3ry pozwala\u0142 zar\u00f3wno repozytorium Gita jak i SVN\u2019a \u017cy\u0107 r\u00f3wnolegle ze sob\u0105. Przyzwyczaili\u015bmy si\u0119 do wykorzystywania naszego kodu ponownie i do zachowywania go na lata &#8211; wtedy przyszed\u0142 GitHub. Narz\u0119dzie, kt\u00f3re po raz kolejny zmieni\u0142o spos\u00f3b my\u015blenia o zarz\u0105dzaniu projektem. Poza prost\u0105 funkcj\u0105 do przechowywania kodu po raz pierwszy pozwala\u0142 programistom na bie\u017c\u0105ce dyskutowanie o fragmentach, kt\u00f3re dopiero co dodali. Idea pull-requesta jako code review sta\u0142a si\u0119 kluczowa. Zdecydowali\u015bmy si\u0119 u\u017cywa\u0107 centralnie bitbucketa, poprzez wzgl\u0105d na jednego z naszych partner\u00f3w i ogromny projekt, kt\u00f3ry dla niego wykonywali\u015bmy. Chcieliby\u015bmy jednak mie\u0107 co\u015b w\u0142asnego na potrzeby innych przedsi\u0119wzi\u0119\u0107. Rozpocz\u0105\u0142em wi\u0119c moje poszukiwania.<\/p>\n<p>&nbsp;<\/p>\n<p>Rozwa\u017ca\u0142em poni\u017csze typy system\u00f3w kontroli wersji:<\/p>\n<ol>\n<li>Komercyjny w chmurze<\/li>\n<li>Lokalny(on-premise) komercyjny<\/li>\n<li>Lokalny(on-premise) darmowy<\/li>\n<\/ol>\n<p style=\"text-align: justify;\">Systemy bazuj\u0105ce na chmurze takie jak Github albo Bitbucket pozwalaj\u0105 na utworzenie prywatnych repozytori\u00f3w do przechowywania projekt\u00f3w. Oba s\u0105 bardzo bogate je\u015bli chodzi o ich funkcje i wyj\u0105tkowo proste do utrzymania (tak naprawd\u0119 nie ma potrzeby, aby cokolwiek utrzymywa\u0107, poniewa\u017c dystrybutorzy o wszystko dbaj\u0105). Powy\u017csze rozwi\u0105zania maj\u0105 jednak swoje wady, kt\u00f3re mog\u0105 by\u0107 mniej lub bardziej problematyczne. W zasadzie nie masz kontroli nad tym gdzie tw\u00f3j kod jest fizycznie przechowywany (nie dla ka\u017cdej firmy b\u0105d\u017a klienta jest to istotne). Kolejnym problemem jest ograniczenie ilo\u015bci wgrywanego kodu. Zwykle p\u0142aci si\u0119 'od programisty&#8217;. To koszt od kilku do kilkunastu dolar\u00f3w miesi\u0119cznie za osob\u0119, wi\u0119c kiedy Twoja firma si\u0119 rozrasta, koszty przechowywania projekt\u00f3w bardzo szybko si\u0119 skaluj\u0105.<\/p>\n<p style=\"text-align: justify;\">Mo\u017cna pr\u00f3bowa\u0107 z tym walczy\u0107 poprzez, na przyk\u0142ad, lokaln\u0105 instalacj\u0119 jednego z wybranych serwis\u00f3w. BitBucket na to pozwala, oferta GitLab&#8217;a tak\u017ce wydaje si\u0119 by\u0107 interesuj\u0105ca. Wybieraj\u0105c t\u0105 drog\u0119 mo\u017cna mie\u0107 prawie wszystko pod kontrol\u0105. Wszystko opr\u00f3cz koszt\u00f3w. Nie jest to tanie rozwi\u0105zanie, a licencja nadal naliczana jest od ilo\u015bci u\u017cytkownik\u00f3w, wi\u0119c zrezygnowali\u015bmy z tej opcji.<\/p>\n<p style=\"text-align: justify;\">Zale\u017cy mi, \u017ceby naprawd\u0119 wszystko by\u0142o pod moj\u0105 kontrol\u0105. Jedyne co mi pozosta\u0142o to rozejrze\u0107 si\u0119 wok\u00f3\u0142 darmowych, open sourcowych (b\u0105d\u017a te\u017c nie) narz\u0119dzi.<\/p>\n<p style=\"text-align: justify;\">Jak zwykle chwila poszukiwa\u0144 przynosios\u0142a mi d\u0142ug\u0105 list\u0119 najistotniejszych dla mojej firmy cech systemu zarz\u0105dzania kodem \u017ar\u00f3d\u0142owym :<\/p>\n<ul>\n<li>Czy ma sieciowy interfejs?<\/li>\n<li>Czy ma zintegrowan\u0105 funkcj\u0119 pull request\/code review?<\/li>\n<li>Czy posiada wbudowan\u0105 CI(ci\u0105g\u0142\u0105 integracj\u0119)?<\/li>\n<li>Chcieliby\u015bmy \u017ceby mia\u0142 AD (LDAP)<\/li>\n<li>Czy posiada zale\u017cn\u0105 od repozytorium kontrol\u0119 dost\u0119pu?<\/li>\n<li>Czy posiada kontrol\u0119 dost\u0119pu zale\u017cn\u0105 od ga\u0142\u0119zi projektu?<\/li>\n<li>Czy posiada funkcj\u0119 nas\u0142uchiwania ga\u0142\u0119zi?<\/li>\n<li>Czy posiada osobist\u0105 tablic\u0119?(Z wszystkimi informacjami dotycz\u0105cymi danego developera)<\/li>\n<li>Czy jest \u0142atwa w instalacji i utrzymaniu?<\/li>\n<li>Czy implementuje strategi\u0119 'sound backup&#8217;?<\/li>\n<li>Czy posiada zintegrowan\u0105 tablic\u0119 projektu?<\/li>\n<li>Czy posiada jakie\u015b wewn\u0119trzne narz\u0119dzi do 'road mapping&#8217;?<\/li>\n<li>Czy mo\u017cemy wewn\u0105trz robi\u0107 dokumentacje wydania?<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\">Z powy\u017csz\u0105 list\u0105 wymaga\u0144 rozpocz\u0105\u0142em poszukiwania narz\u0119dzi, kt\u00f3re spe\u0142nia\u0142yby te kryteria. Nie mog\u0119 powiedzie\u0107, \u017ce znalaz\u0142em ich wiele. Ostatecznie moj\u0105 selekcj\u0119 przetrwa\u0142y tylko dwie pozycje RhodeCode i Gogs.<\/p>\n<table border=\"1\" width=\"100%\" cellspacing=\"0\" cellpadding=\"2\">\n<tbody>\n<tr>\n<td valign=\"top\" width=\"33%\">CECHA<\/td>\n<td valign=\"top\" width=\"33%\">RhodeCode<\/td>\n<td valign=\"top\" width=\"33%\">Gogs<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"33%\">Sieciowa<\/td>\n<td valign=\"top\" width=\"33%\">Tak<\/td>\n<td valign=\"top\" width=\"33%\">Tak<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"33%\">Pull request<\/td>\n<td valign=\"top\" width=\"33%\">Tak<\/td>\n<td valign=\"top\" width=\"33%\">Tak<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"33%\">Wbudowane CI<\/td>\n<td valign=\"top\" width=\"33%\">Tak<\/td>\n<td valign=\"top\" width=\"33%\">Tak<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"33%\">AD\/LDAP<\/td>\n<td valign=\"top\" width=\"33%\">Tak<\/td>\n<td valign=\"top\" width=\"33%\">Tak<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"33%\">Repo kontrola dost\u0119pu<\/td>\n<td valign=\"top\" width=\"33%\">Tak<\/td>\n<td valign=\"top\" width=\"33%\">Tak<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"33%\">Ga\u0142\u0105\u017a kontrola dost\u0119pu<\/td>\n<td valign=\"top\" width=\"33%\">Tak (w wersji enterprise)<\/td>\n<td valign=\"top\" width=\"33%\">Nie<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"33%\">Nas\u0142uchiwanie ga\u0142\u0119zi<\/td>\n<td valign=\"top\" width=\"33%\">Tak<\/td>\n<td valign=\"top\" width=\"33%\">Tak<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"33%\">Tablica u\u017cytkownika<\/td>\n<td valign=\"top\" width=\"33%\">Tak<\/td>\n<td valign=\"top\" width=\"33%\">Tak<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"33%\">\u0141atwa instalacja\/utrzymanie<\/td>\n<td valign=\"top\" width=\"33%\">Je\u015bli jeste\u015b maniakiem linuxa<\/td>\n<td valign=\"top\" width=\"33%\">Tak<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"33%\">Sound Backup<\/td>\n<td valign=\"top\" width=\"33%\">Je\u015bli jeste\u015b maniakiem linuxa<\/td>\n<td valign=\"top\" width=\"33%\">Tak<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"33%\">Dodaj: tablica projektu<\/td>\n<td valign=\"top\" width=\"33%\">Nie<\/td>\n<td valign=\"top\" width=\"33%\">Nie(mo\u017ce wbudowana w wiki)<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"33%\">Dodaj: road mapping<\/td>\n<td valign=\"top\" width=\"33%\">Nie<\/td>\n<td valign=\"top\" width=\"33%\">Nie(mo\u017ce wbudowana w wiki)<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"33%\">Dodaj: dokumentacja wydania<\/td>\n<td valign=\"top\" width=\"33%\">Nie<\/td>\n<td valign=\"top\" width=\"33%\">Nie(mo\u017ce wbudowana w wiki)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-size: xx-small;\">\u00a0<\/span><\/p>\n<p style=\"text-align: justify;\">RhodeCode posiada wiele dodatkowych funkcjonalno\u015bci takich jak czat, geolokalizacja czy wyszukiwanie pe\u0142notekstowe. Wspar\u0142by nas te\u017c w utrzymaniu repozytori\u00f3w bazuj\u0105cych na SVN I Mercurialu(nie \u017ceby nam jako\u015b specjalnie na tym zale\u017ca\u0142o ale lepiej mie\u0107 ni\u017c nie mie\u0107). Dodatkowo nazwa g\u0142\u00f3wnego programisty wygl\u0105da\u0142a ca\u0142kiem \u0142adnie(wpisa\u0142em Marcin). Jako, \u017ce w mojej firmie postawili\u015bmy na Windowsa to naturalnym wyborem dla nas by\u0142by Windows Server jako host dla systemu kontroli wersji. To jest najwi\u0119kszy problem. RhodeCode jest oprogramowaniem Linuxowym. Praktycznie nie da sie zainstalowa\u0107 go na Windowsie. Mo\u017cna postawi\u0107 ca\u0142kowicie wirtualn\u0105 maszyn\u0119 I na niej ustawi\u0107 Hyper-V, co z reszt\u0105 zrobili\u015bmy i nawet dzia\u0142a\u0142o. Integracja z AD musia\u0142a zosta\u0107 zrobiona w surowym pliku tekstowym(no raczej!). RhodeCode posiada dualistyczn\u0105 licencj\u0119. Z jednej strony jest p\u0142atny enterprise, a z drugiej ubo\u017cszy community. W trakcie moich rozwa\u017ca\u0144 wygas\u0142a mi p\u0142atna licencja i musia\u0142em ustawia\u0107 RhodeCode&#8217;a w wersji darmowej. Jest ca\u0142e szkolenie jak to zrobi\u0107. Zaloguj si\u0119 na maszyn\u0119 linuxow\u0105, wpisz par\u0119 komend tu I tam, zresetuj kilka razy.. Jak mo\u017cna si\u0119 domy\u015ble\u0107 wcale nie chcia\u0142o dzia\u0142a\u0107. Oczywi\u015bcie, prawdopodobnie by zadzia\u0142a\u0142o gdybym po\u015bwi\u0119ci\u0142 na to wi\u0119cej czasu ale mia\u0142em ju\u017c dosy\u0107. Zdecydowa\u0142em si\u0119 wypr\u00f3bowa\u0107 gogsa.<\/p>\n<p>&nbsp;<\/p>\n<p>Instalacja przebieg\u0142a bardzo \u0142atwo. Wystarczy upewni\u0107 si\u0119, \u017ce Git jest w odpowiedniej \u015bcie\u017cce systemowej, pobra\u0107 ZIP\u2019a i <a href=\"https:\/\/gogs.io\/docs\/installation\/install_from_binary\">trzyma\u0107 si\u0119 dokumentacji<\/a>. Pobra\u0142em, wypakowa\u0142em, a nast\u0119pnie w wierszu polece\u0144 u\u017cy\u0142em komendy \u2018gogs web\u2019. <a href=\"https:\/\/gogs.io\/docs\/features\/authentication\">Konfiguracja LDAP<\/a> \u00a0by\u0142a troch\u0119 bardziej zagmatwana(jak zwykle) ale uda\u0142o si\u0119 j\u0105 zrobi\u0107 ca\u0142kowicie z internetowego panelu administratora:<\/p>\n<p><a href=\"http:\/\/www.iprogrammable.com\/wp-content\/uploads\/2019\/03\/2019-03-18_13-12-34.jpg\"><img decoding=\"async\" loading=\"lazy\" style=\"display: inline; background-image: none;\" title=\"2019-03-18_13-12-34\" src=\"http:\/\/www.iprogrammable.com\/wp-content\/uploads\/2019\/03\/2019-03-18_13-12-34_thumb.jpg\" alt=\"2019-03-18_13-12-34\" width=\"644\" height=\"344\" border=\"0\" \/><\/a><\/p>\n<p><span style=\"font-size: xx-small;\">\u00a0<\/span><\/p>\n<p style=\"text-align: justify;\">Nie zapomnij, \u017ce b\u0119dziesz musia\u0142 stworzy\u0107 u\u017cytkownika w Gogs admin panelu, aby otrzyma\u0107 dost\u0119p do Gogsa, kt\u00f3ry u\u017cywa twojego u\u017cytkownika AD. Konfiguracja SSL to kwestia edycji pliku gogs\u2019a app.ini, zmiany prokoko\u0142u, ustawieniu certyfikatu oraz kluczowych \u015bcie\u017cek do plik\u00f3w, tak jak jest to opisane w <a href=\"https:\/\/gogs.io\/docs\/intro\/faqs\">Gogs FAQ<\/a>. Ostatni\u0105 konfiguracj\u0105, kt\u00f3r\u0105 wykona\u0142em by\u0142o wy\u0142\u0105czenie odkrywania funkcjonalno\u015bci dla anonimowych u\u017cytkownik\u00f3w(chc\u0119, aby moje repozytoria by\u0142y dost\u0119pne na zewn\u0105trz mojej organizacji ale nie nas\u0142uchuj\u0105ce na moich programist\u00f3w). Mo\u017cna \u0142atwo to ustawi\u0107 w app.ini u\u017cywaj\u0105c:<\/p>\n<pre><span style=\"font-size: xx-small;\"><span style=\"font-size: xx-small;\"><span style=\"font-size: xx-small;\">[service]\r\nREQUIRE_SIGNIN_VIEW = true<\/span><\/span><\/span><\/pre>\n<p><span style=\"font-size: xx-small;\">\u00a0<\/span><\/p>\n<p>Voila! Wszystko gotowe. B\u0119d\u0119 informowa\u0142 o tym jak rozwi\u0105zanie przyjmuje si\u0119 po\u015br\u00f3d moich programist\u00f3w.<\/p>\n<p><span style=\"font-size: xx-small;\">\u00a0<\/span><\/p>\n<p><span style=\"font-size: xx-small;\">\u00a0<\/span><\/p>\n<p><span style=\"font-size: xx-small;\">\u00a0<\/span><\/p>","protected":false},"excerpt":{"rendered":"<p>To jest druga cz\u0119\u015b\u0107 serii MCET-SEC, gdzie tworz\u0119 nowoczesny i wydajny toolchain dla ma\u0142ych ale bystrych firm z bran\u017cy in\u017cynierii oprogramowania. Zarz\u0105dzam ma\u0142ym przedsi\u0119biorstwem posiadaj\u0105cym zesp\u00f3\u0142 sk\u0142adaj\u0105cy si\u0119 z ponad dziesi\u0119ciu programist\u00f3w. Specjalizujemy si\u0119 w platformie .NET(desktopy,web i serwisy) ale tworzymy tak\u017ce w nowoczesnych technologiach webowych(Angular\/TS) i mobilnych(Xaramin, natywny Android i IOS). Troch\u0119 czasu min\u0119\u0142o, od kiedy napisa\u0142em ,,Continuous Integration in .NET&#8221; i zbudowa\u0142em toolchain dla swojej firmy. Teraz pora na jego renowacje. Zacznijmy od utworzenia nowego repozytorium. Repozytorium jest powszechn\u0105 w\u015br\u00f3d programist\u00f3w nazw\u0105, kt\u00f3r\u0105 okre\u015blaj\u0105 najwa\u017cniejsze narz\u0119dzie w ich zestawie: bibliotek\u0119 kodu \u017ar\u00f3d\u0142owego. Miejsce, w kt\u00f3rym przechowujemy owoce naszej ci\u0119\u017ckiej pracy &#8211; tekst, kt\u00f3ry zamienia si\u0119 w oprogramowanie. Fascynuj\u0105ce jest spojrzenie na to jak rozwin\u0119\u0142y si\u0119 narz\u0119dzia do zarz\u0105dzania kodem \u017ar\u00f3d\u0142owym na przestrzeni ostatnich lat. Pami\u0119tam jak na pocz\u0105tku mojej kariery korzystali\u015bmy z SourceSafe. Nast\u0119pnie pojawi\u0142 si\u0119 Subversion w formie VisualSVN. To by\u0142o \u015bwietne narz\u0119dzie. Proste i niezawodne. Jeden centralny server, do tego lokalne repozytorium na maszynie developera. Niebawem po tym pojawi\u0142 si\u0119 git, kt\u00f3ry wzni\u00f3s\u0142 sztuk\u0119 zarz\u0105dzania kodem na zupe\u0142nie nowy poziom. Innowacyjno\u015b\u0107 polega\u0142a na dzieleniu si\u0119 swoimi repozytoriami. Ka\u017cdy programista trzyma\u0142 historie projektu na swoim komputerze. Dodawa\u0142 ga\u0142\u0119zie i nowe porcje kodu lokalnie. Bardzo szybko okaza\u0142o si\u0119, \u017ce brakuje czego\u015b wi\u0119cej. Praca dru\u017cynowa i potrzeba ci\u0105g\u0142ego monitorowania jako\u015bci kodu by\u0142y naturalnym bod\u017acem do za\u0142o\u017cenia jednego centralnego servera z owocami naszej pracy. Odkryli\u015bmy SCM-Manager: male\u0144ki server, kt\u00f3ry pozwala\u0142 zar\u00f3wno repozytorium Gita jak i SVN\u2019a \u017cy\u0107 r\u00f3wnolegle ze sob\u0105. Przyzwyczaili\u015bmy si\u0119 do wykorzystywania naszego kodu ponownie i do zachowywania go na lata &#8211; wtedy przyszed\u0142 GitHub. Narz\u0119dzie, kt\u00f3re po raz kolejny zmieni\u0142o spos\u00f3b my\u015blenia o zarz\u0105dzaniu projektem. Poza prost\u0105 funkcj\u0105 do przechowywania kodu po raz pierwszy pozwala\u0142 programistom na bie\u017c\u0105ce dyskutowanie o fragmentach, kt\u00f3re dopiero co dodali. Idea pull-requesta jako code review sta\u0142a si\u0119 kluczowa. Zdecydowali\u015bmy si\u0119 u\u017cywa\u0107 centralnie bitbucketa, poprzez wzgl\u0105d na jednego z naszych partner\u00f3w i ogromny projekt, kt\u00f3ry dla niego wykonywali\u015bmy. Chcieliby\u015bmy jednak mie\u0107 co\u015b w\u0142asnego na potrzeby innych przedsi\u0119wzi\u0119\u0107. Rozpocz\u0105\u0142em wi\u0119c moje poszukiwania. &nbsp; Rozwa\u017ca\u0142em poni\u017csze typy system\u00f3w kontroli wersji: Komercyjny w chmurze Lokalny(on-premise) komercyjny Lokalny(on-premise) darmowy Systemy bazuj\u0105ce na chmurze takie jak Github albo Bitbucket pozwalaj\u0105 na utworzenie prywatnych repozytori\u00f3w do przechowywania projekt\u00f3w. Oba s\u0105 bardzo bogate je\u015bli chodzi o ich funkcje i wyj\u0105tkowo proste do utrzymania (tak naprawd\u0119 nie ma potrzeby, aby cokolwiek utrzymywa\u0107, poniewa\u017c dystrybutorzy o wszystko dbaj\u0105). Powy\u017csze rozwi\u0105zania maj\u0105 jednak swoje wady, kt\u00f3re mog\u0105 by\u0107 mniej lub bardziej problematyczne. W zasadzie nie masz kontroli nad tym gdzie tw\u00f3j kod jest fizycznie przechowywany (nie dla ka\u017cdej firmy b\u0105d\u017a klienta jest to istotne). Kolejnym problemem jest ograniczenie ilo\u015bci wgrywanego kodu. Zwykle p\u0142aci si\u0119 'od programisty&#8217;. To koszt od kilku do kilkunastu dolar\u00f3w miesi\u0119cznie za osob\u0119, wi\u0119c kiedy Twoja firma si\u0119 rozrasta, koszty przechowywania projekt\u00f3w bardzo szybko si\u0119 skaluj\u0105. Mo\u017cna pr\u00f3bowa\u0107 z tym walczy\u0107 poprzez, na przyk\u0142ad, lokaln\u0105 instalacj\u0119 jednego z wybranych serwis\u00f3w. BitBucket na to pozwala, oferta GitLab&#8217;a tak\u017ce wydaje si\u0119 by\u0107 interesuj\u0105ca. Wybieraj\u0105c t\u0105 drog\u0119 mo\u017cna mie\u0107 prawie wszystko pod kontrol\u0105. Wszystko opr\u00f3cz koszt\u00f3w. Nie jest to tanie rozwi\u0105zanie, a licencja nadal naliczana jest od ilo\u015bci u\u017cytkownik\u00f3w, wi\u0119c zrezygnowali\u015bmy z tej opcji. Zale\u017cy mi, \u017ceby naprawd\u0119 wszystko by\u0142o pod moj\u0105 kontrol\u0105. Jedyne co mi pozosta\u0142o to rozejrze\u0107 si\u0119 wok\u00f3\u0142 darmowych, open sourcowych (b\u0105d\u017a te\u017c nie) narz\u0119dzi. Jak zwykle chwila poszukiwa\u0144 przynosios\u0142a mi d\u0142ug\u0105 list\u0119 najistotniejszych dla mojej firmy cech systemu zarz\u0105dzania kodem \u017ar\u00f3d\u0142owym : Czy ma sieciowy interfejs? Czy ma zintegrowan\u0105 funkcj\u0119 pull request\/code review? Czy posiada wbudowan\u0105 CI(ci\u0105g\u0142\u0105 integracj\u0119)? Chcieliby\u015bmy \u017ceby mia\u0142 AD (LDAP) Czy posiada zale\u017cn\u0105 od repozytorium kontrol\u0119 dost\u0119pu? Czy posiada kontrol\u0119 dost\u0119pu zale\u017cn\u0105 od ga\u0142\u0119zi projektu? Czy posiada funkcj\u0119 nas\u0142uchiwania ga\u0142\u0119zi? Czy posiada osobist\u0105 tablic\u0119?(Z wszystkimi informacjami dotycz\u0105cymi danego developera) Czy jest \u0142atwa w instalacji i utrzymaniu? Czy implementuje strategi\u0119 'sound backup&#8217;? Czy posiada zintegrowan\u0105 tablic\u0119 projektu? Czy posiada jakie\u015b wewn\u0119trzne narz\u0119dzi do 'road mapping&#8217;? Czy mo\u017cemy wewn\u0105trz robi\u0107 dokumentacje wydania? &nbsp; Z powy\u017csz\u0105 list\u0105 wymaga\u0144 rozpocz\u0105\u0142em poszukiwania narz\u0119dzi, kt\u00f3re spe\u0142nia\u0142yby te kryteria. Nie mog\u0119 powiedzie\u0107, \u017ce znalaz\u0142em ich wiele. Ostatecznie moj\u0105 selekcj\u0119 przetrwa\u0142y tylko dwie pozycje RhodeCode i Gogs. CECHA RhodeCode Gogs Sieciowa Tak Tak Pull request Tak Tak Wbudowane CI Tak Tak AD\/LDAP Tak Tak Repo kontrola dost\u0119pu Tak Tak Ga\u0142\u0105\u017a kontrola dost\u0119pu Tak (w wersji enterprise) Nie Nas\u0142uchiwanie ga\u0142\u0119zi Tak Tak Tablica u\u017cytkownika Tak Tak \u0141atwa instalacja\/utrzymanie Je\u015bli jeste\u015b maniakiem linuxa Tak Sound Backup Je\u015bli jeste\u015b maniakiem linuxa Tak Dodaj: tablica projektu Nie Nie(mo\u017ce wbudowana w wiki) Dodaj: road mapping Nie Nie(mo\u017ce wbudowana w wiki) Dodaj: dokumentacja wydania Nie Nie(mo\u017ce wbudowana w wiki) \u00a0 RhodeCode posiada wiele dodatkowych funkcjonalno\u015bci takich jak czat, geolokalizacja czy wyszukiwanie pe\u0142notekstowe. Wspar\u0142by nas te\u017c w utrzymaniu repozytori\u00f3w bazuj\u0105cych na SVN I Mercurialu(nie \u017ceby nam jako\u015b specjalnie na tym zale\u017ca\u0142o ale lepiej mie\u0107 ni\u017c nie mie\u0107). Dodatkowo nazwa g\u0142\u00f3wnego programisty wygl\u0105da\u0142a ca\u0142kiem \u0142adnie(wpisa\u0142em Marcin). Jako, \u017ce w mojej firmie postawili\u015bmy na Windowsa to naturalnym wyborem dla nas by\u0142by Windows Server jako host dla systemu kontroli wersji. To jest najwi\u0119kszy problem. RhodeCode jest oprogramowaniem Linuxowym. Praktycznie nie da sie zainstalowa\u0107 go na Windowsie. Mo\u017cna postawi\u0107 ca\u0142kowicie wirtualn\u0105 maszyn\u0119 I na niej ustawi\u0107 Hyper-V, co z reszt\u0105 zrobili\u015bmy i nawet dzia\u0142a\u0142o. Integracja z AD musia\u0142a zosta\u0107 zrobiona w surowym pliku tekstowym(no raczej!). RhodeCode posiada dualistyczn\u0105 licencj\u0119. Z jednej strony jest p\u0142atny enterprise, a z drugiej ubo\u017cszy community. W trakcie moich rozwa\u017ca\u0144 wygas\u0142a mi p\u0142atna licencja i musia\u0142em ustawia\u0107 RhodeCode&#8217;a w wersji darmowej. Jest ca\u0142e szkolenie jak to zrobi\u0107. Zaloguj si\u0119 na maszyn\u0119 linuxow\u0105, wpisz par\u0119 komend tu I tam, zresetuj kilka razy.. Jak mo\u017cna si\u0119 domy\u015ble\u0107 wcale nie chcia\u0142o dzia\u0142a\u0107. Oczywi\u015bcie, prawdopodobnie by zadzia\u0142a\u0142o gdybym po\u015bwi\u0119ci\u0142 na to wi\u0119cej czasu ale mia\u0142em ju\u017c dosy\u0107. Zdecydowa\u0142em si\u0119 wypr\u00f3bowa\u0107 gogsa. &nbsp; Instalacja przebieg\u0142a bardzo \u0142atwo. Wystarczy upewni\u0107 si\u0119, \u017ce Git jest w odpowiedniej \u015bcie\u017cce systemowej, pobra\u0107 ZIP\u2019a i trzyma\u0107 si\u0119 dokumentacji. Pobra\u0142em, wypakowa\u0142em, a nast\u0119pnie w wierszu polece\u0144 u\u017cy\u0142em komendy \u2018gogs web\u2019. Konfiguracja LDAP \u00a0by\u0142a troch\u0119 bardziej zagmatwana(jak zwykle) ale uda\u0142o si\u0119 j\u0105 zrobi\u0107 ca\u0142kowicie z internetowego panelu administratora: \u00a0 Nie zapomnij, \u017ce b\u0119dziesz musia\u0142 stworzy\u0107 u\u017cytkownika w Gogs admin panelu, aby otrzyma\u0107 dost\u0119p do Gogsa, kt\u00f3ry u\u017cywa twojego u\u017cytkownika AD. Konfiguracja SSL to kwestia edycji pliku gogs\u2019a app.ini, zmiany prokoko\u0142u, ustawieniu certyfikatu oraz kluczowych \u015bcie\u017cek do plik\u00f3w, tak jak jest to opisane w Gogs FAQ. Ostatni\u0105 konfiguracj\u0105, kt\u00f3r\u0105 wykona\u0142em by\u0142o wy\u0142\u0105czenie odkrywania funkcjonalno\u015bci dla anonimowych u\u017cytkownik\u00f3w(chc\u0119, aby moje repozytoria by\u0142y dost\u0119pne na zewn\u0105trz mojej organizacji ale nie nas\u0142uchuj\u0105ce na moich programist\u00f3w). Mo\u017cna \u0142atwo to ustawi\u0107 w app.ini u\u017cywaj\u0105c: [service] REQUIRE_SIGNIN_VIEW = true \u00a0 Voila! Wszystko gotowe. B\u0119d\u0119 informowa\u0142 o tym jak rozwi\u0105zanie przyjmuje si\u0119 po\u015br\u00f3d moich programist\u00f3w. \u00a0 \u00a0 \u00a0<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[24,5,18,11],"tags":[],"_links":{"self":[{"href":"https:\/\/www.iprogrammable.com\/pl\/wp-json\/wp\/v2\/posts\/559"}],"collection":[{"href":"https:\/\/www.iprogrammable.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.iprogrammable.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.iprogrammable.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.iprogrammable.com\/pl\/wp-json\/wp\/v2\/comments?post=559"}],"version-history":[{"count":9,"href":"https:\/\/www.iprogrammable.com\/pl\/wp-json\/wp\/v2\/posts\/559\/revisions"}],"predecessor-version":[{"id":632,"href":"https:\/\/www.iprogrammable.com\/pl\/wp-json\/wp\/v2\/posts\/559\/revisions\/632"}],"wp:attachment":[{"href":"https:\/\/www.iprogrammable.com\/pl\/wp-json\/wp\/v2\/media?parent=559"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.iprogrammable.com\/pl\/wp-json\/wp\/v2\/categories?post=559"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.iprogrammable.com\/pl\/wp-json\/wp\/v2\/tags?post=559"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}