Neprekidna integracija s Jenkinsom

Osvrćući se na to kako je softver izgrađen i implementiran čak prije 15 godina, čini se iznenađujućim da su naše aplikacije stvarno radile. U to se doba životni ciklus razvoja softvera sastojao od izvođenja gradnji na lokalnom stroju, ručnog kopiranja artefakata na pripremni poslužitelj i ručnog testiranja svake aplikacije kroz višestruke iteracije. Kada bi razvojni tim bio zadovoljan izradom, ručno bismo rasporedili aplikaciju u produkciju. Najdosljednija stvar kod ovog stila razvoja bila je nedosljednost - u procesu i u rezultatima.

Prije više od deset godina, agilni programeri počeli su prihvaćati i promicati razvoj i kontinuiranu integraciju vođeni testom. Ovim tehnikama mogli bismo automatski graditi izvorni kod kad god ga je programer prijavio u izvorno spremište, izvršavajući iscrpni paket jedinica za testiranje kako bi osigurao da aplikacija radi ispravno. Mnogi programeri vođeni testom također su započeli s testiranjem integracije i testiranjem performansi u sekundarnom CI procesu.

Stalnom integracijom mogli bismo brže otkriti pogreške i objaviti kod mnogo brže nego što smo to radili prethodnih godina. Ne pretjeruje se ako se kaže da je CI pripitomio "gradnju" strane ciklusa izrade i implementacije. Ovih dana mnogi razvojni timovi prešli su dalje od CI-a na CD, što znači kontinuirana isporuka ili kontinuirano postavljanje. Bez obzira na oznaku, CD je postupak koji softver prebacuje s prijave na kôd na inscenaciju ili čak produkcijsku implementaciju.

Ovaj dio Java projekata otvorenog koda uvodi kontinuiranu integraciju s Jenkinsom, vodećim automatizacijskim poslužiteljem za CI / CD. Započet ćemo s pregledom CI i CD postupka, a zatim ćemo postaviti Java web projekt koristeći Maven i Jenkins. Naučit ćete kako graditi i jedinstveno testirati projekt u Jenkinsu s JUnit-om, kao i kako otkloniti neuspjehe gradnje. Također ćete instalirati i pokrenuti pregršt popularnih Jenkins dodataka za testiranje i izvještavanje o statičkoj analizi koda.

Uvod u CI / CD

U kontinuiranom procesu integracije, kod koji je provjeren u spremištu izvornog koda može se automatski provjeriti, izraditi, testirati na razne načine i objaviti u spremištu. Da bi kontinuirana integracija funkcionirala, potreban vam je CI poslužitelj poput Jenkinsa, koji je u mogućnosti nadzirati vaše spremište izvornog koda radi novih promjena i reagirati na konfigurabilne načine.

Uzmimo za primjer Java aplikaciju izgrađenu pomoću Mavena. Na otkrivanje promjena koda, vaš CI poslužitelj mogao bi odgovoriti izvršavanjem a mvn clean install. U tipičnoj Mavenovoj konfiguraciji gradnje, izvršavao bi novi set jediničnih testova kao dio naredbe za izgradnju. Dok se izvorni kod gradio, poslužitelj je mogao izvršiti bilo koji broj dodatnih radnji:

  • Spojite svoju granu značajke natrag u glavnu ili glavnu granu nakon što je predani kôd prošao jedinstveni test.
  • Izvršiti statičku analizu koda, poput pokrivanja koda, složenosti koda, provjere uobičajenih grešaka itd.
  • Objavite svoje artefakte gradnje u spremištu, kao što je Artifactory ili Sonatype Nexus
  • Postavite svoju aplikaciju u okruženje za integracijsko testiranje
  • Izvršiti integracijske testove
  • Postavite svoju aplikaciju u okruženje za provjeru performansi
  • Izvršite test opterećenja za vašu aplikaciju
  • Postavite svoju aplikaciju u okruženje za testiranje prihvaćanja korisnika (UAT)
  • Postavite svoju aplikaciju u produkciju

Ovi su koraci sve vrste aktivnosti koje biste mogli obavljati kao dio CI / CD postupka. CI obično obuhvaća faze izgradnje i testiranja životnog ciklusa razvoja, dok CD proširuje taj postupak na postavljanje artefakta gradnje na poslužitelj za testiranje. U nekim okruženjima CD ide sve do produkcije.

Neprekidna integracija obično se vrši pomoću alata poput Jenkinsa, Bambusa ili TeamCity-a, koji orkestrira vaše korake izrade u integracijski cjevovod. Jenkins je vjerojatno najpopularniji CI / CD proizvod i dobro se slaže s Dockerom.

Preuzmite i instalirajte Jenkins

Jenkins je poslužitelj za kontinuiranu integraciju i još mnogo toga. Sastoji se od mehanizma za automatizaciju i ekosustava dodataka koji podržava kontinuiranu integraciju, automatizirano testiranje i kontinuiranu isporuku. Cjevovod isporuke prilagodite ovisno o svojoj potrebi.

Postoji mnogo načina za pokretanje Jenkinsa:

  1. Preuzmite WAR datoteku i instalirajte je na spremnik servleta na vašem lokalnom računalu.
  2. Postavite virtualni stroj u javni oblak poput AWS-a i tamo smjestite Jenkinsa.
  3. Iskoristite Jenkinsovog dobavljača oblaka kao što je CloudBees.
  4. Postavite Jenkins u testnoj instalaciji pomoću Dockera.

Pokazat ću vam kako postaviti lokalnu instalaciju i Docker test instalaciju.

Preuzmite i instalirajte Jenkins lokalno

