Przepraszam za ten długi post, ale myślę, że warto.
Właśnie zacząłem od małego sklepu .NET, który działa zupełnie inaczej niż w innych miejscach, w których pracowałem. W przeciwieństwie do którejkolwiek z moich poprzednich pozycji, oprogramowanie tutaj napisane jest skierowane do wielu klientów i nie każdy klient otrzymuje jednocześnie najnowszą wersję oprogramowania. W związku z tym nie ma „aktualnej wersji produkcyjnej”. Gdy klient otrzymuje aktualizację, otrzymuje także wszystkie funkcje dodane do oprogramowania od czasu ostatniej aktualizacji, która może być dawno temu. Oprogramowanie jest wysoce konfigurowalne, a funkcje można włączać i wyłączać: tak zwane „przełączanie funkcji”. Cykle wydań są tutaj bardzo napięte, w rzeczywistości nie odbywają się zgodnie z harmonogramem: po zakończeniu funkcji oprogramowanie zostaje wdrożone u odpowiedniego klienta.
Zespół dopiero w zeszłym roku przeniósł się z Visual Source Safe do Team Foundation Server. Problem polega na tym, że nadal używają TFS tak, jakby to był VSS i wymuszają blokady Checkout w pojedynczej gałęzi kodu. Ilekroć pojawia się poprawka błędu w terenie (nawet dla jednego klienta), po prostu budują wszystko, co jest w TFS, testuj błąd został naprawiony i wdrażaj go u klienta! (Sam pochodzący z branży oprogramowania farmaceutycznego i urządzeń medycznych jest to niewiarygodne!). Rezultat jest taki, że w połowie upieczony kod deweloperski zostaje wprowadzony do produkcji nawet bez testowania. Błędy zawsze pojawiają się w kompilacjach wersji, ale często klient, który właśnie otrzymał kompilację, nie zobaczy tych błędów, jeśli nie skorzystają z funkcji, w której jest błąd. Dyrektor wie, że to problem, ponieważ firma zaczyna się rozwijać nagle kilku dużych klientów przybywa na pokład i mniejszych.
Poproszono mnie o przyjrzenie się opcjom kontroli źródła, aby wyeliminować wdrażanie błędnego lub niedokończonego kodu, ale nie poświęcać nieco asynchronicznej natury wydań zespołów. W swojej karierze korzystałem z VSS, TFS, SVN i Bazaar, ale to właśnie tam większość mojego doświadczenia dotyczyła TFS.
Wcześniej większość zespołów, z którymi współpracowałem, używa dwu- lub trzygałęziowego rozwiązania Dev-Test-Prod, gdzie przez miesiąc programiści pracują bezpośrednio w Dev, a następnie zmiany są łączone w Test, a następnie Prod, lub promowane „kiedy to zrobione”, a nie na stały cykl. Zastosowano zautomatyzowane kompilacje, korzystając z tempomatu lub kompilacji zespołu. W mojej poprzedniej pracy bazar był używany na szczycie SVN: deweloperzy pracowali we własnych małych gałęziach funkcji, a następnie wypchnęli swoje zmiany do SVN (powiązanego z TeamCity). Było to miłe, ponieważ łatwo było izolować zmiany i dzielić się nimi z gałęziami innych ludzi.
W obu tych modelach istniała centralna gałąź programisty i prod (a czasem testowa), przez którą przepchnięto kod (a etykiety zostały oznaczone do oznaczenia kompilacji w prod, z których zostały wydane wydania ... i zostały one przekształcone w gałęzie dla poprawek błędów do wydań i połączyło się z powrotem w dev). Jednak tak naprawdę nie pasuje to do sposobu pracy: nie ma kolejności, kiedy różne funkcje zostaną wydane, zostaną one wypchnięte, gdy są kompletne.
W przypadku tego wymogu podejście polegające na „ciągłej integracji”, jak widzę, się załamuje. Aby wydobyć nową funkcję z ciągłą integracją, należy ją wypchnąć za pośrednictwem narzędzia deweloperskiego, które uchwyci wszelkie niedokończone prace w deweloperach.
Myślę, że aby temu zaradzić, powinniśmy przejść do mocno rozgałęzionego modelu bez ŻADNYCH gałęzi deweloperów, raczej źródło powinno istnieć jako seria gałęzi cech, które po zakończeniu prac programistycznych są zablokowane, przetestowane, naprawione, zablokowane , przetestowane, a następnie wydane. Inne gałęzie cech mogą pobierać zmiany z innych gałęzi, kiedy ich potrzebują / chcą, więc ostatecznie wszystkie zmiany zostaną wchłonięte przez wszystkich innych. To bardzo pasuje do czystego modelu Bazar z tego, czego doświadczyłem podczas mojej ostatniej pracy.
Choć brzmi to elastycznie, wydaje się dziwne, że nie ma gdzieś gałęzi dewelopera lub prowokatora, i martwię się o gałęzie, które nie chcą się ponownie zintegrować, lub że dokonano drobnych późnych zmian, które nigdy nie zostaną przeniesione do innych gałęzi i deweloperzy narzekają na scal katastrofy ...
Co o tym myślą ludzie?
Drugie ostatnie pytanie: jestem nieco zdezorientowany co do dokładnej definicji rozproszonej kontroli źródła: niektórzy zdają się sugerować, że chodzi tu tylko o brak centralnego repozytorium, takiego jak TFS lub SVN, niektórzy twierdzą, że chodzi o odłączenie (SVN jest odłączony w 90% a TFS ma doskonale funkcjonalny tryb offline), a inni twierdzą, że chodzi o rozgałęzianie funkcji i łatwość łączenia oddziałów bez relacji rodzic-dziecko (TFS ma również bezpodstawne scalanie!). Być może jest to drugie pytanie!