Kolega powiedział mi, że on myśli w tworzeniu naszego serwera CI zobowiązuje do zawróconych że nieudanych kompilacji, więc HEAD
w master
jest zawsze stabilny (jak w zdaniu zbudować co najmniej).
Czy jest to najlepsza praktyka, czy może być bardziej problematyczna niż pozostawienie master
zepsucia, dopóki programista go nie naprawi?
Uważam, że cofnięcie zatwierdzenia skomplikuje zadanie odczytania zatwierdzenia i poprawki (programista będzie musiał cofnąć przywrócenie, a następnie zatwierdzić poprawkę, co również zaśmieci git log
) i powinniśmy po prostu zostawić zatwierdzenie, a następnie zatwierdzić naprawić. Chociaż widzę pewne zalety posiadania master
stabilnego, to przywrócenie błędów nie przekonuje mnie.
edycja: Nie ma znaczenia, czy to jest, master
czy jakakolwiek inna gałąź programistyczna, ale pytanie pozostaje takie samo: czy system CI powinien przywrócić zatwierdzenie, które nie powiodło się w kompilacji?
kolejna (długa) edycja: Ok, używamy git
w dziwny sposób. Uważamy, że koncepcja oddziałów jest sprzeczna z rzeczywistym CI, ponieważ zobowiązanie do oddziału izoluje cię od innych programistów i ich zmian, a także dodaje czasu na konieczność ponownej integracji oddziału i radzenia sobie z możliwymi konfliktami. Jeśli wszyscy zobowiązują się do master
tego, konflikty zostają zredukowane do minimum, a każde zatwierdzenie przechodzi wszystkie testy.
Oczywiście, to zmusza cię do pchania tylko stabilnego (lub psujesz kompilację) i programowania z większą ostrożnością, aby nie zerwać wstecznej kompatybilności lub przełączać funkcje podczas wprowadzania nowych funkcji.
Istnieją pewne kompromisy podczas wykonywania CI w ten lub inny sposób, ale to nie wchodzi w zakres pytania (patrz powiązane pytanie na ten temat). Jeśli wolisz, mogę przeredagować pytanie: mały zespół programistów pracuje razem w gałęzi funkcji. Jeśli jeden programista popełnia coś, co psuje kompilację dla tej gałęzi, czy system CI powinien cofnąć zatwierdzenie, czy nie?
źródło
master
się zaczynać. Do tego służą gałęzie programowania i funkcji. Zmiany te przechodzą następnie w coś w rodzaju gałęzi integracji, w której można przetestować, czy wszystkie nowe funkcje kilku programistów będą ze sobą współpracować i tylko wtedy, gdy zostanie to przetestowane, może przejść w tryb master. Lub przynajmniej jeden z możliwych przepływów pracy.Odpowiedzi:
Byłbym przeciwny robieniu tego z następujących powodów:
Za każdym razem, gdy konfigurujesz zautomatyzowane narzędzie do zmiany kodu w Twoim imieniu , istnieje ryzyko, że popełni błąd, lub że pojawi się sytuacja, w której będziesz go potrzebować, aby przestać wprowadzać zmiany (np. Najnowsza wersja Google Mock miał w tym błąd, więc nie oznacza to awarii Twojego kodu) i musisz zmarnować czas na jego ponowną konfigurację. Ponadto zawsze istnieje niewielkie ryzyko niepowodzenia kompilacji z powodu błędu w systemie kompilacji, a nie błędu w kodzie. Dla mnie CI polega na uzyskaniu pewności, że mój kod jest poprawny; to tylko zmieniłoby to w inne źródło potencjalnych problemów, o które musiałbym się martwić.
Rodzaje błędów, które psują „kompilację”, powinny być głupimi błędami, których naprawienie zajmuje bardzo mało czasu (jak wskazałeś w komentarzu, jest to prawdą dla ciebie). Jeśli bardziej subtelne i skomplikowane błędy regularnie przekształcają się w master, wówczas poprawnym rozwiązaniem nie jest „poprawianie go szybciej”, należy zachować ostrożność podczas przeglądania gałęzi funkcji przed ich scaleniem.
Pozostawienie mistrza niezdatnego do zbudowania na kilka minut, dopóki błąd zostanie naprawiony poprawnie, nikomu nie zaszkodzi. To nie jest tak, że CEO osobiście sprawdzi kod główny i opublikuje kod prosto do klientów w dowolnym przypadkowym momencie (przynajmniej, mam nadzieję, nie bez twojego zaangażowania). W bardzo rzadkich przypadkach, gdy trzeba wydać coś, zanim będzie można naprawić błąd, wówczas można łatwo podjąć decyzję, aby przywrócić ręcznie przed publikacją.
źródło
Najpierw ustalmy warunki.
Osobiście używam terminów Continuous Build i Continuous Integration, aby rozróżnić dwa różne scenariusze:
Ta ostatnia, Continuous Integration, oznacza, że repozytorium, które chroni, jest zawsze zielone 1 : jest zdecydowanie lepsze.
Twoje pytanie naprawdę ma sens tylko w przypadku Continuous Build, więc odpowiem, zakładając, że to Twoja konfiguracja.
1 : Przyczyny środowiskowe mogą również popsuć kompilację, na przykład test z zakodowanym rokiem (2015) może zacząć się nie udać w styczniu 2016 r., Dysk może się zapełnić ... I oczywiście jest plaga niestabilności testy. Wyniosle ignoruję te kwestie tutaj; inaczej nigdzie się nie dostaniemy.
Jeśli masz konfigurację kompilacji ciągłej, możesz rzeczywiście zautomatyzować odwracanie zatwierdzeń, które mogły ją zepsuć, jednak istnieje kilka subtelności.
Zauważ, że z tym systemem, w przypadku niestabilnego testu lub współpracownika często popełniającego bzdury, wiele dobrych popełnień zostanie odwróconych. Twoi współpracownicy będą cię wtedy nienawidzić.
Mam nadzieję, że moja opowieść grozy ujawniła problemy zezwalające na zepsute repozytorium, a teraz zaimplementujesz odpowiedni potok ciągłej integracji, w którym PR nigdy nie jest bezpośrednio wypychany do repozytorium, ale w kolejce do scalenia w kolejce roboczej i zintegrowany pojedynczo ( lub przez roll-upy):
Po próbie obu jest to zdecydowanie lepsze.
źródło
master
do pobrania , a następnie naprawić tę sytuację po niepowodzeniu testów. Wszyscy inni stosują strategię „pesymistyczną”, jak radzisz, i udostępniają tylko kod do pobrania.master
”, co jest idealną rzeczą, którą programiści mogą zrobić chcąc nie chcąc, ale aby to osiągnąć, musisz opóźnić przybycie zatwierdzeń,master
zanim zostaną przetestowane i zaliczyć. Jeśli deweloper chce nie wybieram testowanego lub przetestowanego i nieudanego kodu, który też jest w porządku, a kod jest w tym sensie „dostępny”, po prostu nie o to mi chodzi)To jest problematyczne. Osoba decydująca: „szef HEAD jest zepsuty; cofnę górną zmianę” jest całkowicie inna niż robi to samo system CI.
Oto kilka wad:
Błędy w procesie automatycznego cofania psują repozytorium;
zakłada to, że jeden zestaw zmian (najwyższy) zepsuł kompilację (co jest nierealne)
Opiekunowie będą mieli więcej do zrobienia, aby rozwiązać problem, niż tylko dochodzenie i zatwierdzenie (będą też musieli spojrzeć na odwrotną historię)
To przekonanie (gałęzie vs. CI) jest nieprawidłowe. Zastanów się nad utrzymaniem jednej stabilnej gałęzi, w której zatwierdzasz tylko zestawy testów przetestowane przez jednostkę . Reszta (oddziały funkcji i oddziały lokalne) powinna ponosić odpowiedzialność każdego programisty, a nie w jakikolwiek sposób uwzględniać twoje zasady CI.
W gałęziach funkcji chcesz być odizolowany od innych programistów. Pozwala to na:
wykonać kodowanie eksploracyjne
eksperymentuj z bazą kodu
wykonać częściowe zatwierdzenia (efektywnie zatwierdzić niedziałający kod), aby skonfigurować punkty kopii zapasowej (na wypadek, gdybyś spieprzył), aby stworzyć bardziej sensowną historię zmian (za pomocą komunikatów zatwierdzania), a także wykonać kopię zapasową pracy i całkowicie przejść do czegoś innego (w czas potrzebny na napisanie „git commit && git checkout”)
wykonuj zadania o niskim priorytecie, które zajmują dużo czasu (np. chcesz wykonać refaktoryzację, która zmienia wszystkie 80 klas warstwy danych: zmieniasz dwie dziennie, dopóki nie zmienisz wszystkich z nich, a kod się kompiluje (ale możesz to zrobić bez wpływu na nikogo, dopóki nie możesz dokonać pojedynczego zatwierdzenia).
Nie powinno. Za zatwierdzenie stabilnego kodu w oddziale CI odpowiada osoba odpowiedzialna, a nie zautomatyzowany system.
źródło
Sugerowałbym użycie środowiska Gerrit + Jenkins, aby utrzymać gałąź główną zawsze w dobrej formie. Ludzie przekazują swój nowy kod Gerritowi, który uruchamia zadanie Jenkinsa, aby pobrać tę łatkę, kompilacje, testy i tak dalej. Jeśli inni programiści, tacy jak twoja łatka, i Jenkins pomyślnie wykonają zadanie, Gerrit połączy ten fragment kodu z twoją główną gałęzią.
Jest to podobne środowisko opisane przez @ brian-vandenberg
Oprócz utrzymywania oddziału w dobrej kondycji dodajesz również krok przeglądu kodu, który poprawia jakość kodu i wymianę wiedzy na temat twojego oprogramowania.
[1] Jenkins https://jenkins-ci.org/
[2] Gerrit https://www.gerritcodereview.com/
źródło
CI nigdy nie powinien zmieniać historii zatwierdzania repozytorium.
Prawidłowe rozwiązanie polega na tym, aby żadne zmiany nie były dodawane do gałęzi głównej, jeśli nie zostały przetestowane i zweryfikowane.
Czy pracujesz nad gałęziami funkcji, czy CI działa na nich automatycznie, a jeśli kompilacje nie powiodą się, nie łącz ich w master.
Możesz mieć dodatkową kompilację, która testuje scalanie, jeśli są one istotne, uruchamiając gałąź gałęzi funkcji, a podczas kompilacji scalając master / integrację / cokolwiek z gałęzią lokalną, a następnie uruchamiając testy.
źródło
Używamy Jenkinsa do naszego serwera kompilacji i używamy modelu gatekeeper do wypychania commits - gdzie kombinacja Jenkins i wyzwalaczy zatwierdzania (które zapewniają, że recenzenci wykonali swoją pracę) jest strażnikiem.
Zatwierdzenia są wypychane pośrednio przez curl do Jenkins, gdzie klonuje repozytorium główne, a następnie pobiera zatwierdzenia (s) do scalenia i wykonuje wszystkie wymagane kompilacje (dla Linux / solaris). Jeśli wszystkie kompilacje zakończą się, zatwierdzenie zostanie wypchnięte.
Pozwala to uniknąć wielu, jeśli nie wszystkich, problemów omówionych do tej pory:
Pozwala nam również bezpośrednio egzekwować inne wymagania, takie jak testy jednostkowe zakończone pomyślnie.
źródło
Ile razy otrzymywałeś ten automatyczny e-mail z informacją, że ostatnie zatwierdzenie złamało kompilację? Ile razy to jest złe? Ale teraz musisz sprawdzić, czy to naprawdę ty, czy ktoś inny, kto popełnił kolejny błąd w tym samym czasie. A może było to coś ekologicznego.
Jeśli system nie wie na pewno, to na pewno nie chcę go zautomatyzować.
źródło
Pytanie jest błędne. Szanuję jednak to oświadczenie
„Uważamy, że koncepcja oddziałów jest sprzeczna z rzeczywistym CI, ponieważ zaangażowanie w oddział izoluje cię od innych programistów i ich zmian”
Powinieneś jednak wykonać te kroki
PONADTO to, co robimy, polega na zaczepieniu git, aby KAŻDY faktycznie nie zobowiązał się do opanowania. Działa świetnie .... ŻADNE zepsute wersje nigdy, ani ŻADNE cofanie zobowiązań od mistrza.
później Dean
źródło