Matija Capan
Autor:
Matija Capan

Glavni arhitekt

Continuous Integration na IBM Rational Team Concert platformi

Ovaj blog post je zamišljen kao kuharica u kojoj je u kratkim crtama objašnjeno kako postaviti Continuous Integration (CI) okolinu na IBM Rational Team Concert (RTC) platformi uz pomoć Maven-a. Pretpostavlja se da već postoji instalacija RTC-a i Project Area sa Maven Java projektom na Jazz SCM-u. Niže je pokazano kako instralirati build okolinu, kako u RTC-u konfigurirati Build Definition, kako pokrenuti Jazz Build Engine i kako pregledati rezultate builda.

1. Instalacija okoline

Za uspostavljanje CI okoline su korišteni sljedeći alati/platforme:

  •  IBM RTC 4.0.4
  • Jazz Build Engine (JBE) - jedna od komponenti Build System Toolkit-a, JBE je zadužen za obradu build zahtjeva
  • Maven 3.2.1

Slika prikazuje arhitekturu CI sustava kakvog se koristi u KING-u. Proces se odvija na sljedeći način:

1. Developer preko RTC klijenta napravi deliver promjene na RTC (Jazz SCM)
2. RTC periodički kreira zahtjeve za build projekta
3. Jazz Build Engine periodički provjerava postoji li zahtjev za build, ako postoji i ako postoje promjene koje nisu bile uključene u zadnji build, pokreće se build projekta
4. Jazz Build Engine prihvaća sve promjene u svoj Repository Workspace i učitava ih u build folder na build stroju
5. Jazz Build Engine poziva Maven proces sa zadanim ciljevima (goals)
6. Maven prema konfiguraciji u pom.xml projekta započinje build
7. Developer u RTC klijentu prati status builda i po završetku gleda rezultate builda, rezultate testova, logove, artefakte, itd.

Jazz Build Engine je zajedno sa Maven-om instaliran na zasebni stroj. Build stroj koji se koristi je Linux pa će nazivi foldera biti prilagođeni tome.

Na build stroj je potrebno instalirati Maven i Jazz Build Engine.

1.1. Maven

Za instalaciju Mavena preporučam slijediti ove upute za ciljani OS: http://maven.apache.org/download.cgi

1.2. Jazz Build Engine

Zip arhiva za ciljani OS se može pronaći ovdje: https://jazz.net/downloads/rational-team-concert/releases/4.0.4?p=allDownloads

Za instalaciju je dovoljno napraviti unzip arhive na željenu lokaciju na disku.

Prije nego se pokrene JBE potrebno je napraviti usera na RTC-u sa kojim će JBE pristupati RTC-u i repozitoriju kôda (Jazz SCM). Build user mora imati:

  • Repository Permission: JazzUsers
  • Client Access Licence: Build System

Također, build user mora biti Team Member u svakoj Project Area čije se projekte želi uključiti u build na instanci build engine-a koja će sa tim userom pristupati RTC-u.

Svaki build user mora imati Repository Workspace kojem je on vlasnik. Preporuča se da se build radi iz tog workspacea, a ne direktno iz Streama. Na taj način se osigurava da je build izoliran od promjena na Streamu.

2. Build Definition i Build Engine konfiguracija

Nakon instalacije Mavena i JBE-a na build mašinu potrebno je u RTC-u konfigurirati dva entiteta: Build Definition i Build Engine.

2.1. Build Definition konfiguracija

Build Definition je konfiguracija u kojoj je specificirano nad čim, kako i kada se izvršava build. Postupak slijedi:

1. U Eclipse, u Team Artifacts View, proširimo željeni Project Area i zatim proširimo Builds folder
2. Desni klik na Builds -> New Build Definition...
3. Otvara se New Build Definition wizard u kojem u prvom koraku odaberemo Project Area u kojem želimo napraviti novi Build Definition. Ostavimo default vrijednosti. Next.
4. U ovom koraku odabire se Build ID i Build Template. Ovdje se za build koristi Maven pa je za Build Template potrebno odabrati: Maven - Jazz Build Engine. Next.

