Jestem kolejnym użytkownikiem Subversion walczącym o ponowne nauczenie się w Tao rozproszonej kontroli wersji.
Korzystając z Subversion, byłem wielkim fanem niewielkich projektów i wraz z większością moich byłych pracodawców ustrukturyzowaliśmy nasze oddziały repozytoriów; tagi i bagażnik w następujący sposób:
branches-+
+-personal-+
| +-alice-+
| | +-shinyNewFeature
| | +-AUTOMATED-+
| | +-shinyNewFeature
| +-bob-+
| +-AUTOMATED-+
| +-bespokeCustomerProject
+-project-+
+-shinyNewFeature
+-fixStinkyBug
tags-+
+-m20110401_releaseCandidate_0_1
+-m20110505_release_0_1
+-m20110602_milestone
trunk
W obrębie samego drzewa źródłowego użylibyśmy (coś podobnego) następującej struktury:
(src)-+
+-developmentAutomation-+
| +-testAutomation
| +-deploymentAutomation
| +-docGeneration
| +-staticAnalysis
| +-systemTest
| +-performanceMeasurement
| +-configurationManagement
| +-utilities
+-libraries-+
| +-log-+
| | +-build
| | +-doc
| | +-test
| +-statistics-+
| | +-build
| | +-doc
| | +-test
| +-charting-+
| | +-build
| | +-doc
| | +-test
| +-distributedComputing-+
| | +-build
| | +-doc
| | +-test
| +-widgets-+
| +-build
| +-doc
| +-test
+-productLines-+
| +-flagshipProduct-+
| | +-coolFeature
| | +-anotherCoolFeature
| | +-build
| | +-doc
| | +-test
| +-coolNewProduct
+-project-+
+-bigImportantCustomer-+
| +-bespokeProjectOne
| +-bespokeProjectTwo
+-anotherImportantCustomer-+
+-anotherBespokeProject
Ideą było (i nadal jest) wykorzystanie struktury repozytorium, aby pomóc w strukturze komunikacji między zespołem inżynierów; część firmy zorientowana na klienta oraz inni interesariusze i eksperci w tej dziedzinie.
To znaczy: Dokumenty źródłowe znajdujące się w jednym z katalogów „projektu” są wykorzystywane (i zarabiają pieniądze) tylko raz. Dokumenty znajdujące się w jednym z katalogów „productLines” zarabiają tyle razy, ile razy produkt z danej linii zostaje sprzedany. Dokumenty znajdujące się w jednym z katalogów „bibliotek” zarabiają tyle razy, ile sprzedaje którykolwiek z ich produktów.
Wyjaśnia pojęcie amortyzacji kosztów i pomaga zbudować obsługę ponownego wykorzystania dokumentów źródłowych w całej firmie.
Oznacza to również, że istnieje wspólna struktura, nad którą mogą działać nasze narzędzia do automatyzacji kompilacji. (Nasze skrypty kompilacji chodzą po drzewie źródłowym w poszukiwaniu folderów „kompilacji”, w których znajdują pliki konfiguracyjne określające sposób budowania każdego komponentu; podobny proces ma miejsce w przypadku generowania i testowania dokumentacji).
Co znamienne, produkty, nad którymi pracuję, zwykle trwają DŁUGO, aby przeprowadzić testy pomiaru wydajności i charakterystyki; od 20 do 200 godzin; generowanie gdzieś między kilkoma GB a kilkoma TB przetworzonych wyników testów / danych pośrednich (które muszą być przechowywane i powiązane z określoną konfiguracją systemu, aby można było zmierzyć poprawę wydajności w czasie). Ten problem sprawia, że zarządzanie konfiguracją jest ważnym czynnikiem, a także nakłada pewne wymagania dotyczące centralizacji, ponieważ zazwyczaj zasoby obliczeniowe potrzebne do uruchomienia pomiarów wydajności i testów charakteryzujących są ograniczone; (mały klaster złożony z 64-128 rdzeni).
Jako ostatnia uwaga; system ciągłej integracji wie, że musi uruchomić kompilację; analiza statyczna; test dymu i test jednostkowy uruchamiane przy każdej modyfikacji pnia, za każdym razem, gdy modyfikowana jest dowolna gałąź „tag”, oraz za każdym razem, gdy modyfikowana jest dowolna gałąź „AUTOMATED”. W ten sposób indywidualni programiści mogą korzystać z systemu CI ze swoimi osobistymi oddziałami, co jest ważną funkcją, IMHO.
Oto moje pytanie: Jak mogę powtórzyć wszystkie powyższe (i ulepszyć je, jeśli to możliwe), z Mercurial.
--edytować:
Mój obecny sposób myślenia polega na użyciu centralnego repozytorium Subversion, aby zdefiniować ogólną strukturę, ale pozwolić na użycie hg jako klienta, aby programiści mogli mieć repozytoria dostępne lokalnie.