Zaczynamy napotykać problem, gdy stajemy się coraz więksi, gdy funkcje przechodzą do testowania, ale zanim wszystko zostanie przetestowane i zatwierdzone nowe funkcje będą testowane.
Tworzy to środowisko, w którym prawie nigdy nie możemy naciskać na produkcję, ponieważ mamy połączenie przetestowanych i niesprawdzonych funkcji. Jestem pewien, że jest to częsty problem, ale nie znalazłem jeszcze żadnych dobrych zasobów dla nas.
Niektóre szczegóły:
- GIT na BitBucket
- Jenkins do wdrożenia skryptowego na platformie Azure
Mam nadzieję na sposób na wyodrębnienie funkcji, gdy poruszają się one w różnych środowiskach i wypychają tylko to, co jest gotowe.
Odpowiedzi:
Wygląda na to, że masz tutaj kilka problemów:
1. Identyfikowanie funkcji dla konkretnego wydania
Jest to kwestia zarządzania projektem i kwestia koordynacji. Czy ta funkcja zostanie wydana przed, w tym samym czasie lub po tej innej funkcji? Jeśli wydania mają się pojawiać po jednej funkcji na raz, należy to zidentyfikować. Jeśli funkcje będą grupowane w wydaniach, a następnie dowiedzieć się, jakie grupy są i egzekwować je deweloperów i decydentów. Użyj systemu śledzenia problemów lub systemu biletowego, aby oznaczyć wydania. Wyjaśnij, że jeśli jedna funkcja określonego wydania jest nie do przyjęcia, to wszystkie są.
2. Strategie rozgałęziania
Git-flow jest łatwą odpowiedzią na takie problemy i często ludzie używają wariantu git-flow, nawet jeśli nie wiedzą, co to jest. Nie powiem, że to wszystko dla wszystkich problemów, ale bardzo pomaga.
Wygląda na to, że napotykasz problem z niedeterministycznymi strategiami wydawania, w których funkcje są zatwierdzone jako rozproszone, a coś, co zaczęło się rozwijać dawno temu, może zostać wydane po czymś, co zaczęło się ostatnio - funkcjach skokowych.
Długotrwałe gałęzie funkcji lub gałęzie z jednoczesnym wydaniem są prawdopodobnie najlepszą odpowiedzią na tego rodzaju problemy. Scal (lub rebase, jeśli czujesz się z tym komfortowo) najnowsze od mistrza do długoterminowych oddziałów. Uważaj, aby scalić tylko funkcje, które są już aktywne, w przeciwnym razie napotkasz problemy, które masz teraz (zbyt wiele pomieszanych funkcji w jednym oddziale).
Istotną częścią tego procesu są gałęzie „poprawki” lub „poprawki błędów”; używaj ich do małych jednorazowych poprawek, które mają krótki cykl kontroli jakości.
Z twojego opisu może być nawet lepiej nie utrzymywać oficjalnej gałęzi „rozwoju”. Zamiast tego należy rozgałęzić wszystkie funkcje z poziomu głównego i utworzyć połączone wersje wydań po zidentyfikowaniu wydania.
3. Środowiska
Nie dopasowuj gałęzi git do swoich środowisk, z wyjątkiem produkcji == master. Oddział „rozwoju” należy uznać za zepsuty. Rozgałęzienia wersji są wypychane w celu przetestowania środowisk, niezależnie od tego, czy jest to środowisko kontroli jakości czy środowisko przejściowe. W razie potrzeby wypchnij określoną gałąź funkcji do środowiska.
Jeśli masz więcej niż jedną gałąź funkcji, które muszą zostać wydane osobno, ale są testowane w tym samym czasie ..... ¯ \ _ (¯) _ / ¯ .... podkręcić inny serwer? Być może połączymy je razem w gałąź odrzucania ... zatwierdzaj poprawki / zmiany w oryginalnych gałęziach i ponownie scalaj w gałąź odrzucania; dokonać ostatecznego zatwierdzenia i UAT w poszczególnych oddziałach wydania.
4. Usuwanie niezatwierdzonych funkcji z oddziału
Właśnie tego starają się unikać powyższe myśli, ponieważ jest to bez wątpienia najbardziej bolesna rzecz do zrobienia. Jeśli masz szczęście, funkcje zostały scalone z Twoimi programistami lub przetestuj gałęzie atomowo za pomocą zatwierdzeń scalania. Jeśli masz pecha, deweloperzy zaangażowali się bezpośrednio w dział rozwoju / testowania.
Tak czy inaczej, jeśli przygotowujesz się do wydania i masz niezatwierdzone zmiany, musisz użyć Git, aby wycofać te niezatwierdzone zatwierdzenia z gałęzi wydania; najlepszym pomysłem jest zrobienie tego przed przetestowaniem wydania.
Powodzenia.
źródło
Oto pomysł: Przestań używać gałęzi wydania. Zamiast tego zacznij budować przełączniki funkcji i zarządzaj nimi poprzez konfigurację. W ten sposób zawsze łączysz gałęzie funkcji w master i nigdy nie powinno być pytania o to, która wersja jest testowana lub produkowana. Jeśli masz pytanie o to, jakie funkcje / implementacje są aktywne w środowisku, po prostu sprawdź plik konfiguracyjny.
źródło
Powinna to być prosta kwestia koordynacji między testem a produkcją. Jeśli używasz gałęzi funkcji w Git, po prostu przestań wypychać ukończone gałęzie funkcji do Testowania podczas cyklu testowania i wznawiaj po zakończeniu testowania.
Jeśli potrzebujesz lepszej kontroli, rozdziel Test na serwer programistyczny i serwer Testów Akceptacyjnych i koordynuj te gałęzie, które zostaną przekazane na serwer Testów Akceptacyjnych z zespołem testującym. Ktoś może wtedy być odpowiedzialny za rozpoczęcie ostatecznego wdrożenia od testu akceptacyjnego do produkcji.
źródło
Praca się piętrzy
Jest to uniwersalny problem z mojego doświadczenia. Adresuję to za pomocą:
źródło
Gałęzie
Potrzebujesz kilku oddziałów, aby kontrolować ten proces:
1234-user-crud
,1235-bug-delete-catalog
itp Zidentyfikuj swoje rewizje z liczbą zadań zbyt, to będzie Ci dużo, gdy masz problemy w scala (trzeba będzie).release
oddziału.Zobacz przepływ git:
Środowiska
Bardzo prosty:
Programiści pracują na jego komputerze, każdy korzysta z własnej bazy danych. Jeśli nie jest to możliwe, każdy programista ma indywidualną bazę danych (z powodu licencji, wielkości bazy danych itp.), Będziesz mieć wiele problemów z udostępnianiem bazy danych między programistami: kiedy ktoś usunie kolumnę lub tabelę w swojej gałęzi, inni gałęzie nadal liczą się z tą kolumną / tabelą w bazie danych.
Problemy
Największym problemem w tym procesie są fuzje.
Musisz przerobić te same połączenia w
test
irelease
. Będzie to bolesne, jeśli w kodzie zostaną wykonane pewne dobre refaktory, takie jak usunięcie klasy, przeniesienie / zmiana nazwy itp. Ponieważ nie można uzyskać kodu z gałęzitest
(lubrelease
) do gałęzi funkcji, zatwierdzenia scalania można rozwiązać tylko wtest
(arelease
). W rezultacie rozwiązujesz te same konflikty w dwóch różnych gałęziach, prawdopodobnie produkując inny kod w każdym połączeniu, a w przyszłości odkryjesz, że zespół testowy będzie musiał przetestować funkcje dwa razy: w oddziałachtest
irelease
, ponieważ każde połączenie może powodować różne błędy.Kolejnym problemem jest
test
oddział.master
Od czasu do czasu trzeba będzie „poddać recyklingowi” tę gałąź (usuwać i tworzyć nową ), ponieważ niektóre stare gałęzie (lub stare scalenia, scalone gałęzie, które zostały usunięte) mogą powodować wiele problemów dla nowego kodu, znacznie odbiegając od tego, co jest w środkumaster
. W tym momencie potrzebujesz kontroli nad tym, jakie gałęzie chcesz scalić ponownie wtest
.Naprawdę najlepszym rozwiązaniem jest to, że zespół biznesowy wie, co należy dostarczyć w następnej wersji, a wszyscy pracują w unikalnym oddziale (rozwój oddziału). To dla nich dobra możliwość wyboru funkcji „zrobione”, którą chcieliby być w następnej wersji, kiedy tylko chcą (myślę, że to twój scenariusz), ale jest to koszmar dla programistów i (uważam) dla zespół testowy.
źródło
Wygląda na to są scalanie zmian z oddziału integracyjnego w swoim oddziale produkcyjnym, które IMHO nie jest to dobra praktyka, właśnie z powodów można wymienić. Gdy tylko gałąź produkcyjna dla określonej wersji zostanie pobrana z głównej gałęzi integracji, gałąź integracji może w dowolnym momencie się rozejść (w końcu ma ewoluować do następnej wersji). Scalenie z gałęzi integracji do gałęzi bieżącej wersji może spowodować zmiany niezgodne z tą wersją.
IMHO właściwym procesem byłoby:
źródło
Osobiście wydaje się, że może to być bardziej problem z procesem niż problem z narzędziami. Kilka rzeczy, które zasugeruję tutaj:
Szczerze mówiąc, myślę, że największą rzeczą będzie dyscyplina podczas dostarczania i liczby zadań, które możesz faktycznie ukończyć w danym czasie.
Podsumowując: dostarczaj do kontroli jakości dopiero po zakończeniu testowania i dostarczania starych funkcji.
źródło
Kiedy „wszystko jest testowane i zatwierdzane”, wdrażaj to, co zostało przetestowane i zatwierdzone do produkcji. To może być konkretny zatwierdzenie lub konkretny artefakt kompilacji wygenerowany przez Jenkinsa.
Nie powinno mieć znaczenia, że później zatwierdzenia dla tej samej gałęzi nie są jeszcze testowane.
źródło