Mgr inż. Stanisław GRZYWIŃSKI Wojskowa Akademia Techniczna, Wydział Mechatroniki i Lotnictwa PERFORCE SYSTEM KONTROLI WERSJI W ZASTOSOWANIACH Streszczenie: W artykule zaprezentowano możliwości i zalety zastosowania systemu kontroli wersji w procesie implementacji oprogramowania. Przedstawiono podstawowe funkcje systemu Perforce oraz porównano jego możliwości z innymi systemami dostępnymi na rynku. PERFORCE VERSION CONTROL SYSTEM USED IN APPLICATIONS Abstract: This paper presents possibilities and advantage of using version control systems in software development. Discusses the basic functions of Perforce software and compare its features with other systems available on the market. Słowa kluczowe: system kontroli wersji, repozytorium, integracja Keywords: version control system, repository, integrate 1. WPROWADZENIE W dzisiejszym cyfrowym świecie, gdzie niemal każdy przechowuje szereg danych, często zachodzi konieczność dodatkowego przechowywania kopii zapasowej lub też przywrócenia pliku do jego wcześniejszej wersji. Jedną z wielu możliwości zarządzania plikami danych jest np. ciągłe modyfikowanie istniejących i kopiowanie do konkretnych katalogów często pod zmienioną nazwą. Jest to znana praktyka, którą stosuje dzisiaj wielu użytkowników oprogramowania. Metodyka ta sprawdza się w przypadku, gdy mamy do czynienia z niewielkim zbiorem danych. Jednak i w tym wypadku rozwiązanie pozornie proste i niezawodne posiada szereg wad i jest podatne na błędy, które bardzo często są wynikiem prostej pomyłki. Aby poradzić sobie z tego typu problemami oraz sprawniej zarządzać plikami danych, opracowano szereg lokalnych systemów kontroli wersji, które składają się z bazy danych, gdzie przechowywane są wszystkie zmiany dokonane na monitorowanych plikach. System kontroli wersji, gdyż o takim w artykule jest mowa (z ang. version control system lub revision control system) to zestaw narzędzi używanych do monitorowania i kontrolowania zmian prowadzonych w plikach projektów odnoszących się w szczególności do kodu źródłowego, dokumentacji oraz zmian dotyczących np. stron internetowych. Systemy tego typu są nieocenione zwłaszcza przy realizacji projektów programistycznych. Przechowują one starsze wersje modyfikowanych plików, wykonane przez różne osoby niezależnie od daty modyfikacji, pozwalając w każdej chwili je przywrócić. Systemy kontroli wersji pozwalają na przykład odtworzyć stan całego projektu sprzed kilku dni, tygodni czy miesięcy oraz porównać wprowadzone zmiany. Dzięki takiemu podejściu w przypadku popełnienia błędu czy utraty części danych możliwe jest ich przywrócenie. 225
MECHANIK 7/2014 Artykuł ten nie omawia wszystkich aspektów korzystania z systemu kontroli wersji, gdyż jest to temat bardzo obszerny. Nie opisuje również w całości dostępnego na rynku oprogramowania. W artykule główny nacisk został położony na opis możliwości, jakie wynikają z zastosowania systemu kontroli wersji w tworzeniu oprogramowania. Skupiono się na wybranych aspektach kontroli wersji przedstawionych na przykładzie systemu Perforce. 2. SYSTEMY KONTROLI WERSJI Systemy kontroli wersji ze względu na ich architekturę można podzielić na trzy główne kategorie: lokalne, do których można zaliczyć systemy np. RCS, GNU SCSS, scentralizowane, m.in. SVN, CVS, PERFORCE, rozproszone, w których można wyróżnić np. GIT, MERCURIAL, SVK. Systemy lokalne pozwalają tworzyć repozytoria danych lokalnie, tylko na jednym komputerze. Mogą być one używane zatem tylko i wyłącznie przez jedną osobę, która pracuje nad daną częścią dokumentacji. Schematycznie przedstawiono to na rys. 1. Narzędzia tego typu z uwagi na brak możliwości współdzielenia są dzisiaj wykorzystywane rzadko. Niemniej jednak jednym z najbardziej popularnych narzędzi tej grupy był system RCS (z ang. Revision Control System), który wciąż można spotkać na wielu komputerach. Rys. 1. Zobrazowanie przechowywania danych w systemie lokalnym System RCS to pakiet poleceń pracujących w środowisku Unix/GNU/Linux, realizującym kontrolę wersji na plikach tekstowych. System powstał na Wydziale Informatyki Uniwersytetu Purdue w Indianie. RCS zarządza grupami tzw. wydań (rewizji). Przez grupę rewizji rozumie się pewien zbiór dokumentów tekstowych powiązanych ze sobą w ten sposób, że kolejne pliki powstają przez modyfikacje istniejących. System RCS organizuje tak rozumiane wydania w drzewo, przedstawiające historię ich zmian. Automatyzuje proces tworzenia i przechowywania kolejnych wersji projektu oraz zapewnia mechanizmy pozwalające na dokładne określanie różnic pomiędzy wersjami pliku i ich scalanie. Wszystkie zmiany w kolejnych wersjach są rejestrowane i dokumentowane, co umożliwia uzyskanie pełnej historii zmian. Ten mechanizm realizacji zadań kontroli wersji opisuje również pozostałe grupy systemów niebędących lokalnymi. Wprawdzie RCS był tworzony z myślą głównie o zarządzaniu wersjami kodu źródłowego programów, ale w praktyce pracuje z dowolnymi plikami tekstowymi. Oznacza to, że może znaleźć zastosowanie w zarządzaniu dokumentami napisanymi w językach opisu tekstu, HTML czy XML. Wynika z tego, że RCS jest w stanie 226
zarządzać nie tylko wersjami kodu programów, lecz także dokumentacją w różnych formatach. Zdecydowanie częściej od przedstawionej grupy lokalnych systemów kontroli wersji korzysta się z systemów scentralizowanych opartych na architekturze typu klient serwer. Systemy takie jak CVS, Subversion czy Perforce składają się z jednego serwera, który zawiera wszystkie rewizje monitorowanych plików oraz klientów, którzy mogą się z nim łączyć i uzyskać dostęp do najnowszych wersji gromadzonych danych. Przez wiele lat był to standardowy model systemu kontroli wersji (rys. 2). Tego rodzaju rozwiązania są szczególnie popularne tam, gdzie wiele osób pracuje na udostępnionych danych. Co więcej, każdy może się zorientować, co robią inni deweloperzy, a wręcz bardzo często w projektach wykorzystuje się automatyczne powiadomienia o postępach pracy, które są rozsyłane do wszystkich współpracowników. Dodatkowo administratorzy mają dokładną kontrolę nad uprawnieniami poszczególnych użytkowników, co okazuje się być przydatne w rozległych projektach w celu ochrony informacji. Wówczas każdy pracownik posiada dostęp jedynie do niezbędnych części dokumentacji. Rys. 2. Zobrazowanie przechowywania danych w systemie typu klient serwer W grupie systemów klient-serwer niewątpliwie jedno z czołowych miejsc zajmuje aplikacja SVN, która jest rozpowszechniana na zasadach licencji Apache i jest jednocześnie chyba najpopularniejszym systemem kontroli wersji. W przeciwieństwie do CVS-a, SVN umożliwia śledzenie nie tylko zmian samej zawartości plików, lecz także nazw katalogów i plików oraz ich położeń. SVN zapewnia również działanie w transakcjach, zabezpieczając ważne operacje przed przerwaniem w trakcie ich wykonania. W przypadku SVN-a interfejsem ułatwiającym jego używanie jest TortoiseSVN. Jest to zestaw narzędzi rozpowszechnianych na zasadach licencji GNU General Public License, które umożliwiając dostęp do SVN-a z poziomu menedżera plików (rys. 3). 227
MECHANIK 7/2014 Rys. 3. Interfejs TortoiseSVN Ostatnia grupa to systemy rozproszone pozwalające na pracę w sieci P2P (z ang. Peer to Peer). Podstawową ich cechą jest to, że repozytoria danych przechowywane są zarówno na serwerze, jak i na komputerach użytkowników. Pozwala to na szybkie odtworzenie straconych danych. Rozproszone systemy kontroli wersji (z ang. często oznaczone jako DVCS Distributed Version Control System) to najczęściej Git, Mercurial, Bazaar lub Darcs. W tych systemach klienci nie dostają dostępu jedynie do najnowszych wersji plików, ale w pełni kopiują całe repozytorium. Gdy jeden z serwerów używanych przez te systemy do współpracy ulegnie awarii, repozytorium każdego klienta może zostać po prostu skopiowane na serwer w celu przywrócenia go do pracy (rys. 4). Rys. 4. Zobrazowanie przechowywania danych w systemie rozproszonym 228
MECHANIK 7/2014 Jak wspomniano wcześniej, jednym z reprezentantów systemów rozproszonych jest GIT. Jest rozpowszechniony na open-source owych zasadach licencji GNU GPL 2. Rozpoczęcie pracy z GIT em jest uznawane za bardzo proste dzięki pośrednictwu serwisów takich jak GitHub czy BitBucket (BitBucket jest często używany również na potrzeby innych aplikacji, np. Mercuriala). GitHub posiada dzisiaj ponad trzy miliony użytkowników oraz ponad pięć milionów repozytoriów. Oprogramowanie to umożliwia zarejestrowanym użytkownikom hostowanie i wersjonowanie plików na zasadach darmowych lub płatnych. Pomimo przedstawionego podziału systemów kontroli wersji, podstawową zaletą wszystkich jest możliwość stałego śledzenia rozwoju aplikacji, powrotu do wcześniejszych wersji oprogramowania, a także merge owania branchy (opisanych w dalszej części artykułu) rozwijanych przez kilku użytkowników. Oprogramowanie służy niekiedy również szeroko pojętym celom projektowym, na przykład do gromadzenia całości materiałów i dokumentacji, tj. grafik, harmonogramów czy specyfikacji technicznych. W przypadku współczesnego oprogramowania, najistotniejsze wydają się zmiany w kodzie źródłowym, dokumentacji czy plikach konfiguracyjnych. Dlatego też system kontroli zmian zachodzących w oprogramowaniu jest bezcennym narzędziem dla szeroko rozumianych deweloperów. 3. SYSTEM PERFORCE W ZASTOSOWANIACH Podczas rozwijania i implementacji oprogramowania pojawia się istotny problem kontroli, rejestrowania i dokumentowania zmian dokonywanych przez uczestników projektu. System kontroli wersji Perforce okazuje się niezwykle przydatny nie tylko w przypadku pracy wielu projektantów nad tym samym dokumentem, lecz także w przypadku, gdy testuje się różne rozwiązania programowe, np. moduły sterowników, które zależne są od struktury platformy sprzętowej, i ze względu na objętość kodu źródłowego implementuje się tylko niezbędne procedury. Do obsługi Perforce a najczęściej wykorzystuje się wieloplatformowy graficzny interfejs użytkownika oznaczony jako P4V. Interfejs P4V łączy komputer z serwisem Perforce a i pozwala przenosić pliki między przestrzenią serwera a przestrzenią roboczą, jak pokazano na rys. 5. Rys. 5. Wymiana danych w systemie kontroli wersji Perforce (* z ang. workspace) Więcej informacji o Perforce i P4V można znaleźć w dokumentacji [1, 2]. Podczas pracy z systemami kontroli wersji należy rozróżniać następujące definicje: 229
workspace, inaczej obszar roboczy, który zawiera foldery, katalogi oraz pliki danych umieszczonych lokalnie na stacji PC, w którym operuje się na wersjach plików zarządzanych przez Perforce a, depot (repozytorium plików), inaczej baza danych, w której zapisywane są wszelkie zmiany. Zawiera wszystkie istniejące wersje plików, które zostały kiedykolwiek utworzone, branch (gałąź) jest izolowaną kopią projektu znajdującą się w repozytorium. Podstawową cechą każdej gałęzi jest to, że zmiany nie wpływają na resztę projektu do czasu, gdy nie zostaną przez kogoś scalone (merge owane). Gałęzie bywają także nazywane liniami rozwoju. Nawet gdy projekt nie posiada wielu gałęzi, mówi się, że rozwój odbywa się na głównej gałęzi, także nazywanej pniem (z ang. trunk). Gałęzie dają możliwość odizolowania od siebie różnych linii rozwoju. Na przykład gałąź może powstać na potrzeby eksperymentalnego kodu, który mógłby zdestabilizować całość opracowywanego oprogramowania, merge/integrate to operacje przeniesienia zmian plików z jednej gałęzi na inną. Chodzi zarówno o scalanie zmian z głównej gałęzi do innej, jak i na odwrót. Scalanie posiada jeszcze jedno podobne znaczenie. Mianowicie przypadek, w którym dwóch użytkowników dokona modyfikacji pliku w tym samym czasie. Zmiany te z reguły nie zachodzą na siebie i są automatycznie scalane. Użytkownik musi jedynie zaktualizować wersje dostępnego pliku. To bardzo częsta sytuacja, szczególnie w projektach, w których wiele osób pracuje nad tym samym kodem. Gdy dwie różne zmiany zachodzą na siebie, pojawia się konflikt. Wówczas niezbędna jest integracja kodu, która musi zostać przeprowadzona przez członka zespołu. Zalety oprogramowania Perforce zdecydowano się wykorzystać w projekcie tworzenia autonomicznej jednostki systemu lokacji noda opartego na architekturze procesora ARM. Tematyka projektu nie będzie szerzej omawiana, gdyż głównym celem artykułu jest opis wykorzystania systemu kontroli wersji. Niemniej jednak zmiany sprzętowe dokonywane w czasie trwania projektu oraz możliwości testowania projektowanych algorytmów lokacji i sterowników wymusiły wykorzystanie Perforce a, co okazało się być niezwykle przydatne. Jedną z podstawowych zalet była możliwość monitorowania zmian, ich szczegółowego opisu oraz szybkiej lokalizacji potrzebnych plików. Co więcej bezpośrednia integracja systemu kontroli wersji ze środowiskiem programistycznym znacząco ułatwiła archiwizowanie i zapisywanie danych. Zapewniono w ten sposób niemal automatyczny dostęp do potrzebnej wersji rozwijanego oprogramowania. Każdy z programistów uczestniczący w projekcie pracował na odpowiedniej, często różnej wersji zaimportowanego i niezbędnego pliku danych, tworząc tzw. change listy (rys. 6). W ten sposób zapewniono szybką oraz bezkonfliktową pracę, jak i identyfikację opracowywanych rozwiązań. Należy tutaj również wspomnieć, że wykorzystano odpowiedni sposób weryfikacji poprawności tworzonego i zapisywanego kodu, który między innymi przewidywał zapis jedynie skompilowanego oraz przetestowanego oprogramowania. Wszelkie nieprzetestowane wersje kodu aplikacji występowały w postaci wersji lokalnych u każdego z programistów. 230
MECHANIK 7/2014 Rys. 6. Przykładowa change lista modyfikowanych plików W systemie Perforce szczególnie wygodny okazuje się również podgląd wykorzystywanych i kontrolowanych plików, co przedstawia rys. 7. Rys. 7. Główny widok systemu Perforce *1 okno historii zmian pliku, *2 szczegółowy opis zmian, *3 drzewko rewizji plików Podczas pracy wykorzystano również szereg przydatnych funkcji. Jedną z nich była możliwość podglądu historii zmian dokonywanych przez projektantów. Każda z zapisanych zmian opatrzona była opisem, który pozwalał na identyfikację wykonanych modyfikacji. Ważną i przydatną zaletą w zarządzaniu plikami okazał się powrót do poprzedniej wersji pliku, przed zmianami. Bardzo szybko można było zlokalizować potrzebny plik, wykorzystując opcję Revision Graph dostępną w środowisku Perforce (rys. 8). 231
Rys. 8. Opcja Revision Graph lokalizacja zmian pliku W czasie realizacji projektu bardzo często zachodziła potrzeba migracji i integracji powstałego oprogramowania. Ze względu na równoległą pracę programistów, bardzo często wykorzystywano opcję Diff Against Have Revision, która umożliwia porównanie interesujących nas plików (rys. 9). W ten sposób uzyskano szybką możliwość oceny zmian wykonanych przez pozostałą część zespołu oraz weryfikację zgodności. Ponadto możliwość podglądu listy modyfikacji umożliwiała śledzenie postępów prac. Dodatkowo funkcjonalność ta kilkakrotnie przyspieszyła proces lokalizacji niepotrzebnych lub wadliwych części oprogramowania (rys. 10). Rys. 9. Operacja Diff Against Have Revision weryfikacja zmian 232
Rys. 10. Lista przeprowadzonych modyfikacji 4. PODSUMOWANIE Zarządzanie kodem źródłowym w trakcie realizacji projektu jest jednym z najważniejszych aspektów, które mogą z pewnością uprościć, przyspieszyć i co ważniejsze zabezpieczyć dokumentację projektu, co w dalszej perspektywie może decydować o powodzeniu lub porażce przedsięwzięcia. W przypadku dużych projektów system kontroli wersji powinien być także wpleciony w całościowy proces realizacji zadań i połączony m.in. ze środowiskiem deweloperskim. Podstawowym zadaniem systemu kontroli wersji jest składowanie kolejnych wersji kodu źródłowego, umożliwienie jednoczesnej pracy wieloosobowym zespołom programistycznym, minimalizując konflikty zmian kodu, a także łatwe odwoływanie się do dowolnej wersji kodu. Taki system działa jednocześnie jako kopia zapasowa oraz archiwum wszystkich zmian kodu. Wybór systemu nie jest łatwy, szczególnie przy większych projektach, gdzie złe rozwiązanie może mieć duży wpływ na wygodę i wydajność pracy. Obecnie systemów jest wiele. Główną uwagę poświęcono na pokazanie kilku aspektów wykorzystania systemu Perforce. Kontrola wersji jest uniwersalna, ponieważ pomaga praktycznie w każdym aspekcie projektu: w komunikacji między programistami, zarządzaniu wydaniami, śledzeniu błędów, stabilizacji kodu czy eksperymentowaniu. Może także służyć do uwierzytelniania i przypisywania zasług poszczególnym programistom. System kontroli wersji stanowi centralny punkt we wszystkich wspomnianych obszarach. Podstawą systemu kontroli wersji jest zarządzanie zmianami, pozwalające odróżnić każdą atomową zmianę w plikach projektu, tworząc metadane z nią związane, i przekazać ją do innych użytkowników w sposób, w jaki sobie tego zażyczą. To kanał komunikacyjny, w którym podstawową jednostką informacji jest pojedyncza zmiana. 233
LITERATURA [1] http://www.perforce.com/. [2] Perforce 2013.3: P4 User's Guide. http://www.perforce.com/perforce/doc.current/manuals/p4guide/p4guide.pdf. 234