Dzisiaj chwilę o Jenkinsie - rozwiązaniu pamiętającym czasy sprzed kontenerów i Kubernetesa. Okazuje się, że budzi to wciąż duże kontrowersje i postanowiłem przypomnieć tutaj jak można tego rozwiązania użyć w nowoczesnym stylu.

Jak czytasz ten newsletter to ja jestem już w drodze na KubeCon EU w Londynie. Jeśli też tam pkanujesz być to zapraszam w czwartek między 13 a 14:30 do pawilionu na poziomie 1 (wejście N8-N9), gdzie będę ze współorganizatorami KCD Warsaw promował naszą konferencję.

Jenkins - a na co to komu?

Ach, Jenkins… Samo wspomnienie tej nazwy potrafi wywołać skrajne emocje w świecie DevOps. Jedni najchętniej widzieliby go już dawno na cyfrowym cmentarzu, a inni bronią go jak niepodległości.
Prawda jest taka, że mimo swojego wieku i pewnych problemach, Jenkins wciąż jest obecny w wielu firmach. I co więcej – może być całkiem pomocnym narzędziem. Kluczem jest jednak odpowiednie zarządzanie nim. Zapomnij jednak o klikaniu w interfejsie i ręcznych aktualizacjach.

Nie da się ukryć, że Jenkins ma swoje lata. Jego potężny ekosystem pluginów to jednocześnie największa siła i największa słabość. Z jednej strony pozwala na ogromną elastyczność, z drugiej – nieumiejętne zarządzanie nimi prowadzi do chaosu, problemów z zależnościami (“plugin dependency hell”) i koszmarów podczas aktualizacji.
Dodajmy do tego często przestarzały interfejs i mamy gotowy przepis na frustrację zespołu. Nic dziwnego, że nowsze, bardziej zintegrowane i często prostsze w zarządzaniu narzędzia jak GitLab CI, GitHub Actions czy Tekton kuszą obietnicą łatwiejszego życia. Ale czy na pewno trzeba od razu wyrzucać Jenkinsa na śmietnik?

5 zasad, które pozwalają ujarzmić Jenkinsa

Jeśli już masz Jenkinsa lub z jakiegoś powodu musisz z niego korzystać, to mam dla Ciebie dobrą wiadomość – da się go okiełznać i sprawić, by działał elastycznie, niezawodnie i wydajnie. Wystarczy trzymać się kilku żelaznych zasad:

1. Uruchamiaj go w kontenerze (najlepiej na Kubernetesie): Zapomnij o instalacji Jenkinsa bezpośrednio na maszynie. Konteneryzacja to absolutna podstawa. Ułatwia zarządzanie wersjami, wdrażanie, skalowanie i zapewnia spójność środowisk. Uruchomienie na Kubernetesie daje dodatkowe korzyści w postaci łatwego zarządzania zasobami i wysokiej dostępności.

2. Aktualizuj pluginy TYLKO przez przebudowę i testowanie nowego obrazu: To jedna z najważniejszych zasad! Koniec z klikaniem “update” w interfejsie i modlitwą, żeby nic się nie zepsuło. Wszelkie zmiany w pluginach (instalacja, aktualizacja, usuwanie) powinny odbywać się przez modyfikację definicji obrazu kontenera, jego przebudowę i przetestowanie przed wdrożeniem na produkcję. Daje to kontrolę, powtarzalność i możliwość łatwego powrotu do poprzedniej wersji.

3. Używaj wielu instancji (sharding): Jeden, wielki Jenkins obsługujący całą firmę to proszenie się o kłopoty. Staje się on wąskim gardłem i pojedynczym punktem awarii (single point of failure). Znacznie lepszym podejściem jest “sharding”, czyli dzielenie Jenkinsa na mniejsze, niezależne instancje dedykowane np. konkretnym zespołom, działom, środowiskom czy projektom. Zmniejsza to “blast radius” (zasięg awarii) i ułatwia zarządzanie.

4. Używaj dynamicznie tworzonych podów jako workerów (przez plugin Kubernetes): Czasy statycznych agentów Jenkinsa (workerów) powinny odejść w zapomnienie. Ciągłe utrzymywanie maszyn, które przez większość czasu stoją bezczynnie, jest nieefektywne i kosztowne. Dzięki pluginowi Kubernetes, Jenkins może dynamicznie tworzyć pody w klastrze K8s na potrzeby konkretnego joba i usuwać je po zakończeniu pracy. To czysta oszczędność zasobów i zawsze świeże środowisko budowania.

5. Zarządzaj jobami, konfiguracją i dostępem WYŁĄCZNIE jako kod (JCasC): Ręczna konfiguracja przez interfejs webowy to źródło problemów z “configuration drift” (rozjeżdżaniem się konfiguracji) i brakiem powtarzalności. Cała konfiguracja Jenkinsa – od ustawień systemowych, przez joby (np. Pipeline as Code), po zarządzanie uprawnieniami – powinna być zdefiniowana w kodzie i przechowywana w repozytorium Git. Narzędzie takie jak JCasC (Jenkins Configuration as Code) jest tutaj nieocenione. To umożliwia wersjonowanie, audytowanie, automatyzację i stosowanie praktyk GitOps.

Może to brzmi jak dużo pracy, ale zapewniam Was – gra jest warta świeczki. Sam widziałem (i pomagałem wdrażać) takie konfiguracje w wielu firmach. Jenkins zarządzany zgodnie z tymi zasadami staje się dojrzałym, niezawodnym i wciąż bardzo potężnym elementem platformy do dostarczania oprogramowania.
Jasne, może nie jest tak “sexy” jak najnowsze narzędzia, ale potrafi dobrze wykonywać swoją pracę.

Jeśli jednak wolisz coś nowoczesnego…

… to sprawdź mój kurs GitLab CI. Specjalnie dla tych co nie lubią się z Jenkinsem przygotowałem kod zniżkowy JENKINS_IS_DEAD, który włącza rabat -100pln.
⏰ Ważne tylko do końca tygodnia (do niedzieli 6 kwietnia)!