Ciągła integracja z Jenkins

Patrząc wstecz na to, jak oprogramowanie zostało zbudowane i wdrożone nawet 15 lat temu, wydaje się zaskakujące, że nasze aplikacje faktycznie działały. W tamtych czasach cykl rozwoju oprogramowania składał się z uruchamiania kompilacji na komputerze lokalnym, ręcznego kopiowania artefaktów na serwer pomostowy i ręcznego testowania każdej aplikacji w wielu iteracjach. Gdy zespół programistów był zadowolony z kompilacji, ręcznie wdrożyliśmy aplikację do produkcji. Najbardziej konsekwentną rzeczą w tym stylu rozwoju była niespójność - w procesie i wynikach.

Ponad dziesięć lat temu zwinni programiści zaczęli stosować i promować rozwój oparty na testach oraz ciągłą integrację (CI). Dzięki tym technikom mogliśmy automatycznie budować kod źródłowy za każdym razem, gdy programista sprawdzał go w repozytorium źródłowym, wykonując wyczerpujący zestaw testów jednostkowych, aby upewnić się, że aplikacja działa poprawnie. Wielu programistów sterowanych testami zaczęło również przeprowadzać testy integracyjne i testy wydajności w dodatkowym procesie CI.

Dzięki ciągłej integracji mogliśmy szybciej wykrywać błędy i publikować kod znacznie szybciej niż robiliśmy to w poprzednich latach. Nie jest przesadą stwierdzenie, że CI ujarzmiło stronę „budowania” cyklu budowania i wdrażania. W dzisiejszych czasach wiele zespołów deweloperskich przeszło poza CI na CD, co oznacza ciągłe dostarczanie lub ciągłe wdrażanie. Niezależnie od nazwy, CD jest procesem, który przenosi oprogramowanie z wprowadzania kodu do etapów, a nawet wdrożeń produkcyjnych.

Ta część projektów Java Open source wprowadza ciągłą integrację z Jenkins, wiodącym serwerem automatyzacji CI / CD. Zaczniemy od przeglądu procesu CI i CD, a następnie skonfigurujemy projekt WWW w Javie przy użyciu Maven i Jenkins. Dowiesz się, jak skompilować i przetestować projekt w Jenkins za pomocą JUnit, a także jak rozwiązywać problemy z awariami kompilacji. Zainstalujesz także i uruchomisz kilka popularnych wtyczek Jenkins do testowania statycznej analizy kodu i raportowania.

Wprowadzenie do CI / CD

W procesie ciągłej integracji kod, który został wpisany do repozytorium kodu źródłowego, może być automatycznie wypisywany, budowany, testowany na różne sposoby i publikowany w repozytorium. Aby ciągła integracja działała, potrzebujesz serwera CI, takiego jak Jenkins, który jest w stanie monitorować repozytorium kodu źródłowego pod kątem nowych zmian i reagować w konfigurowalny sposób.

Weźmy jako przykład aplikację Java zbudowaną przy użyciu Mavena. Po wykryciu zmian w kodzie serwer CI może odpowiedzieć, wykonując plik mvn clean install. W typowej konfiguracji kompilacji Maven wykonywałoby nowy zestaw testów jednostkowych jako część polecenia kompilacji. Podczas budowania kodu źródłowego serwer mógł wykonać dowolną liczbę dodatkowych akcji:

  • Scal gałąź funkcji z powrotem do gałęzi głównej lub głównej, gdy zatwierdzony kod przejdzie test jednostkowy.
  • Wykonuj statyczną analizę kodu, taką jak pokrycie kodu, złożoność kodu, sprawdzanie typowych błędów itp.
  • Opublikuj swoje artefakty kompilacji w repozytorium, takim jak Artifactory lub Sonatype Nexus
  • Wdróż swoją aplikację w integracyjnym środowisku testowym
  • Wykonaj testy integracyjne
  • Wdróż aplikację w środowisku testów wydajności
  • Wykonaj test obciążenia swojej aplikacji
  • Wdróż swoją aplikację w środowisku testowania akceptacji użytkowników (UAT)
  • Wdróż swoją aplikację w środowisku produkcyjnym

Te kroki to wszystkie rodzaje działań, które można wykonać w ramach procesu CI / CD. CI zazwyczaj obejmuje fazy tworzenia i testowania cyklu rozwoju, podczas gdy CD rozszerza ten proces o wdrożenie artefaktu kompilacji na serwerze w celu przetestowania. W niektórych środowiskach CD trafia aż do produkcji.

Ciągła integracja jest zwykle wykonywana przy użyciu narzędzia takiego jak Jenkins, Bamboo lub TeamCity, które organizuje kroki kompilacji w potok integracji. Jenkins jest prawdopodobnie najpopularniejszym produktem CI / CD i dobrze współpracuje z Dockerem.

Pobierz i zainstaluj Jenkins

Jenkins to serwer ciągłej integracji i nie tylko. Składa się z silnika automatyzacji i ekosystemu wtyczek, który obsługuje ciągłą integrację, automatyczne testowanie i ciągłe dostarczanie. Dostosowujesz potok dostaw w zależności od potrzeb.

