Co to jest Jenkins? Serwer CI wyjaśnił

Jenkins oferuje prosty sposób na skonfigurowanie środowiska ciągłej integracji lub ciągłego dostarczania (CI / CD) dla prawie dowolnej kombinacji języków i repozytoriów kodu źródłowego przy użyciu potoków, a także automatyzację innych rutynowych zadań programistycznych. Chociaż Jenkins nie eliminuje potrzeby tworzenia skryptów dla poszczególnych kroków, zapewnia szybszy i bardziej niezawodny sposób integracji całego łańcucha narzędzi do kompilacji, testowania i wdrażania, niż można łatwo zbudować samodzielnie.

„Nie przerywaj nocnej kompilacji!” to główna zasada obowiązująca w sklepach tworzących oprogramowanie, które codziennie rano publikują świeżo utworzoną wersję produktu dla swoich testerów. Przed Jenkinsem programista mógł zrobić, aby uniknąć zepsucia nocnej kompilacji, dokładnie skompilować i przetestować na lokalnej maszynie przed zatwierdzeniem kodu. Ale to oznaczało testowanie zmian w izolacji, bez codziennych zobowiązań innych osób. Nie było żadnej pewności, że nocna konstrukcja przetrwa nasze zobowiązanie.

Jenkins - pierwotnie Hudson - był bezpośrednią odpowiedzią na to ograniczenie.

Hudson i Jenkins

W 2004 roku Kohsuke Kawaguchi był programistą Java w firmie Sun. Kawaguchi był zmęczony łamaniem kompilacji w swojej pracy programistycznej i chciał znaleźć sposób, aby wiedzieć, przed wysłaniem kodu do repozytorium, czy kod będzie działał. Kawaguchi zbudował więc serwer automatyzacji w Javie i dla niej, aby to umożliwić, o nazwie Hudson. Hudson stał się popularny w firmie Sun i rozprzestrzenił się na inne firmy jako oprogramowanie typu open source.

Przenieśmy się do 2011 r., A spór między Oracle (która przejęła Sun) a niezależną społecznością Hudson open source doprowadził do rozwidlenia ze zmianą nazwy, Jenkins. W 2014 roku Kawaguchi został CTO w CloudBees, która oferuje produkty oparte na ciągłej dostawie Jenkins.

Oba widelce nadal istniały, chociaż Jenkins był znacznie bardziej aktywny. Dziś projekt Jenkins jest nadal aktywny. Strona internetowa Hudson została zamknięta 31 stycznia 2020 r.

W marcu 2019 Linux Foundation wraz z CloudBees, Google i wieloma innymi firmami uruchomiła nową fundację oprogramowania open source o nazwie Continuous Delivery Foundation (CDF). Współtwórcy Jenkinsa zdecydowali, że ich projekt powinien dołączyć do tej nowej fundacji. Kawaguchi napisał wtedy, że nic istotnego dla użytkowników nie zmieni się.

W styczniu 2020 roku Kawaguchi ogłosił, że przenosi się do swojego nowego startupu, Launchable. Powiedział również, że oficjalnie wycofa się z Jenkins, chociaż pozostanie w Komitecie Nadzoru Technicznego Fundacji Ciągłego Dostarczania i zmieni swoją rolę w CloudBees na doradcę.

Powiązane wideo: Jak szybciej dostarczać kod dzięki CI / CD

Automatyzacja Jenkins

Dziś Jenkins jest wiodącym serwerem automatyzacji typu open source z około 1600 wtyczkami obsługującymi automatyzację wszelkiego rodzaju zadań programistycznych. Problem, który Kawaguchi początkowo próbował rozwiązać, ciągła integracja i ciągłe dostarczanie kodu Java (tj. Budowanie projektów, uruchamianie testów, wykonywanie statycznej analizy kodu i wdrażanie) to tylko jeden z wielu procesów automatyzowanych za pomocą Jenkinsa. Te 1600 wtyczek obejmuje pięć obszarów: platformy, interfejs użytkownika, administrację, zarządzanie kodem źródłowym i najczęściej zarządzanie kompilacją.

Jak działa Jenkins

Jenkins jest dystrybuowany jako archiwum WAR i jako pakiety instalacyjne dla głównych systemów operacyjnych, jako pakiet Homebrew, jako obraz Dockera i jako kod źródłowy. Kod źródłowy to głównie Java, z kilkoma plikami Groovy, Ruby i Antlr.

Możesz uruchomić Jenkins WAR samodzielnie lub jako serwlet na serwerze aplikacji Java, takim jak Tomcat. W obu przypadkach tworzy internetowy interfejs użytkownika i akceptuje wywołania swojego REST API.

Kiedy uruchamiasz Jenkins po raz pierwszy, tworzy on użytkownika administracyjnego z długim losowym hasłem, które możesz wkleić na jego początkowej stronie internetowej, aby odblokować instalację.

Wtyczki Jenkins

Po zainstalowaniu Jenkins umożliwia zaakceptowanie domyślnej listy wtyczek lub wybranie własnych wtyczek.

Po wybraniu początkowego zestawu wtyczek kliknij przycisk Instaluj, a Jenkins je doda.