5. Za source control se koristi Jazz Source Control i Build Engine mora prije pokretanja build-a učitati sve promjene u Build Repository Workspace, stoga je u ovom koraku potrebno odabrati Jazz Source Control. Next.

6. U ovom koraku se biraju post-build opcije, odabiremo JUnit Publishing - za publish JUnit XML logova i Post-build Deliver - za konfiguraciju delivera komponenti u Stream nakon builda. ECJ Publishing se koristi za publish Eclipse Compiler logova, no kako Mavenov compiler plugin po defaultu koristi JavaCompiler ova komponenta nije potrebna. Next.

7. Na Additional Configuration ekranu su već označene opcije General, Schedule i Properties. Označimo i opciju Email Notification jer želimo konfigurirati slanje maila nakon builda. Finish.

Klikom na Finish otvara se Build Definition editor gdje nastavljamo sa konfiguracijom.

2.1.1. Schedule

U Build Definition editoru otvorimo tab Schedule. Tu je moguće definirati koliko često i u kojim intervalima se pokreće automatizirani build. Jedna od praksi CI-a je izvršavanje builda nakon svakog commita kôda na Stream. U verziji RTC-a 4.0.4 ne postoji opcija za pokretanje builda čim se napravi deliver novog Change Seta na Stream, molim nekoga da mi pokaže da sam u krivu. Iz tog razloga ćemo konfigurirati izvršavanje builda u intervalima od jedne minute.

1. Pod Schedule označimo Enabled.
2. Odaberemo default schedule i pod Build time označimo Continuous interval in minutes, u polje upišemo 1.

Ovime smo konfigurirali automatsko pokretanje builda svake minute.

2.1.2. Properties

Napraviti ćemo property loadDirectory koji će se koristiti na nekoliko mjesta u definiciji builda.

1. Add...
2. U Add Build Property dialogu odabrati String, Ok.
3. Pod Name upisati: loadDirectory
4. Pod Value upisati: /var/jazz/builds/${buildDefinitionId}-${buildLabel}
5. Ok. Save.

${buildDefinitionId} i ${buildLabel} su ugrađeni JBE propertiji, svi ugrađeni JBE propertiji se mogu vidjeti u RTC 4.0.4 Infocenter na http://pic.dhe.ibm.com/infocenter/clmhelp/v4r0m4/index.jsp

Putanja u meniju je: Rational Team Concert 4.0.4 > Managing change and releases > Building with Jazz Team Build > Build properties

2.1.3. Email Notification

Idući korak je konfiguracija kriterija za slanje Email obavjesti. Otvorimo tab Email Notification.

1. Add...
2. U Name upišemo naziv kriterija, označimo:

  • Send notifications when a build has completed
  • Only if there are errors

Primatelje maila je moguće konfigurirati na tri načina:

  • RTC User
  • Email adresa
  • Rola u Project Area

Želimo da mail o neuspješnom buildu prime svi članovi tima, pod Roles to notify klik na Add..., odaberemo rolu Team Member.


2.1.4. Jazz Source Control

Otvorimo tab Jazz Source Control. Pod Build Workspace je potrebno odabrati Repository Workspace kojemu je vlasnik Build System user koji će izvršavati build projekta.