Započnite s preuzimanjem Jenkinsa i odabirom izdanja Long-Term Support (LTS) s Jenkins početne stranice. Budući da sam na Macu, instalacija je automatski preuzela pkgdatoteku koja je smjestila jenkins.waru moju Application/Jenkinsmapu. Datoteka WAR može se rasporediti u bilo koji spremnik servleta.

Također ćete htjeti preuzeti i instalirati Apache Tomcat. Od pisanja ovog članka najnovija verzija Tomcata je 8.5.4, ali trebali biste moći pokretati bilo koju noviju verziju. Preuzmite datoteku zipili tar.gzi raspakirajte je na svoj tvrdi disk. Kopirajte datoteku jenkins.war u Tomcatovu webappsmapu, a zatim pokrenite datoteku bin/startup.shili bin/startup.bat. Možete testirati da je pokrenut od strane otvaranja preglednika na: //localhost:8080.

Da biste pokrenuli Jenkinsa, otvorite preglednik na URL: // localhost: 8080 / jenkins.

Trebali biste dobiti zaslon koji izgleda poput slike 1.

Steven Haines

Zatim Jenkins stvara lozinku administraciju i piše da su se mačak u logs/catalina.outlog datoteku i na sljedeću početnu direktoriju: .jenkins/secrets/initialAdminPassword. Dohvatite lozinku, unesite je u element obrasca Administratorska lozinka (prikazan na slici 1) i pritisnite Nastavi . Od vas će se zatražiti da instalirate predložene dodatke ili odaberete dodatke za instalaciju. Za sada preporučujem instaliranje predloženih dodataka.

Sada će se od vas tražiti da izradite administratora. Unesite podatke o administratoru i pritisnite Spremi i završi . Na kraju, kliknite Start using Jenkins . Sada ćete vidjeti Jenkinsovu početnu stranicu, kao što je prikazano na slici 2.

Steven Haines

Konfigurirajte primjer aplikacije s Mavenom

Prije nego što Jenkins možemo koristiti za izgradnju Java web projekta s Mavenom, moramo postaviti obje ove tehnologije. Ispod haube, Jenkins će provjeriti izvorni kod iz spremišta izvornog koda u lokalni direktorij i izvršiti Maven ciljeve koje navedete. Da bi to uspjelo, morate instalirati jednu ili više verzija Mavena, reći Jenkinsu gdje su instalirani i konfigurirati verziju Mavena koju želite da Jenkins koristi prilikom izrade vaše aplikacije.

Na Jenkins nadzornoj ploči kliknite Manage Jenkins i odaberite Global Tool Configuration . Prvo što ćemo napraviti je konfiguriranje JDK-a. U odjeljku JDK kliknite Dodaj JDK , dajte mu ime (moje je "JDK8") i ostavite označenu zadanu Instalaciju s java.sun.com . Prihvatite Oracle ugovor o licenci, a zatim kliknite vezu "Unesite svoje korisničko ime / lozinku". Unesite svoje Oracle korisničko ime i lozinku i pritisnite Zatvori . Prikazat će vam se zaslon sličan slici 3.

Steven Haines

Kliknite Primijeni da biste spremili svoj rad, a zatim se pomaknite dolje do odjeljka Maven i kliknite Dodaj Maven . Unesite naziv za Maven (moj je "Maven 3.3.9"), ostavite označena "Automatski instaliraj" i "Instaliraj iz Apachea". Kliknite Spremi kad budete spremni. Trebao bi vam se prikazati zaslon sličan slici 4.

Steven Haines

Git dolazi unaprijed konfiguriran s Jenkinsom, pa biste sada trebali imati instalirane sve alate koji su vam potrebni za naplatu i izgradnju Java projekta iz Gita s Mavenom.

Instalirajte Jenkins u Docker spremnik

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

Dalje ćemo postaviti jednostavan posao Java web aplikacije u Jenkinsu. Budući da aplikacija nije važna za ovaj vodič, koristit ćemo moju jednostavnu aplikaciju Hello, World Servlet, koju sam hostirao na GitHubu.

Da biste testirali Jenkinsa, morat ćete moći izvršiti promjene u spremištu izvornog koda, pa biste to spremište trebali stvoriti odmah. Na Jenkins početnoj stranici kliknite gumb Stvori nove poslove i unesite naziv svog projekta. Od vas će se tražiti da odaberete vrstu projekta, kao što je prikazano na slici 5.

Steven Haines

Za ovaj ćemo projekt odabrati vrstu projekta Freestyle, ali trebali biste biti svjesni svojih mogućnosti:

  • Freestyle projekt: Ova najčešća vrsta projekata omogućuje vam nadgledanje spremišta izvornog koda i upotrebu bilo kojeg sustava gradnje, kao što su 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.

U odjeljak Izrada dodajte novi korak gradnje, odaberite Prizivanje ciljeva najviše razine Maven , odaberite instancu Mavena koju ste prethodno konfigurirali (poput "Maven 3.3.9") i unesite ciljno instaliranje u polje ciljeva. Ostavite akcije Post-build za sada prazne. Kad završite, pritisnite Spremi .

Kad se vratite na nadzornu ploču, trebali biste vidjeti zaslon sličan slici 6.

Steven Haines

Da biste testirali svoju konfiguraciju, pritisnite gumb Izgradi odmah pored projekta hello-world-servlet. Trebali biste vidjeti uspješno izvedenu gradnju u Povijesti gradnje s lijeve strane stranice projekta, prikazanu na slici 7.

Steven Haines

Da biste točno vidjeli što se dogodilo, kliknite izgradnju, a zatim kliknite Izlaz konzole koja će vam pokazati sve korake koje je Jenkins izveo i njihove rezultate. Izlaz konzole je ispod.