Główny ekran Jenkins wyświetla bieżącą kolejkę kompilacji i status wykonawcy oraz oferuje łącza do tworzenia nowych elementów (zadań), zarządzania użytkownikami, przeglądania historii kompilacji, zarządzania Jenkins, przeglądania niestandardowych widoków i zarządzania poświadczeniami.

Nowy element Jenkins może być dowolnym z sześciu typów zadań oraz folderem do organizowania elementów.

Na stronie Manage Jenkins można zrobić 18 rzeczy, w tym opcję otwarcia interfejsu wiersza polecenia. W tym miejscu powinniśmy jednak przyjrzeć się potokom, które są ulepszonymi przepływami pracy, które są zwykle definiowane przez skrypty.

Rurociągi Jenkins

Po skonfigurowaniu Jenkinsa nadszedł czas, aby utworzyć projekty, które Jenkins może dla Ciebie zbudować. Podczas gdy można użyć interfejsu WWW do tworzenia skryptów, obecny najlepszym rozwiązaniem jest stworzenie skryptu rurociąg, nazwany Jenkinsfile , i sprawdzić go w repozytorium. Poniższy zrzut ekranu przedstawia internetowy formularz konfiguracji potoku wielobranżowego.

Jak widać, źródłami gałęzi dla tego rodzaju potoku w mojej podstawowej instalacji Jenkinsa mogą być repozytoria Git lub Subversion, w tym GitHub. Jeśli potrzebujesz innego rodzaju repozytoriów lub różnych usług repozytoriów online, wystarczy dodać odpowiednie wtyczki i ponownie uruchomić Jenkins. Próbowałem, ale nie mogłem wymyślić systemu zarządzania kodem źródłowym (SCM), który nie ma jeszcze wymienionej wtyczki Jenkins.

Potoki Jenkins mogą być deklaratywne lub skryptowe. Deklaratywne rurociąg, prostsze z dwóch, używa Groovy kompatybilne składni i jeśli chcesz, możesz uruchomić plik z #!groovypodkreślić edytor kodu w odpowiednim kierunku. Deklaratywny potok zaczyna się od pipelinebloku, definiuje agenti definiuje, stagesktóry zawiera plik wykonywalny steps, jak w poniższym trzystopniowym przykładzie.

pipeline {

    agent dowolny

    etapy {

        stage ('Build') {

            kroki {

                echo „Budynek…”

            }

        }

        stage („Test”) {

            kroki {

                echo „Testowanie…”

            }

        }

        stage ('Deploy') {

            kroki {

                echo „Wdrażanie…”

            }

        }

    }

}

pipelinejest obowiązkowym blokiem zewnętrznym do wywołania wtyczki potoku Jenkins. agentokreśla, gdzie chcesz uruchomić potok. anymówi, aby użyć dowolnego dostępnego agenta do uruchomienia potoku lub sceny. Bardziej konkretny agent może zadeklarować kontener do użycia, na przykład:

agent {

    docker {

        obraz „maven: 3-alpejski”

        etykieta „moja-zdefiniowana-etykieta”

        args '-v / tmp: / tmp'

    }

}

stageszawierają sekwencję co najmniej jednej dyrektywy etapu. W powyższym przykładzie trzy etapy to Kompilacja, Testowanie i Wdrażanie.

stepswykonać właściwą pracę. W powyższym przykładzie kroki to tylko wydrukowane wiadomości. Bardziej przydatny krok kompilacji może wyglądać następująco:

pipeline {

    agent dowolny

    etapy {

        stage ('Build') {

            kroki {

                sh 'make'

                archiveArtifacts artefacts: „** / target / *. jar”, ​​odcisk palca: true

            }

        }

    }

}

Tutaj wywołujemy makez powłoki, a następnie archiwizujemy wszystkie utworzone pliki JAR do archiwum Jenkins.

postSekcja określa czynności, które zostaną uruchomione pod koniec biegu rurociągu lub etapu. Można użyć liczby bloków post-condition w sekcji postu: always, changed, failure, success, unstable, i aborted.

Na przykład plik Jenkinsfile poniżej zawsze uruchamia JUnit po etapie testowania, ale wysyła wiadomość e-mail tylko wtedy, gdy potok nie powiedzie się.