1. Klik na Create.
2. U New Repostitory Workspace Wizard odabrati Flow with a stream i u donjem prozoru odabrati stream iz kojeg želimo raditi build. Ovim odabirom omogućujemo da repository workspace povlači promjene iz odabranog streama. Next.
3. U Repository Workspace Name izmjenimo ime prema nazivu build system usera čiji je workspace, Next.
4. Na Read Access Permission stranici odabrati prava za pristup workspaceu, Next.
5. Na Component to Add stranici odabrati potrebne komponente. Označiti Load repository workspace after creation, Finish.
6. Nakon klika na Finish otvara se Load Repository Workspace Wizard. Učitajte projekte u build repository workspace kao i za običnog usera.
7. Kada se build radi iz workspacea vlasnik workspacea mora biti isti user sa kojim se JBE spaja na repozitorij kôda. U Open Workspace dialogu klik na Open Workspace. Ako se Open Workspace dialog ne otvori do workspacea se može doći klikom na labelu Workspace pod Build Workspace.
8. Klik na Browse, odabrati build system usera, Ok, Save.
9. U Build Definition editoru pod Load Options u Load directory upisujemo ranije definirani parametar: ${loadDirectory}. Load directory je folder na build stroju u koji će se učitati build workspace. Prema definiranom parametru svaki build će biti napravljen u svojem folderu u folderu /var/jazz/builds.
10. Pod Accept Options označiti obje opcije:

  • Accept latest changes before loading - JBE će u build workspace povući sve raspoložive promjene koje se nalaze na ciljanom streamu (konfigurirano u koraku 2.
  • Build only if there are changes accepted - iako je build planiran on se neće pokrenuti ako ne postoje promjene na streamu

11. Save

2.1.5. Maven

Otvorimo tab Maven.

1. Pod Maven build u Project location upišemo putanju do foldera gdje se nalazi Java Maven projekt, u ovom slučaju to je: ${loadDirectory}/DemoWebApp.
2. U Goals upišemo npr.: clean package
3. Pod Maven Configuration u Maven home upišemo vrijednost M2_HOME environment varijable, JBE ne parsira environment varijable pa je vrijednost potrebno ručno upisati, u ovom slučaju to je: /usr/local/apache-maven/apache-maven-3.2.1
4. Save

2.1.6. Post-build Deliver

Otvorimo tab Post-build deliver. Ovdje se konfigurira deliver snapshota build workspacea u ciljani stream.

1. Pod Trigger Policy označimo Enable post-build deliver.
2. Označimo Deliver if build has no errors or warnings.
3. Označimo Abort post-build deliver if there are incomplete build activities.
4. Pod Deliver Target odaberemo ciljani stream za deliver.
5. Pod Components to Deliver označimo Deliver all components in build workspace.
6. Pod Snapshot Owner označimo Set the deliver target as the owner of the snapshot.
7. Save

Ovdje je Post-build deliver je konfiguriran tako da se nakon svakog uspješnog builda napravi deliver snapshota build workspacea u ciljani stream. Time osiguravamo da uvijek možemo doći do one verzije kôda koja je isporučena nekim buildom.

2.1.7. JUnit Publishing

Otvorimo tab JUnit Publishing. Ovdje se konfigurira folder sa JUnit logovima kako bi se nakon builda napravio publish tih logova koji zatim postaju vidljivi u rezultatima builda.

1. Pod JUnit XML log File Location upišemo lokaciju na koju Maven surefire plug-in zapisuje JUnit logove, ovdje je to: ${loadDirectory}/DemoWebApp/target/surefire-reports
2. Save

Ovim korakom je završena konfiguracija builda. U idućem dijelu ćemo konfigurirati Build Engine.

2.2. Build Engine konfiguracija

Build engine predstavlja build system koji izvršava build, u našem slučaju je to Jazz Build Engine. Jedan build engine može podržavati jednu ili više build definicija.

U Team Artifacts view, proširimo željeni Project Area te proširimo Builds.

1. Desni klik na Build Engines -> New Build Engine...
2. Otvara se New Build Engine wizard, ostavimo defaultno odabranu opciju Create a new build engine. Next.
3. Na General Information stranici upišemo build engine ID npr.: buildengine01
4. Pod Available build engine types odaberemo: Jazz Build Engine. Finish.
5. Otvara se Build Engine editor, pod Supported Build Definitions kliknemo Add... i odaberemo Build Definition koji smo napravili u prethodnom dijelu.
6. Save

Ovim korakom je završena konfiguracija entiteta unutar RTC-a, slijedi pokretanje Jazz Build Enginea i prvi automatizirani build.

3. Pokretanje Jazz Build Engine-a

Za pokretanje JBE je potreban JDK.

1. U komandnoj liniji se pozicionirajte u folder installdir/buildsystem/buildengine/eclipse gdje je installdir folder u koji je instaliran Build System Toolkit.
2. JBE se pokreće pozivom skripte ovako:

./jbe.sh -vm <putanja do JDK-a> -repository <repositoryURL> -userId <user id> -password <password > -engineId <engine> -sleepTime <sleep time> -verbose

  • repositoryURL - URL do RTC-a. Na primjer, https://hostname.example.com:9443/ccm/
  • user id - Build System user name
  • password - Build System user password
  • passwordFile - Neobavezni parametar, putanja do datoteke sa enkriptiranim passwordom kreirane sa pozivom skripte ./jbe.sh - createPasswordFile <password file path>
  • engine id - id build enginea, u ovom primjeru je to buildengine01
  • sleep time - Neobavezni parametar, interval zadan u sekundama u kojem JBE provjerava postoji li planirani build. Default je 30 sekundi.
  • -verbose. Neobavezni parametar, detaljno logiranje aktivnosti JBE-a

3. Nakon što pokrenemo JBE u konzoli ćemo vidjeti log:

2014-05-07 00:00:52 [Jazz build engine] Searching for build request...
2014-05-07 00:00:52 [Jazz build engine] Found a scheduled request for build definition "CIDemo_build".
2014-05-07 00:00:52 [Jazz build engine] Should build occur?
2014-05-07 00:00:52 [Jazz build engine] No: There are no pre-build participants that want to build.
2014-05-07 00:00:52 [Jazz build engine] Build "20140507-0000" not necessary.
2014-05-07 00:00:53 [Jazz build engine]
2014-05-07 00:00:53 [Jazz build engine] Sleeping for 15 seconds...
2014-05-07 00:01:08 [Jazz build engine] Searching for build request...
2014-05-07 00:01:08 [Jazz build engine] No requests found.

4. Ovako pokrenuti JBE se gasi sa Ctrl+C.
5. Pokretanjem skripte ./jbe.sh prikazuju se opcije za pokretanje skripte. Također, u installdir/buildsystem/readme.txt se mogu dobiti iste informacije.

JBE u ovom primjeru je pokrenut sa parametrima -sleepTime 15 -verbose

4. Build

JBE i Maven su instalirani, Build Definition i Build Engine konfiguracija je napravljena, Jazz Build Engine je pokrenut. Konfigurirani Build u pozadini svake minute kreira zahtjev za build. Pokrenuti JBE svakih 15 sekundi provjerava postoji li zahtjev za build. Jedino što preostaje je napraviti izmjenu u kôdu i njen deliver u Stream. Kada to napravimo događa se sljedeće:

1. JBE će u jednom od idućih provjera pronaći zahtjev za build
2. JBE vidi da postoje incoming promjene u Repository Workspace i prihvaća ih
3. JBE učitava sadržaj svog Repository Workspacea u build folder i pokreće build, to u logu od JBE-a izgleda ovako:

2014-05-07 00:23:04 [Jazz build engine] Searching for build request...
2014-05-07 00:23:04 [Jazz build engine] Found a scheduled request for build definition "CIDemo_build".
2014-05-07 00:23:04 [Jazz build engine] Should build occur?
2014-05-07 00:23:04 [Jazz build engine] Yes: Pre-build participant "com.ibm.team.build.jazzscm" would like to build.
2014-05-07 00:23:04 [Jazz build engine] Invoking pre-build participant "com.ibm.team.build.jazzscm"
2014-05-07 00:23:14 [Jazz build engine] Invoking build participant "com.ibm.team.build.maven"
2014-05-07 00:27:10 [Jazz build engine] Invoking post-build participant "com.ibm.team.build.autoDeliver"
2014-05-07 00:27:12 [Jazz build engine] Invoking post-build participant "com.ibm.team.build.junit.publishing"
2014-05-07 00:27:12 [Jazz build engine] Invoking post-build participant "com.ibm.team.build.jdt.publishing"
2014-05-07 00:27:12 [Jazz build engine] Build "20140507-0023" complete.

4.1. Pregled statusa i rezultata builda

U Team Artifacts view proširimo Builds, desni klik na Build Definition CIDemo_build i odaberemo Show Build Results, otvara se Builds view.

Vidimo osnovne podatke o izvršenom buildu. Desni klik na zapis u tablici i odaberem Open kako bi vidjeli detalje builda.

Na tabu Overview vidimo statistiku ovog builda. Pod Contribution Summary su nam dostupne informacije o Streamu u koji je napravljen post-build deliver, Repository Workspace iz kojeg je napravljen build, snapshot tog workspacea.

Poilje Work items prikazuje work iteme koji su asocirani sa change setovima koji su prihvaćeni u Repository Workspace prije pokretanja builda. Ova veza je dvosmjerna tako da svaki work item također ima link na build u koji je bio uključen.

Na tabu Tests se vide rezultati JUnit testova.

Na tabu Logs se može vidjeti build log što je vrlo korisno u slučaju neuspješnog builda.

U ovom postu je pokazano kako na što jednostavniji način konfigurirati Continuous Integration na RTC-u. Postoji još puno stvari koje se mogu konfigurirati kojima se postiže veći uvid u status i rezultate builda, neke od njih ću obraditi u jednom od idućih postova.

5. Izvori

Kod pisanja ovog posta služio sam se dokumentacijom dostupnom na:

1. IBM Rational Team Concert 4.0.4. Infocenter - http://pic.dhe.ibm.com/infocenter/clmhelp/v4r0m4/index.jsp
2. Jazz.net Build Wiki - https://jazz.net/wiki/bin/view/Main/BuildMain
3. Jazz.net Library - https://jazz.net/library/

Popularne teme
.NET ABAP ADFS Agile Always On Anemic Model Angular automatsko generiranje dokumnetacije Azure Backbone benchmark BI BI projekti blog Bootstrap building people business inteligence Business Intelligence Change Chrome CI CITCON Claims compile Continuous Delivery continuous deployment Continuous Integration CSR d3js data data visualization Data visualization alati DDD dekompozicija dependency injection development dinamička forma dinamički parametri dinamički query distribuirani razvoj dokumentacija Domain-Driven design DOP društvena odgovornost edge-based video analytics Eliminating waste enkapsulacija enterprise razvoj softvera ERP ETL Excel FIORI Frontend funkionalna dokumentacija game Geopackage GPKG GIS Git Groovy heat map HICCUPS Hichert HTML IBCS interoperability invision IoT IPSO izvještavanje java JavaFX Javascript Jazz Build Engine JBE Jenkins jquery jqueryui jsfiddle JVM Kaizen Kanban king KING ICT Kingovci Knockout kvaliteta lambde leadership Lean legacy code M language Management Maven Metodologija microservices Microsoft mobile Mobility mockups moć monday game NetWeaver network nodejs oblikovni obrasci OGC OKR open source optimizacija organizacija organizacijska struktura OutOfMemoryError outsourcing overengineering paginacija Performance performanse PERT PMI PMP; Agile; Project management; Scrum; KING ICT; razvoj; metodologija podatkovni skup poslovna analiza pouzdanost Power BI Power Map Power Pivot Power Query Power View pretraga proces procjena Product Owner programming proizvod Project manager projektni plan radar Rational Team Concert razvoj tima refaktoriranje Release resize responsive charts REST retrospektiva Rich-Domain model Roko Roić rolling wave planning RTC SAP scale scatterplot chart Scrum scrum team scrum tim service boundaries single responsibility principle Single Sign-On smart metering SoapUI social responsibility softver Software software prototyping Software Testing Club Spring Boot SQL standard sustav videonadzora svg swagger tdd Team team building team development Team Foundation Server tech tehnologije terminski plan Testing tim timesheet timovi Toggl.com touch transakcijski nadzor tražilica underengineering unit testing Uspjeh Visual Studio vodstvo vodstvo leadership moć društvena odgovornost DOP social responsibility CSR vođenje projekata WBS Web workshops Zagreb STC

PRIJAVA NA NEWSLETTER

Najnovije novosti iz ICT svijeta