W ciągle rozwijanym projekcie internetowym (nie produkt) mamy obecnie następującą strategię rozgałęziania, w przybliżeniu opartą na git flow :
- gałąź rozwoju: najnowsza działająca wersja
- oddział główny: wersja do wydania / wersja do wydania
- gałęzie funkcji: funkcje w fazie rozwoju
- gałęzie poprawek: pilne poprawki błędów w wydanej wersji
Mistrz jest tylko do odczytu, poprzez zaktualizowane wnioski pobiera z rozwijania lub poprawek oddziałów . Każda aktualizacja powoduje, że kandydat do wydania jest budowany i wdrażany w systemie pomostowym. Kandydaci do wydania są wdrażani do produkcji po ręcznym zatwierdzeniu.
Gałęzie operacji są tworzone w oparciu o wywoływanie lub od ostatniego zatwierdzenia, które zostało scalone w master. Żądanie ściągnięcia z gałęzi funkcji do opracowania jest budowane i wdrażane w bezpłatnym systemie testowym, w którym przeprowadzane są testy integracyjne i testy akceptacyjne (automatyczne i ręczne). Po pomyślnym przetestowaniu i przejrzeniu PR zostaje scalony, dzięki czemu staje się częścią następnej wersji (tj. Scala od dewelopera do mistrza).
Mój cel
Chciałbym to uprościć i pozbyć się gałęzi deweloperskiej. Gałąź deweloperska ma głównie przyczyny historyczne, a ponieważ jest to zawsze wersja pomyślnie przetestowana, myślę, że nie jest konieczne oddzielanie jej od master. Usunięcie go również uprości proces wydania, ponieważ nie ma już dodatkowego scalania.
Mam następujące ograniczenia:
- wydania są zaplanowane i nie powinny być w pełni zautomatyzowane
- choć gałęzie funkcji są zazwyczaj krótkotrwałe, niektóre pozostają nierozłączone przez kilka tygodni (np. przeprojektowanie), ale również muszą zostać przetestowane (obecnie w celu opracowania)
- czasami jedna funkcja powinna zostać wydana poza zwykłą wersją, skutecznie zmieniając ją w poprawkę. Przy obecnej strategii mogę zmienić gałąź funkcji i połączyć ją bezpośrednio w master
- zdarza się również, że musimy wstrzymywać funkcje po niepowodzeniu testów akceptacyjnych z systemami zewnętrznymi
Gdzie nie jestem pewien przejścia:
- obecnie tworzę żądania ściągania do testowania i scalania zatwierdzeń dla wydań. Czy mogę to ujednolicić?
- jak radzić sobie z poprawkami, kiedy master wyprzedza najnowszą wersję. Czy powinienem budować i wdrażać wersje bezpośrednio z oddziałów poprawek?
- czy istnieje rozsądny sposób radzenia sobie z funkcjami, które powinny zostać wykluczone z wydania po ich połączeniu? Czy oddzielna gałąź programistyczna naprawdę jest zaletą w tych przypadkach? W większości przypadków i tak przywracam i przywracam zatwierdzenia ręcznie.
źródło
Odpowiedzi:
IMHO problemy jesteś skierowane są tylko efektem ubocznym złej strategii oddziału uruchomiłeś z: jesteś skutecznie orki na rozwoju nowych
develop
(czyli to, co zbiega w kierunku przyszłej produkcji kodu) poprzez w aktualnym kodem produkcji namaster
. Prowadzi to do sprzecznych wymagań i problemów, ponieważ zazwyczaj przyszły kod odbiega od obecnego:develop
wmaster
develop
aby była wystarczająco dobra do połączeniamaster
Upuszczenie
develop
nie pomoże (dużo) - nie eliminujesz problemu, po prostu przenosiszdevelop
specyficzną dla niego część problemumaster
.Lepszym rozwiązaniem byłoby przenieść produkcję za obecnym rozwoju / przyszłość, aby uniknąć interferencji z rozwoju dla przyszłych wydaniach, jak pokazano w tym obrazie z Jaki jest Twój Rozgałęzienia modelu? :
Pamiętaj, że odnoszę się tylko do gałęzi wydania na powyższym obrazku, a nie do tego, co dzieje się w bagażniku.
Jak by to działało dla Ciebie:
develop
bonusie gałąź, jak chciał, wchłoniętemaster
master
oddział jest bagażniku, to gdzie rozwój dzieje się bez żadnych ograniczeń prędkości (to nigdy nie połączyła się w produkcji).release
gałęziami wyciągniętymi zmaster
etykiety / etykiety uważanej za wystarczająco zbliżoną do jakości produkcji (w razie potrzeby w tej gałęzi można zaadresować krótką listę pozostałych todo). Te oddziały mogą otrzymywać tylko bezpośrednie poprawki i / lub wybrane przez siebie poprawkimaster
, nigdy nie są łączone zmaster
innymi gałęziamirelease
oddziałówJeśli poprawka dotyczy tylko wersji produkcyjnej, ale nie dotyczy
master
, jest ona bezpośrednio przypisywana dorelease
oddziału. Jeśli dotyczy zarówno obu, to zazwyczaj jest przypisane domaster
pierwszego, a także do wybrania / podwójnego zaangażowania wrelease
oddziale.Teraz, patrząc na to, co się dzieje
master
(co jest powyżej punktu, w którym bieżącarelease
gałąź jest ściągana), masz 2 opcje:master
, niedevelop
. Konwersja ich do poprawek jest nadal możliwa - wystarczy zmienić bazę na odpowiedniąrelease
gałąź zamiastmaster
Jeśli podoba Ci się to podejście, oto jak się tam dostać z miejsca, w którym jesteś dzisiaj:
releaseX
gałąźmaster
, zgodnie z tą strategią nazewnictwadevelop
, wkrótce będą jechać prosto domaster
.develop
wmaster
master
zamiast nich zmienili podstawy swoich obszarów roboczychdevelop
.master
na zatwierdzeniadevelop
jeśli chcesz (lub pozostaw na stałe zablokowany / tylko do odczytu)źródło
Załóżmy, że usuwasz gałąź master (możesz zmienić nazwę develop na master, aby zmylić swój zespół, jeśli chcesz później) i po prostu użyj tagów do wydań w gałęziach develop lub hotfix. Wyjąłeś gałąź, ale różnica polega tylko na zmianie składni. Zmień ze względu na zmianę.
Powiedzmy teraz, że faktycznie bierzesz rozwijanie z zachowaniem zablokowanej gałęzi master. To, co się stanie, to spowolnienie integracji kodu, będzie on dłużej działał osobno w gałęziach funkcji, szczególnie blisko dat wydania. Zwiększy to trudność łączenia za każdym razem i spowolni proces.
W ramach ustanowionych przez ciebie ograniczeń nie widzę żadnych pozytywnych skutków wprowadzenia takich zmian. Wymagałoby to złagodzenia ograniczeń, zwłaszcza pierwszego.
źródło
Budujesz i testujesz już kod w każdej gałęzi żądania ściągania i poprawki. Oznacza to, że suma wszystkich gałęzi oczekujących na żądanie ściągnięcia stanowi
develop
gałąź wirtualna .Możesz stworzyć system w środowisku testowym, kilka żądań ściągania jest wiśniowo wybieranych do gałęzi tymczasowej, która nie jest publikowana w głównym repozytorium. Ta gałąź służy do zintegrowania środowiska testowego, które zawiera
master
i kilka dodatkowych żądań ściągania, ale po zakończeniu testowania gałąź ta nie jest już dostępna nigdzie.Kiedy tworzysz wydanie z
master
, zwykle tworzysz tag w tym wydaniu. Późniejsze poprawki mogą użyć tego znacznika do utworzenia nowej gałęzi poprawek, z której zostanie wykonane wdrożenie, nawet jeśli krawędźmaster
jest już przed nami. W tej gałęzi poprawek prawdopodobnie oznaczono by również niewielkie wydanie i upewnij się, że zmiany zostały scalonemaster
.Usuwanie scalonych funkcji z wydania jest dość trudne w przypadku git. Najlepszym mechanizmem do tego byłoby użycie
git revert
przy zatwierdzaniu scalania. Ale to sprawia, że prawie niemożliwe jest przywrócenie tych funkcji / zmian, a historia staje się mętna.Znacznie lepszym sposobem radzenia sobie z separacją przy wdrażaniu kodu i wydaniu funkcji są flagi funkcji . Jeśli programiści mogą ukryć swoje funkcje za niektórymi warunkami w samym kodzie, możesz wdrożyć ich kod, ale wyłącz tę funkcję. To osobny temat, ale istnieje wiele informacji na ten temat (w tym pytania i odpowiedzi na temat devops.SE).
źródło
Well @ dan-cornilescu mówi, że dobrze odnosi się do twojego konkretnego problemu, ale bardziej ogólny przypadek rozwoju opartego na bagażniku (wymieniony w Continuous Delivery, Lean Enterprise i The DevOps Handbook) znajduje się tutaj: https://trunkbaseddevelopment.com/
źródło