Drupal i GIT. Schemat pracy. Bartek Filipiuk. Crople.pl Wymagania: podstawowa wiedza z Linuxa posiadanie lokalnego środowiska do tworzenia stron w Drupalu podstawowa wiedza z Drupala Czego dowiesz się z tego e-booka: 1. Co to jest GIT 2. Tworzenie repozytoriów. Gdzie i jak? 3. Narzędzia wspomagające prace. 4. Dodawanie projektu drupalowego do repo. 5. Logowanie bez hasła. 6. Gałęzie repozytorium co to i po co? 7. Tworzenie gałęzi na projekcie lokalnym i wysyłanie zmian do zdalnego repozytorium na podstawie zmian w Drupalu 8. Łączenie zmian w gałęziach (merge) Co to jest GIT. GIT jest to system kontroli wersji (SKW). Głównie służy do śledzenia zmian w kodzie źródłowym. Dzięki niemu nad każdym projektem może pracować wielu developerów jednocześnie. Pomaga developerom (programistom) w pracy nad różnymi elementami projektu, niezależnie od projektu głównego. SKW pozwala łączyć ze sobą poszczególne elementy strony. Dzięki GIT zminimalizujemy ryzyko popsucia strony. Nawet jak cos pójdzie nie tak, łatwo można przywrócić działająca wersję strony. Jest kilkanaście(dziesiąt?) rodzajów systemu kontroli wersji http://pl.wikipedia.org/wiki/system_kontroli_wersji Jednym z popularniejszych jest GIT. I to właśnie ten SKW wykorzystam w pracy nad projektami stron w Drupalu. Tworzenie repozytoriów. Gdzie? Jednymi z popularniejszych serwisów do tworzenia przechowywania repozytoriów są strony github.com oraz bitbucket.org Obie strony mają zbliżoną funkcjonalność. Różnicą jest to, że na Github za darmo możemy zakładać jedynie publiczne repozytoria, czyli takie, do
których każdy ma dostęp. Bitbucket oferuje usługę prywatnych repozytoriów za darmo. Wybierz według własnych potrzeb. Ja osobiście korzystam z Bitbucketa i to na jego przykładzie będę wszystko pokazywał. Poniżej pokażę jak stworzyć nowe repo na stronie bitbucket.org Żeby założyć konto trzeba przejść do strony Get started z menu górnego, wypełnić dane i zalogować się. Zakładanie repozytorium. Od razu po zalogowaniu będziesz mógł założyć repozytorium. Z automatu zaznaczone jest, że to prywatne repo. Możesz je założyć później ze strony głównej użytkownika. Wystarczy użyć przycisku Create. Na stronie głównej będą znajdowały się wszystkie Twoje repozytoria.
Przykładowo tak to wygląda u mnie. Formularz tworzenia repo. Zauważ, że zaznaczone jest jako prywatne, projekt jest w języku PHP, typ ustawiony na Git. Po stworzeniu repo dostajesz instrukcję jak ustawić je lokalnie oraz jak wysłać do niego pierwsze pliki. Na następnych stronach wyjaśnię to krok po kroku. Narzędzia wspomagające prace. Git'a można obsługiwać z linii komend linuxa SSH jak i z aplikacji graficznych np. program SmartGit darmowy w wersji do użytku własnego. Pokażę Ci obie te metody. Mimo, że praca w linii komend jest trudniejsza niż z aplikacji graficznej to powinieneś znać podstawowe komendy.
Dodawanie projektu drupalowego do repo. Teraz stworzymy pierwszą wersję projektu. Będzie to czysty Drupal. Pokaże jak to zrobić przy pomocy linii komend SSH w Linuxie. Jeżeli używasz Ubuntu to w standardzie powinieneś mieć zainstalowanego gita. Sprawdź to wywołując komendę git w konsoli, wynik powinien być mniej więcej taki: Jeżeli nie posiadasz gita, zainstaluj odpowiedni pakiet dla swojego Linuxa. Ubuntu 14 - https://www.digitalocean.com/community/tutorials/how-to-install-git-on-ubuntu-14-04 Ubuntu 12 - https://www.digitalocean.com/community/tutorials/how-to-install-git-on-ubuntu-12-04 Przejdźmy do stworzenia lokalnego repo. Po stworzeniu zdefiniujemy zdalne repozytorium, do którego będą wysyłane lokalne pliki. Wejdź do katalogu głównego Drupala. Wywołaj komendę w SSH git init Zdefiniuj zdalne repozytorium wpisując komendę
git remote add origin git@bitbucket.org:nazwausera/nazwarepo.git Te komendy dostajesz w podpowiedzi w momencie gdy zapisujesz nowe repozytorium na Bitbucket: Wynik komend wygląda w ten sposób: Aby dodać pliki Drupala do nowego repozytorium wywołaj komendę: git add * Dodadzą się wszystkie pliki i katalogi z wyjątkiem tych, które wpisane są w pliku.gitignore Aby dodać dwa ukryte pliki.htaccess i.gitignore git add.htaccess.gitignore Możesz go przejrzeć np. less.gitignore
Jak widzisz do repo nie będą dodane pliki, które mogą zawierać poufne dane. Jeżeli nie chcesz wysyłać któryś z plików lub katalogów dopisz je do tego pliku. Teraz, gdy już wykonałeś komendę git add *, zatwierdź zmiany, czyli zrób tak zwanego commit'a. Każdy commit zawiera zmiany względem projektu głównego. W każdej chwili możemy się cofnąć, gdy któryś commit będzie wadliwy. Komenda: git commit -m Init commit Po wywołaniu komendy powinieneś zobaczyć listę plików, które zostały dodane do wysłania. Pliki na serwer z repozytorium wysyłasz komendą: git push -u origin master gdzie master to nazwa głównej gałęzi (branch) projektu. Więcej o gałęziach w następnym punkcie. Wynik komendy: Zostaniesz poproszony o podanie hasła do Bitbucket. Wpisz te, które używasz do logowania się na stronę bitbucket.org Teraz jak przejdziesz do repozytorium, zobaczysz że są już w nim pliki. Jest to wynik zakładki Source
Logowanie bez hasła. Możesz swoje konto na bitbucket ustawić tak aby logować się bez hasła. Do tego potrzebujesz klucza ssh w swoim Linuxie. Sprawdź czy go masz, znajduje się w katalogu domowym w podkatalogu.ssh wywołaj komendę: ls -al ~/.ssh/id_rsa.pub Jeżeli zwróci wynik to znaczy, że masz już ten klucz. Jeżeli go nie masz to wygeneruj komendą: ssh-keygen -t rsa -C "your_email@example.com" Po tej komendzie w katalogu domowym utworzony zostanie katalog.ssh a w nim plik z kluczem publicznym id_rsa.pub Edytuj plik less ~/.ssh/id_rsa.pub Skopiuj, zawartość wklej na stronie bitbucket.org Wejdź do repozytorium, do którego chcesz logować się bez hasła. Zakładka Settings, z bocznego menu, które się pojawi wybierz zakładkę Deployment keys i klik w button Add key
Otworzy się pole gdzie wklej swój publiczny klucz ssh. Po tym zapisz. Teraz będziesz mógł wysyłać zmiany do repozytorium bez podawania hasła. Gałęzie repozytorium co to i po co? Gałąź to każda odnoga od projektu głównego (master), która połączona jest z konkretnym commitem, czyli zmianą. Najlepiej zobrazuje to grafika (http://nvie.com/posts/a-successful-git-branching-model): Gdzie master gałąź główna projektu, pliki tworzące stronę produkcyjną. develop gałąź developerska utworzona z gałęzi master, te pliki tworzą stronę, w którą bezpośrednio ingerują developerzy. W przypadku popsucia się strony na gałęzi develop, strona produkcyjna jest nie ruszona. Gdy szef projektu uzna, że wersję develop można wdrażać do produkcji (wszystkie zmiany są poprawne) wtedy łączy gałąź develop z master robi się tak zwanego merge [merdż]
Gałęzi można tworzyć dowolnie dużo. Na rysunku widać kilka gałęzi: master, develop, feature itd. Przykładowo, masz stronę firmową, jej główna wersja jest na gałęzi master. Gałąź develop to ta gdzie usprawniasz funkcjonalności. Postanawiasz dobudować galerię zdjęć na stronę. W tym celu tworzysz nową gałąź np. gallery na podstawie gałęzi develop. Będąc na gałęzi gallery możesz robić wszelkie zmiany, w razie popsucia się strony czy innych kłopotów, przełączając się na develop wracasz do stanu przed zmianami związanymi z galerią. Gdy zakończysz prace związane z galerią, wysyłasz zmiany do zdalnego repozytorium. Teraz możesz połączyc ze sobą dwie gałęzie np. gallery z develop w celu przetestowania zmian. Gdy testy zakończą się pozytywnie to gałąź develop można połączyć z master i zmiany wdrożyć na stronie produkcyjnej. Tworzenie gałęzi na projekcie lokalnym i wysyłanie zmian do zdalnego repozytorium. W tym punkcie pokażę jak: stworzyć nową gałąź develop na podstawie projektu głównego master. dodać moduł ctools i views na nowej gałęziach wysłać zmiany do zdalnego repozytorium (zrobić commit) komendą oraz w programie SmartGit połączyć zmiany w develop z master Żeby wiedzieć na której gałęzi aktualnie się pracuje, w katalogu z lokalnym repo wywołaj komendę: git status Z tego widać, że pracujesz na gałęzi (branch) master i nie zrobiłeś żadnych zmian. Twoje lokalne repo jest identyczne z tym na stronie bitbucket.org
Tworzenie nowej gałęzi: git checkout -b develop Teraz zmiany będą robione niezależnie od gałęzi master. Możesz się przełączać między gałęziami: git checkout master Przełączy Cie na master git checkout develop na develop Teraz jak jesteś na develop, dodaj nowy moduł do Drupala np. ctools i views Odpalając komendę git status zobaczysz nowe zmiany: Pierwszy moduł ctools, dodam przy pomocy komendy w terminalu Linuxa. Drugą przy pomocy graficznego programu SmartGit Dodanie katalogu ctools przy pomocy komendy git add. Jeżeli wywołujesz komendę z katalogu głównego Drupala to wpisz całą ścieżkę: git add sites/all/modules/ctools Stwórz commita: git commit -m add ctools module Powinny wylistować się pliki, które zostaną dodane. Wyślij zmiany na serwer zdalny na gałąź develop.
git push -u origin develop Przejdź do strony bitbucket.org i zobacz jak wygląda teraz twoje zdalne repozytorium. W zakładce Branches powinny być teraz dwie gałęzie master i develop. Możesz podejrzeć obie, zauważ, że w master nie ma modułu ctools, jest on tylko w develop. Przykład wysyłania zmian przy pomocy programu SmartGit
Główny interface programu SmartGit. Widać na nim listę wszystkich dodanych repozytoriów. Po prawej znajduje się lista ze zmienionymi plikami. Na dole dwa okna obok siebie pokazują różnicę między tym co mamy na localu (prawe okno) a tym co jest w repozytorium na serwerze zewnętrznym np. na bitbucket (lewe okno) Teraz żeby wysłać zmiany lokalne do zdalnego repo wystarczy zaznaczyć plik lub pliki do wysłania i kliknąć Commit z górnego paska przycisków. Pojawi się lista plików do wysłania. Trzeba wpisać wiadomość z jaka zostaną wysłane zmiany. Teraz wystarczy kliknąć w Commit & Push. Po chwili zmiany będą na zdalnym repo. Łączenie zmian w gałęziach (merge) Merge, czyli łączenie zmian między gałęziami robimy gdy uznamy, że chcemy funkcjonalności z jednej gałęzi np. develop włączyć do gałęzi głównej, która odpowiada stanowi strony produkcyjnej np. master Jeżeli masz więcej gałęzi bo np. jedna gałąź odpowiada każdej tworzonej funkcjonalności możesz je łączyć ze sobą na różne sposoby. Gdy wszystkie zmiany wraz z gałęziami (branchami) masz wysłane do zdalnego repo. Merge wykonujesz na stronie, która obsługuje twoje repozytoria. Poniżej przykład ze strony Bitbucket. Wejdź na stronę repozytorium gdzie będziesz wykonywał merge.
Z menu bocznego kliknij w Create pull request. System automatycznie wykryje zmiany między wybranymi branchami. W powyższym przykładzie pokazana jest różnica między gałęziami develop i master. Taki układ połączy develop z master. Możesz też zobaczyć jakie commity składają się na te róznice. Po kliknięciu w button Create pull request, przejdziesz do strony gdzie zobaczysz jakie zmiany będą wdrożone.
Czasami, gdy na projekcie pracuje kilku developerów, może zdarzyć się tak, że pojawią się konflikty i merge będzie niemożliwy. Wtedy trzeba je rozwiązać lokalnie (lokalnie zrobic merge) i i wysłać zmiany do zdalnego repozytorium. Gdy nie ma konfliktów wystarczy kliknąć w button Merge. I znowu Po tym procesie zmiany z develop znajdą się na master. Po więcej informacji zapraszam na bloga: http://crople.pl/blog Można poszukać tutoriali do git'a w Google. Jest ich całkiem sporo, również po polsku. Bartek Filipiuk. Crople.pl