Miałem do czynienia z problemem skalowania CI w mojej firmie i jednocześnie próbując dowiedzieć się, jakie podejście przyjąć, jeśli chodzi o CI i wiele oddziałów. Podobne pytanie pojawia się przy przepełnieniu stosu, wielu gałęziach funkcji i ciągłej integracji . Zacząłem nowy, ponieważ chciałbym uzyskać więcej dyskusji i przedstawić analizę pytania.
Do tej pory odkryłem, że są 2 główne podejścia, które mogę zastosować (a może inne ???).
- Wiele zestawów zadań (mowa tutaj o Jenkins / Hudson) na oddział
- Napisz narzędzia do zarządzania dodatkowymi zadaniami
- Zbiorcze tworzenie / modyfikowanie / usuwanie ofert pracy
- Ustawienia niestandardowe dla każdego zadania na oddział (adres URL SCM, powielanie repozytoriów zarządzania dep)
- Kilka przykładów osób rozwiązujących ten problem za pomocą narzędzi powłoki, skryptów Ant i interfejsu wiersza polecenia Jenkinsa. Widzieć:
- http://jenkins.361315.n4.nabble.com/Multiple-branches-best-practice-td2306578.html
- http://jenkins.361315.n4.nabble.com/Is-it-possible-to-handle-multiple-branches-where-some-jobs-should-run-on-each-one-without-duplicatin-td954729. html
- http://jenkins.361315.n4.nabble.com/Parallel-development-with-branches-td1013013.html
- Skonfiguruj lub utwórz automatycznie zadanie hudson
- Spowoduje większe obciążenie klastra CI
- Cykl sprzężenia zwrotnego dla programistów zwalnia (jeśli infrastruktura nie może obsłużyć nowego obciążenia)
- Napisz narzędzia do zarządzania dodatkowymi zadaniami
- Wiele zestawów zadań na 2 gałęzie (deweloperskie i stabilne)
- Zarządzaj dwoma zestawami ręcznie (jeśli zmienisz konfigurację zadania, pamiętaj o zmianie w drugiej gałęzi)
- PITA, ale przynajmniej tak mało do zarządzania
- Inne dodatkowe gałęzie nie otrzymają pełnego zestawu testów, zanim zostaną zepchnięte do programowania
- Niezadowoleni twórcy. Dlaczego deweloper miałby przejmować się problemami ze skalowaniem CI. Ma prostą prośbę, kiedy oddziału chcę przetestować mój kod. Prosty.
- Zarządzaj dwoma zestawami ręcznie (jeśli zmienisz konfigurację zadania, pamiętaj o zmianie w drugiej gałęzi)
Wygląda więc na to, że jeśli chcę zapewnić programistom CI dla ich własnych niestandardowych gałęzi, potrzebuję specjalnego narzędzia dla Jenkinsa (API lub skryptów powłoki czy coś takiego?) I obsługiwać skalowanie. Albo mogę im powiedzieć, aby częściej łączyli się z DEV i żyli bez CI w niestandardowych gałęziach. Którą byś wybrał, czy są inne opcje?
źródło
Utworzyłbym osobne zadania dla każdego oddziału. Zrobiłem to już wcześniej i nie jest trudno zarządzać i skonfigurować, jeśli poprawnie skonfigurowałeś Hudson / Jenkins. Szybkim sposobem na utworzenie wielu zadań jest skopiowanie z istniejącego zadania o podobnych wymaganiach i zmodyfikowanie ich w razie potrzeby. Nie jestem pewien, czy chcesz pozwolić każdemu deweloperowi na skonfigurowanie własnych zadań dla własnych oddziałów, ale nie jest to dużo pracy dla jednej osoby (np. Menedżera budowy). Po połączeniu niestandardowych gałęzi w stabilne gałęzie, odpowiednie zadania można usunąć, gdy nie są już potrzebne.
Jeśli martwisz się o obciążenie serwera CI, możesz skonfigurować oddzielne instancje CI lub nawet oddzielne slave'y, aby pomóc zrównoważyć obciążenie na wielu serwerach. Upewnij się, że serwer, na którym uruchamiasz Hudson / Jenkins, jest odpowiedni. Użyłem Apache Tomcat i po prostu musiałem upewnić się, że ma wystarczającą ilość pamięci i mocy obliczeniowej, aby przetworzyć kolejkę kompilacji.
Ważne jest, aby jasno określić, co chcesz osiągnąć za pomocą CI, a następnie wymyślić sposób na jego wdrożenie bez dużego wysiłku ręcznego lub powielania. Nie ma nic złego w korzystaniu z innych zewnętrznych narzędzi lub skryptów wykonywanych przez serwer CI, które pomagają uprościć ogólny proces zarządzania kompilacją.
źródło
Wybrałbym dev + stabilne gałęzie. A jeśli nadal chcesz własnych oddziałów i boi się obciążeniem, to dlaczego nie przenieść te niestandardowe te do chmury i niech programiści zarządzać samodzielnie, np http://cloudbees.com/dev.cb Jest to firma, w której jest teraz Kohsuke . Istnieje również narzędzie Eclipse, więc jeśli korzystasz z Eclipse, będziesz mieć je ściśle zintegrowane z dev env.
źródło
Właściwie to, co jest naprawdę problematyczne, to budowanie izolacji z gałęziami funkcji. W naszej firmie mamy zestaw oddzielnych projektów maven, które są częścią większej dystrybucji. Te projekty są obsługiwane przez różne zespoły, ale dla każdej dystrybucji wszystkie projekty muszą zostać zwolnione. Odgałęzienie funkcji może teraz nakładać się z jednego projektu na inny, a wtedy izolacja kompilacji staje się bolesna. Wypróbowaliśmy kilka rozwiązań:
Właściwie to ostatnie rozwiązanie jest najbardziej obiecujące. Wszystkim innym rozwiązaniom brakuje w ten czy inny sposób. Wraz z wtyczką job-dsl można łatwo skonfigurować nową gałąź funkcji. po prostu skopiuj i wklej świetny skrypt, dostosuj gałęzie i pozwól, aby zadanie seed utworzyło nowe zadania. Upewnij się, że zadanie inicjujące usuwa zadania niezarządzane. Następnie możesz łatwo skalować za pomocą gałęzi funkcji w różnych projektach maven.
Ale jak powiedział wyżej Tom, przyjemniej byłoby przezwyciężyć konieczność rozgałęzień funkcji i nauczyć programistów czystej integracji, ale jest to dłuższy proces, a wynik nie jest jasny w przypadku wielu starszych części systemu, których już nie będziesz dotykać.
moje 2 centy
źródło