Jak pozbyć się gałęzi programowania dla uproszczonego przepływu Git

20

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.
Fabian Schmengler
źródło
4
Wydaje się, że z jednej strony mówisz, że nie potrzebujesz oddziału DEV, ale następnie wyjaśnij, dlaczego tak naprawdę go potrzebujesz. Gałęzie obiektów, które żyją od tygodni, bardzo trudno byłoby połączyć ze sobą po tak długim okresie rozbieżności. Czy na pewno chcesz pozbyć się DEV?
Dave Swersky
@DaveSwersky dobre pytanie! Nie jestem pewien, dlatego pytam tutaj :) O długo żyjących gałęziach fabularnych: trudność scalenia jest problemem, który już istnieje i po prostu zostałby przeniesiony w inne miejsce. A przy regularnym scalaniu z głównej gałęzi jest to wykonalne. Jak byłoby trudniej, gdyby główny oddział był mistrzem?
Fabian Schmengler,
Długowieczne gałęzie zawsze będą wyzwaniem, choć być może raczej wyzwaniem łączącym się z mistrzem niż z oddziałem DEV. Rozwiązaniem tego problemu może być lepsze rozdzielenie pracy, aby oddziały te były krótkotrwałe. Jeśli możesz uniemożliwić oddziałom tematycznym / fabularnym funkcjonowanie dłużej niż 24–48 godzin, lepiej być może, eliminując DEV.
Dave Swersky
1
@FabianSchmengler Jaki jest prawdziwy powód, dla którego chcesz usunąć gałąź programistów? To naprawdę brzmi, jakbyś go potrzebował w przypadkach, gdy rzeczy nie idą zgodnie z planem.
avi
nazwij go master lub develop lub cokolwiek zechcesz, będziesz potrzebował gałęzi integracji, jeśli chcesz mieć prawdziwy CI, lub jeśli delegujesz go do gałęzi funkcji, będzie to tylko ich zewnętrzna integracja z bieżącym wydaniem w izolacji.
ᴳᵁᴵᴰᴼ

Odpowiedzi:

6

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 na master. Prowadzi to do sprzecznych wymagań i problemów, ponieważ zazwyczaj przyszły kod odbiega od obecnego:

  • nowy rozwój destabilizuje produkcyjnych - regresje widoczne po scaleniu developwmaster
  • stabilizacja produkcji spowalnia przyszły rozwój - musisz się ustabilizować, developaby była wystarczająco dobra do połączeniamaster

Upuszczenie developnie pomoże (dużo) - nie eliminujesz problemu, po prostu przenosisz developspecyficzną dla niego część problemu master.

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? :

wprowadź opis zdjęcia tutaj

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:

  • na developbonusie gałąź, jak chciał, wchłoniętemaster
  • masteroddział jest bagażniku, to gdzie rozwój dzieje się bez żadnych ograniczeń prędkości (to nigdy nie połączyła się w produkcji).
  • produkcja jest / są jedną lub więcej releasegałęziami wyciągniętymi z masteretykiety / 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 poprawki master, nigdy nie są łączone z masterinnymi gałęziami
  • poprawki są bezpośrednimi zatwierdzeniami do releaseoddziałów

Jeśli poprawka dotyczy tylko wersji produkcyjnej, ale nie dotyczy master, jest ona bezpośrednio przypisywana do releaseoddziału. Jeśli dotyczy zarówno obu, to zazwyczaj jest przypisane do masterpierwszego, a także do wybrania / podwójnego zaangażowania w releaseoddziale.

Teraz, patrząc na to, co się dzieje master(co jest powyżej punktu, w którym bieżąca releasegałąź jest ściągana), masz 2 opcje:

  • kontynuować m.in. oddziały tak jak robisz dzisiaj, z wyjątkiem oni opierać się master, nie develop. Konwersja ich do poprawek jest nadal możliwa - wystarczy zmienić bazę na odpowiednią releasegałąź zamiastmaster
  • przejść na ciągłą integrację i czerpać z niej korzyści (można to zrobić w dowolnym momencie w przyszłości), w tym w sposób progresywny - stopniowo przyciągać coraz mniej gałęzi funkcji.

Jeśli podoba Ci się to podejście, oto jak się tam dostać z miejsca, w którym jesteś dzisiaj:

  • ustal strategię nazewnictwa wersji:
    • nie możesz mieć oddziału trwającego wydania o tej samej nazwie
    • nie możesz (nie powinieneś) rebaseować lub synchronizować gałęzi wersji produkcyjnej
  • natychmiast wyciągnij releaseXgałąź master, zgodnie z tą strategią nazewnictwa
  • przestańcie wchodzić w zobowiązania develop, wkrótce będą jechać prosto do master.
  • wtopić się developwmaster
  • poinstruuj programistów, aby masterzamiast nich zmienili podstawy swoich obszarów roboczych develop.
  • otwarte masterna zatwierdzenia
  • usuń, developjeśli chcesz (lub pozostaw na stałe zablokowany / tylko do odczytu)
Dan Cornilescu
źródło
Dziękuję za szczegółowe sugestie. Nie jestem jeszcze pewien, czy gałęzie wydawnicze są dobrym pomysłem poza opracowywaniem produktów, ale ponownie je
rozważę
Masz również alternatywę ciągłego wdrażania, która umieszcza programowanie w tym samym miejscu co produkcja (w przeciwieństwie do przepychania go lub wyprzedzania), ale do tego potrzebna jest zmiana kultury (ponieważ oznacza to porzucenie wszystkich gałęzi integracji i funkcji).
Dan Cornilescu
Rozpoznaję ten schemat :)
paul_h
11

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.

Jiri Klouda
źródło
5

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 developgałąź 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 masteri 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ź masterjest już przed nami. W tej gałęzi poprawek prawdopodobnie oznaczono by również niewielkie wydanie i upewnij się, że zmiany zostały scalone master.

Usuwanie scalonych funkcji z wydania jest dość trudne w przypadku git. Najlepszym mechanizmem do tego byłoby użycie git revertprzy 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).

Evgeny
źródło
2

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/

paul_h
źródło