Istnieje wiele sposobów uruchamiania Jenkinsa:

  1. Pobierz plik WAR i zainstaluj go w kontenerze serwletów na komputerze lokalnym.
  2. Skonfiguruj maszynę wirtualną w chmurze publicznej, takiej jak AWS, i hostuj tam Jenkins.
  3. Wykorzystaj dostawcę chmury Jenkins, takiego jak CloudBees.
  4. Skonfiguruj Jenkins w instalacji testowej przy użyciu platformy Docker.

Pokażę ci, jak skonfigurować zarówno instalację lokalną, jak i instalację testową Dockera.

Pobierz i zainstaluj Jenkins lokalnie

Zacznij od pobrania Jenkinsa i wybrania wersji Long-Term Support (LTS) ze strony głównej Jenkins. Ponieważ jestem na komputerze Mac, instalacja automatycznie pobrała pkgplik, który umieścił plik jenkins.warw moim Application/Jenkinsfolderze. Plik WAR można wdrożyć w dowolnym kontenerze serwletów.

Będziesz także chciał pobrać i zainstalować Apache Tomcat. W chwili pisania tego tekstu najnowszą wersją Tomcata jest 8.5.4, ale powinieneś mieć możliwość uruchomienia dowolnej najnowszej wersji. Pobierz plik ziplub tar.gzi rozpakuj go na dysk twardy. Skopiuj plik jenkins.war do webappsfolderu Tomcat, a następnie uruchom plik bin/startup.shlub bin/startup.bat. Można sprawdzić, że jest uruchomiony, otwierając przeglądarkę do: //localhost:8080.

Aby uruchomić Jenkins, otwórz przeglądarkę pod adresem URL: // localhost: 8080 / jenkins.

Powinieneś otrzymać ekran, który wygląda jak na rysunku 1.

Steven Haines

Następnie Jenkins tworzy hasło zarządzania i pisze, że zarówno Tomcat logs/catalina.outpliku dziennika i do następnego katalogu domowym: .jenkins/secrets/initialAdminPassword. Odzyskaj hasło, wprowadź je w elemencie formularza Hasło administratora (pokazane na rysunku 1) i naciśnij Kontynuuj . Zostaniesz poproszony o zainstalowanie sugerowanych wtyczek lub wybranie wtyczek do zainstalowania. Na razie polecam instalację sugerowanych wtyczek.

Teraz zostaniesz poproszony o utworzenie administratora. Wprowadź informacje o użytkowniku administratora i naciśnij przycisk Zapisz i zakończ . Na koniec kliknij Start using Jenkins . Zobaczysz teraz stronę główną Jenkins, jak pokazano na rysunku 2.

Steven Haines

Skonfiguruj przykładową aplikację za pomocą Maven

Zanim będziemy mogli użyć Jenkinsa do zbudowania projektu internetowego Java za pomocą Maven, musimy skonfigurować obie te technologie. Pod maską Jenkins pobierze kod źródłowy z repozytorium kodu źródłowego do katalogu lokalnego i wykona określone cele Maven. Aby to zadziałało, musisz zainstalować jedną lub więcej wersji Maven, powiedzieć Jenkinsowi, gdzie są zainstalowane, i skonfigurować wersję Maven, której ma używać Jenkins podczas budowania aplikacji.

Na pulpicie nawigacyjnym Jenkins kliknij Zarządzaj Jenkins i wybierz Globalna konfiguracja narzędzi . Pierwszą rzeczą, którą zrobimy, jest skonfigurowanie JDK. W sekcji JDK kliknij Dodaj JDK , nadaj mu nazwę (moja to „JDK8”) i pozostaw zaznaczoną domyślną opcję Instaluj z java.sun.com . Zaakceptuj umowę licencyjną Oracle, a następnie kliknij łącze „Wprowadź nazwę użytkownika / hasło”. Wprowadź swoją nazwę użytkownika i hasło Oracle i naciśnij Zamknij . Zostanie wyświetlony ekran podobny do przedstawionego na rysunku 3.

Steven Haines

Kliknij Zastosuj, aby zapisać swoją pracę, a następnie przewiń w dół do sekcji Mavena i kliknij Dodaj Mavena . Wpisz nazwę dla Mavena (moja to „Maven 3.3.9”), pozostaw zaznaczone „Instaluj automatycznie” i „Instaluj z Apache”. Kliknij Zapisz, kiedy będziesz gotowy. Powinien zostać wyświetlony ekran podobny do przedstawionego na rysunku 4.

Steven Haines

Git jest wstępnie skonfigurowany z Jenkinsem, więc powinieneś mieć teraz zainstalowane wszystkie narzędzia potrzebne do pobrania i zbudowania projektu Java z Git z Maven.

Zainstaluj Jenkins w kontenerze Docker

If you don't want to install Jenkins on your local machine, you have the option of running it in a Docker container. The official Jenkins Docker image lets you run and test an installation of Jenkins without actually configuring it on a local machine.