pipeline {

    agent dowolny

    etapy {

        stage („Test”) {

            kroki {

                sh 'make check'

            }

        }

    }

    Poczta {

        zawsze {

            junit '** / target / *. xml'

        }

        niepowodzenie {

            mail to: [email protected], temat: „Potok nie powiódł się :(”

        }

    }

}

Deklaratywny potok może wyrazić większość tego, co jest potrzebne do zdefiniowania potoków i jest znacznie łatwiejszy do nauczenia niż skrypty składni potoku, czyli DSL oparty na Groovy. Potok skryptowy jest w rzeczywistości pełnym środowiskiem programistycznym.

Dla porównania następujące dwa pliki Jenkins są całkowicie równoważne.

Deklaratywny potok

pipeline {

    agent {docker 'node: 6.3'}

    etapy {

        stage ('build') {

            kroki {

                sh 'npm - wersja'

            }

        }

    }

Potok oparty na skryptach

node ('docker') {

    checkout scm

    stage ('Build') {

        docker.image ('node: 6.3'). inside {

            sh 'npm - wersja'

        }

    }

}

Blue Ocean, graficzny interfejs użytkownika Jenkins

Jeśli chcesz mieć najnowszy i najlepszy interfejs użytkownika Jenkins, możesz skorzystać z wtyczki Blue Ocean, która zapewnia graficzne wrażenia użytkownika. Możesz dodać wtyczkę Blue Ocean do istniejącej instalacji Jenkins lub uruchomić kontener Jenkins / Blue Ocean Docker. Po zainstalowaniu Blue Ocean menu główne Jenkinsa będzie miało dodatkową ikonę:

Jeśli chcesz, możesz bezpośrednio otworzyć Blue Ocean. Znajduje się w folderze / blue na serwerze Jenkins. Tworzenie rurociągów w Blue Ocean jest nieco bardziej graficzne niż w zwykłym Jenkinsie:

Jenkins Docker

Jak wspomniałem wcześniej, Jenkins jest również rozpowszechniany jako obraz Dockera. Nie ma nic więcej w tym procesie: po wybraniu typu SCM podajesz adres URL i poświadczenia, a następnie tworzysz potok z jednego repozytorium lub skanujesz wszystkie repozytoria w organizacji. Każda gałąź z plikiem Jenkinsfile otrzyma potok.

Tutaj używam obrazu Blue Ocean Docker, który był dostarczany z kilkoma dodatkowymi wtyczkami usług Git niż domyślna lista dostawców SCM:

Po uruchomieniu niektórych rurociągów wtyczka Blue Ocean wyświetli ich stan, jak pokazano powyżej. Możesz powiększyć pojedynczy potok, aby zobaczyć etapy i kroki:

Możesz także powiększyć gałęzie (u góry) i czynności (u dołu):  

-

Dlaczego warto korzystać z Jenkinsa?

Wtyczka Jenkins Pipeline, której używaliśmy, obsługuje ogólny przypadek użycia ciągłej integracji / ciągłego dostarczania (CICD), który jest prawdopodobnie najczęstszym zastosowaniem Jenkinsa. Istnieją specjalne rozważania dotyczące innych przypadków użycia.

Projekty Java były pierwotną racją bytu Jenkinsa. Widzieliśmy już, że Jenkins obsługuje budowanie za pomocą Maven; działa również z Ant, Gradle, JUnit, Nexus i Artifactory.

Android działa w pewnym sensie w Javie, ale wprowadza problem z testowaniem na szerokiej gamie urządzeń z Androidem. Wtyczka emulatora systemu Android umożliwia tworzenie i testowanie na dowolnej liczbie emulowanych urządzeń. Wtyczka Google Play Publisher umożliwia wysyłanie kompilacji do kanału alfa w Google Play w celu wydania lub dalszego testowania na rzeczywistych urządzeniach.

Pokazałem przykłady, w których określiliśmy kontener Dockera jako agenta dla potoku i gdzie uruchomiliśmy Jenkins i Blue Ocean w kontenerze Docker. Kontenery Docker są bardzo przydatne w środowisku Jenkins w celu poprawy szybkości, skalowalności i spójności.

Istnieją dwa główne przypadki użycia dla Jenkins i GitHub. Jedną z nich jest integracja kompilacji, która może zawierać podpięcie usługi do wyzwalania Jenkinsa przy każdym zatwierdzeniu do repozytorium GitHub. Drugi to użycie uwierzytelniania GitHub do kontrolowania dostępu do Jenkins za pośrednictwem OAuth.

Jenkins obsługuje wiele innych języków poza Javą. W przypadku C / C ++ dostępne są wtyczki do przechwytywania błędów i ostrzeżeń z konsoli, generowania skryptów kompilacji za pomocą CMake, uruchamiania testów jednostkowych i wykonywania statycznej analizy kodu. Jenkins ma wiele integracji z narzędziami PHP.

Chociaż kod Pythona nie musi być budowany (chyba że używasz na przykład Cythona lub tworzysz koło Pythona do instalacji), przydatne jest, aby Jenkins zintegrował się z narzędziami do testowania i raportowania Pythona, takimi jak Nose2 i Pytest, oraz jakością kodu narzędzia takie jak Pylint. Podobnie, Jenkins integruje się z narzędziami Ruby, takimi jak Rake, Cucumber, Brakeman i CI :: Reporter.

Jenkins dla CI / CD

Ogólnie rzecz biorąc, Jenkins oferuje prosty sposób na skonfigurowanie środowiska CI / CD dla praktycznie dowolnej kombinacji języków i repozytoriów kodu źródłowego przy użyciu potoków, a także automatyzację wielu innych rutynowych zadań programistycznych. Chociaż Jenkins nie eliminuje potrzeby tworzenia skryptów dla poszczególnych kroków, zapewnia szybszy i bardziej niezawodny sposób integracji całego łańcucha narzędzi do kompilacji, testowania i wdrażania, niż można by łatwo zbudować samodzielnie.