Manualne ustawianie klastrów Jenkins

Jeśli chciałbyś przyspieszyć proces – przejdź do wersji zautomatyzowanej »

Jenkins to jedno z najczęściej używanych narzędzi do Ciągłej Integracji (Continuous Integration) służący do zautomatyzowania procesów budowania. Dzięki swojej zdolności zarządzania dużą liczbą węzłów, zwanymi Slaves, oraz przy pomocy wyzwalaczy (executor), można wykonać wielorakie zadania związane z budowaniem i wdrażaniem projektu. Każdy z wyzwalaczy (executor) wykonuje zadania w aplikacji Jenkins, odciążając jego serwery z wykonywania wszystkich czynności.

Możliwości Jenkins nie powinny być jednak ograniczane przez sprzęt, na którym pracuje, ani systemem operacyjnym, ani też lokalizacją, w której mają być wykonane wszystkie zadania. W ten sposób urządzenia podległe (slaves) Jenkinsa mogą wykonać tę pracę na innych urządzeniach, w innych sieciach (o ile owe urządzenia mogą łączyć się z HTTP), w innych systemach operacyjnych, np. Windows czy Solaris, oraz na innych, bardziej wydajnych sprzętach. Na przykład, możemy skompilować aplikację w C++ na Solaris 9 z kilkoma innymi aplikacjami na Java 8 używając Jenkinsa. Jako że nie ma dystrybutorów Java 8 dla Solaris 9, ustawianie urządzenia podległego (slave) było kluczowe w wykonaniu powyższego zadania.

Co prawda istnieje sugerowany sposób konfigurowania slave’ów dla Jenkinsa, podatny jest on jednak na występowanie błędów, a parokrotne wykonywanie tych samych zadań jest żmudne. Dlatego też skorzystamy z instalacji Jenkins z wtyczką Jenkins Swarm, która pozwala urządzeniom zależnym (slave) na tworzenie klastrów poprzez automatyczne wykrywanie urządzenia nadrzędnego (master) oraz ich samodzielnego rejestrowania się w nim. Do wersji demonstracyjnej użyjemy również Dockera na platformie chmurowej UniCoud.

Docker to parawirtualne rozwiązanie dla Linux’a służące do uruchomienia rozproszonych aplikacji. Ze względu na sukces jaki odniósł Docker, stał się on “de facto” standardowym oprogramowaniem branży, dysponującym kilkunastoma obrazami przygotowanymi przez społeczność i przechowywanymi w jego rejestrach. Z tego powodu paru dostawców wdrożyło rozwiązania Docker do swoich produktów, w tym również Jelastic. W tej wersji testowej, zobaczysz niektóre z obrazów Docker z Jenkins Swarm i Jenkins Swarm slaves.

UniCloud jest chmurą PaaS, która używa kontenerowy i można w niej uruchomić kontenery Docker. W artykule, przy pomocy panelu UniCloud, uruchomimy urządzenia nadrzędne (master) Jenkins oraz dwa urządzenia podległe (slaves). Osobom, które nie chcą wykonywać całej pracy ręcznie, bądź to z powodu liczby powtórzeń, bądź też ze względu na żmudność pracy, przedstawiamy poniżej sposób, w jaki można stworzyć środowisko Jenkins z urządzeniami podległymi (slave) importując pliki JSON bezpośrednio w panelu.

Obrazy dla Docker

Do wersji demo w tym artykule użyjemy paru (zindywidualizowanych) obrazów Doker. Na początku, użyjemy obrazu Docker jelastic/jenkins-swarm, żeby dostosować oficjalny obraz Jenkins Docker do zainstalowanej wtyczki Jenkins Swarm. Użyjemy również szablonu Docker jelastic/jenkins-swarm-slave z modyfikowaną wersją szablonu csanchez/jenkins-swarm-slave, stworzoną przez Carlosa Sancheza, ustawiając parametry przekazane do swarm-client w skrypcie jenkins-slave.sh. oraz ustawiając funkcje start i stop, która będzie wywoływana za pomocą skryptów start i stop, użytych jako argumenty.

Ręczne ustawianie klastrów Jenkins

Ręczne ustawianie klastrów Jenkins jest naprawdę żmudnym zajęciem, jednak panel UniCloud jest bardzo praktyczny w ustawianiu środowiska. Klastry Jenskins ustawiamy wykonując proste kroki przedstawione poniżej:

  1. Kliknij Nowe Środowisko, znajdujące się w lewym górnym rogu panelu UniCloud i otwórz zakładkę Docker.
    docker
  2. Następnie kliknij Wybierz kontener i w polu „Docker Hub:”wyszukaj jelastic/jenkins-swarm.jenkins-swarm
  3. Wybierz znaleziony obraz, kliknij button z plusem w lewym dolnym rogu okienka (po kliknięciu pojawi się button z napisem „Extra”) i wybierz obraz jelastic/jenkins-swarm-slave (jak na rysunku poniżej).jenkins-swarm-slave
  4. Po przejściu Dalej, kliknij Linki w sekcji Konfiguracja i połącz kontenery urządzeń podrzędnych Jenkins (slave) do urządzeń nadrzędnych (master).
    docker
  5. Aby połączyć kontener, naciśnij Dodaj i ustaw alias dla jenkins. Następnie naciśnij Zapisz i Zastosuj.
    kontener-jenkins
  6. W tej wersji demo możesz użyć tylko jednego węzła dla każdego obrazu Docker oraz domyślną liczbę cloudlet’ów. Nazwij stworzone środowisko i kliknij Utwórz.
    jenkins-cluster

Klaster Jenkins będzie konfigurowany i gotowy w ciągu paru minut. Możesz się do niego dostać klikając Otwórz przeglądarkę w zbiorze grupy kontenerów z ciągami węzłów Jenksins.

jenkins-swarm


Wersja zautomatyzowana instalacji

W poprzedniej części pojawiło się wiele elementów, które mogą zostać zautomatyzowane. Na platformie UniCloud można pobrać definicję środowisk z plików JSON. Aby to zrobić, należy wykonać trzy kroki:

  1. Na przycisku Nowe środowisko kliknij na strzałkę w dół i wybierz Import.
    import-unicloud
  2. Następnie przejdź do zakładki URL, dodaj poniższy URL i naciśnij Import https://raw.githubusercontent.com/jelastic-jps/jelastic-jenkins-cluster/master/jenkins-cluster.json
    Import-jenkins-cluster
  3. Podaj nazwę środowiska i kliknij Zainstaluj. Bez najmniejszego wysiłku!instalacja-jenkins

Po załadowaniu plików JSON, możesz sprawdzić status węzłów, klikając Otwórz Przeglądarkę.

jenkins-powitanie

Czas użyć Jenkins z urządzeniami podległymi (slaves), skonfigurowanymi bez potrzeby użycia niejasnych poleceń, tajemniczych procedur konfiguracyjnych i bez tworzenia ustawień, które mogą zawierać błędy. Dzięki UniCloud, można wybrać dogodną formę wdrożenia, ręczną lub automatyczną.
Repozytoria GitHub:
https://github.com/jelastic-jps/jenkins-swarm
https://github.com/jelastic-jps/jenkins-swarm-slave-docker
https://github.com/carlossg/jenkins-swarm-slave-docker
https://github.com/jelastic-jps/jelastic-jenkins-cluster

Spróbuj teraz stworzyć swoje własne środowisko Jenkins wykorzystując kontenery Docker i przekonaj się sam, jakie to proste!