Installing Docker

See my introduction to Docker for a beginner's guide to Docker, including installation and setup instructions.

Assuming you already have Docker setup in your development environment, you can launch Jenkins from the Docker the command line:

 docker run -p 8080:8080 -p 50000:50000 -v /your/home/jenkins:/var/jenkins_home -d jenkins 

This command tells Docker to run the latest release of jenkins with the following options:

  • -p 8080:8080: Maps port 8080 on the Docker container to port 8080 on the Docker host, so that you can connect to the Jenkins web app on port 8080.
  • -p 50000:50000: Maps port 50000 on the Docker container to port 50000 on the Docker host. Jenkins uses this port internally to allow build slave executors to connect to the master Jenkins server.
  • -v /your/home/jenkins:/var/jenkins_home: Maps Jenkins data storage to your local directory, so that you can restart your Docker container without losing your data.
  • -d: Lets you run the Docker container in a detached mode, or as a daemon process.

The following shows the output for running these commands:

 $ docker run -p 8000:8080 -v /Users/shaines/jenkins/:/var/jenkins_home -d jenkins cc16573ce71ae424d4122e9e4afd3a294fda6606e0333838fe332fc4e11d0d53 

Because we're running our Docker container in detached mode, we need to follow the logs that are output by Jenkins. You can do so with the docker logs -f command. Just pass in the first few hexadecimal numbers of the container ID, in this case cc16573ce71ae424d4122e9e4afd3a294fda6606e0333838fe332fc4e11d0d53:

 $ docker logs -f cc1 Running from: /usr/share/jenkins/jenkins.war webroot: EnvVars.masterEnvVars.get("JENKINS_HOME") ... ************************************************************* ************************************************************* ************************************************************* Jenkins initial setup is required. An admin user has been created and a password generated. Please use the following password to proceed to installation: 205be6fe69c447dd933a3c9ce7420496 This may also be found at: /var/jenkins_home/secrets/initialAdminPassword ************************************************************* ************************************************************* ************************************************************* 

Setup Jenkins CI for a Java web app

Następnie skonfigurujemy proste zadanie aplikacji internetowej Java w Jenkins. Ponieważ aplikacja nie jest ważna w tym samouczku, użyjemy mojej prostej przykładowej aplikacji Hello, World Servlet, którą hostowałem na GitHub.

Aby przetestować Jenkins, musisz być w stanie zatwierdzać zmiany w repozytorium kodu źródłowego, więc powinieneś teraz utworzyć to repozytorium. Na stronie głównej Jenkins kliknij przycisk Utwórz nowe oferty pracy i wprowadź nazwę swojego projektu. Zostaniesz poproszony o wybranie typu projektu, jak pokazano na rysunku 5.

Steven Haines

Dla tego projektu wybierzemy typ projektu Freestyle, ale powinieneś być świadomy swoich opcji:

  • Projekt w stylu dowolnym: ten najpopularniejszy typ projektu umożliwia monitorowanie repozytorium kodu źródłowego i korzystanie z dowolnego systemu kompilacji, takiego jak Maven i Ant.
  • Pipeline: Choose this project type for complicated projects with moving parts that you need to coordinate across multiple build slaves.
  • External job: Use this to configure an automated external job that you want to track in Jenkins as part of your build.
  • Multi-configuration project: This is the job type for projects that require different configurations for different environments, such as production, staging, and test.
  • Folder: When you have a complicated build then you might want to organize things into folders, each with their own distinct namespace.
  • Multi-branch pipeline: automatically create a set of pipeline projects, based on the code branches that are defined in your source code repository

Enter a project name, in this case "hello-world-servlet", and choose "OK". Next, choose GitHub project, then enter the GitHub URL of your project: //github.com/ligado/hello-world-servlet.

Under Source Code Management, choose Git and enter the same project URL.

In the Build Triggers section, choose Build when a change is pushed to GitHub so that Jenkins will build your code anytime you push a change to GitHub.

W sekcji Kompilacja dodaj nowy krok kompilacji, wybierz Wywołaj cele Mavena najwyższego poziomu , wybierz wcześniej skonfigurowaną instancję Mavena (np. „Maven 3.3.9”) i wprowadź czystą instalację w polu celów. Na razie pozostaw Akcje post-build puste. Po zakończeniu naciśnij Zapisz .

Po powrocie do pulpitu nawigacyjnego powinien zostać wyświetlony ekran podobny do przedstawionego na rysunku 6.

Steven Haines

Aby przetestować konfigurację, naciśnij przycisk Buduj teraz obok projektu hello-world-servlet. W historii kompilacji po lewej stronie strony projektu, pokazanej na rysunku 7, powinna być widoczna kompilacja wykonana pomyślnie.

Steven Haines

Aby zobaczyć dokładnie, co się stało, kliknij kompilację, a następnie kliknij opcję Wyjście konsoli , która pokaże wszystkie kroki, które wykonał Jenkins, i ich wyniki. Dane wyjściowe konsoli znajdują się poniżej.