joakim sandqvist - theseus

53
Joakim Sandqvist Koonnin monitorointi Metropolia Ammattikorkeakoulu Insinööri (AMK) Koulutusohjelma Insinöörityö Päivämäärä

Upload: others

Post on 26-Apr-2022

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Joakim Sandqvist - Theseus

Joakim Sandqvist

Koonnin monitorointi

Metropolia Ammattikorkeakoulu Insinoumloumlri (AMK) Koulutusohjelma Insinoumloumlrityouml Paumlivaumlmaumlaumlrauml

Tiivistelmauml

Tekijauml Otsikko Sivumaumlaumlrauml Aika

Joakim Sandqvist Koonnin monitorointi 44 sivua + 0 liitettauml 1952012

Tutkinto Insinoumloumlri (AMK)

Koulutusohjelma Tietotekniikka

Suuntautumisvaihtoehto Ohjelmistotekniikka

Ohjaajat

Yliopettaja Erja Nikunen Yliopettaja Auvo Haumlkkinen

Jatkuva integraatio taumlhtaumlauml projektityoumlskentelyn sekauml ohjelmistotuotteen kehittaumlmisen hel-pottamiseen Ohjelmistotuote on tarkoitus saada valmiiksi mahdollisimman kivuttomasti ja kehitysprosessissa olisi hyvauml toumlrmaumltauml mahdollisimman vaumlhaumln kehittaumljien ohjelmoimien oh-jelmistomoduulien tai -komponenttien vaumllisiin konflikteihin Jotta konfliktit ohjelmistomoduulien ja -komponenttien vaumllillauml huomattaisiin mahdollisim-man nopeasti tarvitaan tapa ilmoittaa konfliktin tapahtumisesta eli koonnin epaumlonnistu-misesta kehitysryhmaumllle ja muille projektin osapuolille mahdollisimman nopeasti Perintei-nen tapa taumlmaumln tekemiseen on laumlhettaumlauml eri osapuolille saumlhkoumlpostia Taumlmauml ei kuitenkaan ole paras eikauml huonoin tapa vaan yksi monista tavoista vaumllittaumlauml informaatio koonnin tilasta kehitysryhmaumllle Opinnaumlytetyoumlssauml tullaan esittelemaumlaumln erilaisia ratkaisuja informatiivisen kehitysympaumlristoumln rakentamiseen Taumlmauml opinnaumlytetyouml tehtiin Metropolia Ammattikorkeakoulun Bulevardin toimipisteelle Yksi opinnaumlytetyoumln tavoitteista oli suunnitella ja ohjelmoida reaaliajassa toimiva koontiympaumlris-toumln tarkkailuun soveltuva ohjelmisto Ohjelmistotuotantoprojekti-kurssille Sovellus voidaan luokitella osaksi kehitys- sekauml tyoumlympaumlristoumlauml Opinnaumlytetyoumlssauml kerrataan jatkuvaan integraation liittyvaumlt perusasiat sekauml perehdytaumlaumln koontiympaumlristoumln tarkkailumenetelmiin Taumlssauml dokumentissa esitellaumlaumln myoumls opinnaumlyte-tyoumln konkreettinen osa Java-sovellus rdquoKoontardquo ja esitellaumlaumln kurssin uusi kehitysympaumlristouml Tyoumln lopputuloksena saatiin valmiiksi Java-sovellus Koonta jonka tarkoitus on antaa oh-jelmistokehitysryhmaumllle suoraa palautetta ohjelmistoprojektin tilasta Ohjelmistossa ei ole vielauml kaikkea asiakkaan haluamaa toiminnallisuutta mutta ohjelmiston kehittaumlmistauml jatke-taan opinnaumlytetyoumln valmistumisen jaumllkeen

Avainsanat jatkuva integraatio koonti Jenkins CI Java Agilefant

Abstract

Author(s) Title Number of Pages Date

Joakim Sandqvist Monitoring the Build Environment 44 pages + 0 appendices 19 May 2012

Degree Bachelor of Engineering

Degree Programme Information and Communications Technology

Specialisation option Software Engineering

Instructor(s)

Erja Nikunen Principal Lecturer Auvo Haumlkkinen Principal Lecturer

Continuous integration aims to ease project management and the software development process The goal is to have a software development process that has as few component and module conflicts as possible For the development team to be able to react to conflicts swiftly a convenient way to feedback the team is needed Did the build fail Who broke it Feedback can be produced in the form of e-mail This is not the best nor is this the worst way to feedback the team This is one of the many ways to notify the development team of a broken build This doc-ument offers a look at some of the feedback methods and presents an example of an in-formative development environment The thesis was carried out for the Degree Programme of Information and Communications Technology of the Helsinki Metropolia University of Applied Sciences The object was to design and program a piece of software for monitoring the build environment in real time The piece of software is to be used by the students in the Software Development Project course to monitor their Jenkins CI build activities The thesis goes through the basics of continuous integration as well as introduces differ-ent build environment monitoring methods The concrete part of the study the Java based software ldquoKoontardquo is presented and the work and development environments of the course in question are introduced as well

Keywords continuous integration building Jenkins CI Agilefant Java

Sisaumlllys

Lyhenteet ja maumlaumlritelmaumlt

1 Johdanto 1

2 Ohjelmistotuotantoprojekti -kurssi 2

21 Ohjelmistotuotantoprojekti-kurssin yleiskuvaus 2

22 Ohjelmistotuotantoprojekti-kurssin kehitysympaumlristoumln yleiskuvaus 2

221 Kurssin tyoumltilat 3

222 Kurssin palvelimet 6

3 Ohjelmiston kokoaminen 8

31 Makefile 9

32 Ant 11

33 Maven 13

34 Koonti ja kaumlyttoumloumlnotto 18

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant 19

41 Jatkuva integraatio 19

42 Jenkins CI 21

43 Agilefant 25

5 Koontiympaumlristoumln tarkkailu 28

51 Yleistauml koontiympaumlristoumln tarkkailusta 28

52 Vaumllittoumlmaumln palautteen laitteet 29

521 The Code Flow-O-Meter 30

522 Smell-O-Mat 31

6 Koontiympaumlristoumlntarkkailu sovellus 32

61 Sovelluksen toiminnallisuus 33

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri 39

7 Yhteenveto 43

Laumlhteet 45

Lyhenteet ja maumlaumlritelmaumlt

Agilefant Ketterien ohjelmistotuotantomenetelmien mukaisiin projekteihin soveltuva projektinhallintatyoumlkalu

Apache Ant Java-pohjainen koontityoumlkalu Katso luku 32

Apache Maven

Koontityoumlkalu Katso luku 33

CI Continuous Integration Jatkuva integraatio

CI-infrastruktuuri

Jatkuvan integraation toteutuksen perusrakenne Muodostuu niistauml palve-

luista ja rakenteista jotka mahdollistavat jatkuvan integraation toimin-

nan

CI-palvelu Jatkuva integraatio palvelu Esim koontipalvelimella sijaitseva jatkuvan

integraation palvelinsovellus

IDE Integrated Development Environment Integrated Design Environment

Kaikki keskeiset sovelluskehitykseen liittyvaumlt tyoumlkalut integroiva sovellus

Jatkuva integraatio

Prosessi jossa sovellusta kaumlaumlnnetaumlaumln testataan ja integroidaan jatkuvasti

kehityksen aikana

Jenkins CI Integraatiopalvelinsovellus Koontipalvelinsovellus

Kehitysympaumlristoumlinfrastruktuuri

Kehitysympaumlristoumln perusrakenne Muodostuu niistauml palveluista ja raken-

teista jotka mahdollistavat kehitysympaumlristoumln toiminnan

Koontityoumlkalu

Koontiprosessin automatisoiva tyoumlkalu

Koontipalvelin

Palvelin jolla koonti suoritetaan

Make Yksi vanhimmista ja suosituimmista koontityoumlkaluista

Projektioliomalli

Mavenin prosessikuvaus tyypillisesti nimetty pomxmlksi

Prosessikuvaus

Koontityoumlkalulle syoumltettaumlvauml kuvaus joka maumlaumlrittelee koontiprosessin Pro-

sessikuvauksen sisaumlltaumlvaumlauml tiedostoa voidaan kutsua koontitiedostoksi tai

koontikuvaustiedostoksi

Scrum Ketteraumlssauml kehityksessauml kaumlytetty projektinhallintamenetelmauml

Subversion Versionhallintasovellus

RSS-syoumlte RSS-feed Tarkoittaa mm Real Simple Syndication Hyvauml tapa levittaumlauml

usein paumlivittyvaumlauml tietoa eri laumlhteisiin

Versionhallintapalvelin

Versionhallintasovellusta kuten Subversionia ajava palvelin

XF-laite Extreme Feedback Device Extreme Notification Device Laite joka antaa

suoraa palautetta koonnin tilasta

1

1 Johdanto

Taumlssauml opinnaumlytetyoumlssauml esitellaumlaumln Metropolia Ammattikorkeakoulun Ohjelmistotuontato-

projekti-kurssin kaumlytoumlssauml oleva kehitysympaumlristouml Taumlmaumln kehitysympaumlristoumln esittelemi-

sen tyoumlympaumlristoumlineen palvelimineen ja palvelinsovelluksineen on tarkoitus toimia

suuntaa antavana materiaalina niin pienten kuin suurienkin ohjelmistoprojektien koon-

tiympaumlristoumljen ja informatiivisten kehitysympaumlristoumljen rakentamiseen

Metropolia Ammattikorkeakoulun opiskelijat tekevaumlt Ohjelmistotuotantoprojekti-

kurssilla asiakkaan tilaaman ohjelmistotuotteen Opiskelijat suunnittelevat ja ohjelmoi-

vat tuotteen alusta loppuun Opiskelijoilla on kaumlytoumlssaumlaumln moderni kehitysympaumlristouml

jota kehitetaumlaumln entisestaumlaumln koko ajan Kehitysympaumlristouml koostuu tyoumltilojen laiteratkai-

suista tyoumlasemien sovelluksista sekauml palvelin- ja palvelinsovellusinfrastruktuurista

Taumlssauml dokumentissa tullaan esittelemaumlaumln opinnaumlytetyoumlssauml ohjelmoitu Metropolian Oh-

jelmistotuotantoprojekti-kurssin kaumlyttoumloumln tarkoitettu koontiympaumlristoumln monitorointi

sovellus rdquoKoontardquo Sovelluksen tarkoitus on antaa kurssin tyoumlryhmille reaaliaikaista pa-

lautetta ohjelmistoprojektin koonnin tilasta

Luvussa 2 tutustutaan ohjelmistotuotantoprojekti-kurssin sisaumlltoumloumln kehitysympaumlristoumloumln

sekauml tyoumltiloihin Taumlmaumln jaumllkeen luvussa 3 perehdytaumlaumln ohjelmiston kokoamiseen kaumly-

maumlllauml laumlpi erilaisia koontiprosesseja eri koontityoumlkaluilla

Luvussa 4 kerrotaan jatkuvasta integraatiosta sekauml koontiympaumlristoumlstauml Lisaumlksi esitel-

laumlaumln sovellukset Jenkins CI sekauml Agilefant jotka liittyvaumlt vahvasti lukujen 5 ja 6 aihee-

seen koontiympaumlristoumln tarkkailu

Lopuksi luvussa 6 esitellaumlaumln opinnaumlytetyoumlssauml tehty Java-sovellus rdquoKoontardquo Taumlssauml lu-

vussa kaumlydaumlaumln laumlpi hieman sovelluksen ohjelmointiprosessia ja perehdytaumlaumln sovelluk-

sen toiminnallisuuteen sekauml arkkitehtuuriin yksityiskohtaisesti

2

2 Ohjelmistotuotantoprojekti -kurssi

Taumlssauml luvussa perehdytaumlaumln Metropolia Ammattikorkeakoulun Ohjelmistotuotantoprojek-

ti-kurssiin Luvun tarkoitus on antaa lukijalle hyvauml yleiskuva kurssin sisaumllloumlstauml tyoumltilois-

ta sekauml kehitysympaumlristoumlstauml

21 Ohjelmistotuotantoprojekti-kurssin yleiskuvaus

Opiskelijat paumlaumlsevaumlt soveltamaan kurssilla useita aiemmilla tietotekniikan kursseilla

opittuja tietoja ja taitoja Tyouml on projektiluontoinen Kuhunkin ryhmaumlaumln kuuluu 4-6

opiskelijaa ja ryhmiauml on yhteensauml 2-4 Projekti kestaumlauml kahden periodin ajan ja sen

kokonaistyoumlmaumlaumlrauml on noin 800-1200 tyoumltuntia

Ohjelmiston kehittaumlmiseen kaumlytetaumlaumln Scrum-ketteraumlauml menetelmaumlauml Scrumin tyoumlvaiheet

koostuvat sprinteistauml joita taumlssauml projektissa on viisi kappaletta Jokaista sprinttiauml edel-

taumlauml aloituspalaveri jossa sovitaan kyseisen sprintin tehtaumlvaumlt ja tavoite Ydinroolit

Scrumissa ovat tuotteen omistaja tiimi sekauml Scrum Master Kurssin tyoumlryhmien Scrum

Mastereina toimivat opettajat Tiimit koostuvat kurssin tyoumlryhmistauml ja tuotteen immate-

riaalioikeudet omistaa Metropolia Oy joka puolestaan antaa tuotteen kaumlyttoumloikeudet

projektiin osallistuneille tahoille Taumlmauml on toimintapa yleensauml mutta asiakkaasta riip-

puen tehdaumlaumln erilaisia sopimuksia

Jokainen kurssin ryhmauml maumlaumlrittelee suunnittelee toteuttaa testaa sekauml dokumentoi

suurehkon ohjelmiston Jokaisella projektilla on oma asiakas joko oikea yritys tai opet-

taja joka edustaa tyoumln tilaajaa Asiakas on kaumlytettaumlvissauml kunkin sprintin aloituspalave-

rissa toiminnallisten vaatimusten maumlaumlrittelyauml varten Kullakin ryhmaumlllauml on myoumls ohjaa-

ja jonka tehtaumlvaumlnauml on auttaa tyoumln kaumlynnistaumlmisessauml sekauml toimiminen Scrum Masteri-

na Ohjaajat eivaumlt varsinaisesti osallistu tiimin tyoumlskentelyyn

22 Ohjelmistotuotantoprojekti-kurssin kehitysympaumlristoumln yleiskuvaus

Kurssin viimeisimpiauml kehitysympaumlristoumlparannuksia on Aleksi Lukkarisen opinnaumlytetyouml-

naumlaumln tekemauml rdquoopetuskaumlyttoumloumln soveltuva virtuaalikonepohjainen kehitysympaumlristouml

3

jonka avulla innovaatioprojekteja toteuttavat opiskelijat voivat tyoumlskennellauml jatkuvan

integraation ja kaumlyttoumloumlnoton periaatteiden mukaisestirdquo [Lukkarinen 2011 tiivistelmauml]

Uusimmat parannukset kurssin tyouml- ja kehitysympaumlristoumloumln ovat taumlhaumln opinnaumlytetyoumlhoumln

kuuluva sovellus rdquoKoontardquo johon palataan vielauml taumlmaumln dokumentin loppupuolella sekauml

kurssin tyoumltiloihin tehdyt uudet laitehankinnat

Katselmus kehitysympaumlristoumloumln aloitetaan esittelemaumlllauml kurssin uudet tyoumltilat Taumlmaumln

jaumllkeen perehdytaumlaumln kurssin palvelininfrastruktuuriin

221 Kurssin tyoumltilat

Tyoumltilat ja viihtyvyys ovat olennainen osa ryhmaumlkeskeistauml tyoumlntekoa On taumlrkeaumlauml ettauml

kehitysryhmaumlllauml on tarpeeksi tilaa tyoumlskennellauml ja ryhmaumln sisaumlinen kommunikaatio toi-

mii mahdollisimman helposti Tyoumltilat liittyvaumlt myoumls olennaisesti koontiympaumlristoumln tark-

kailuun jota taumlssauml opinnaumlytetyoumlssauml kaumlsitellaumlaumln myoumlhemmin

Joulukuussa 2011 Metropolia teki uusia laitehankintoja Bulevardin toimipisteeseen Oh-

jelmistotuotantoprojekti-kurssin tyoumltiloihin Ensisijaisesti jokaisen kurssiryhmaumln tyoumltiloi-

hin oli saatava naumlyttouml jossa ajettaisiin taumlssauml opinnaumlytetyoumlssauml tehtyauml koontiympaumlristoumln

tarkkailuun soveltuvaa ohjelmaa rdquoKoontardquo

Taumlssauml luvussa kaumlydaumlaumln laumlpi kurssin tyoumltiloihin hankitut laitteet ja esitellaumlaumln tyoumltilat ko-

konaisuudessaan mukaan lukien laitteet jotka jaumlivaumlt kaumlyttoumloumln vanhasta laitekokoon-

panosta

Kuvassa 1 on esitelty yhden ryhmaumln tyoumltila Kyseisen ryhmaumln tyoumltilaan kuuluu kolme

tussitaulua joista yksi laumlhiprojektorin alla oleva toimii myoumls projektointipintana laumlhi-

projektorille Ryhmaumlllauml on kaumlytoumlssaumlaumln kuusi kannettavaa tietokonetta Tietokoneet sekauml

laumlhiprojektori ovat kiinni HDMI-valitsimessa Kuvan vasemmassa ylaumlnurkassa on mini-

tietokone sekauml naumlyttouml Minitietokone ja naumlyttouml on varattu koontiympaumlristoumln tarkkailuun

(luku 4) Ryhmauml naumlkee laitteesta ohjelmistoprojektinsa tilan reaaliajassa ja pystyy rea-

goimaan projektin tilamuutoksiin nopeasti

4

Kuva 1 Yhden ryhmaumln tyoumltila

Yksi oleellisimmista uusista laitehankinnoista on laumlhiprojektori (kuva 2) Jokaisella kurs-

sin ryhmaumlllauml on kaumlytoumlssaumlaumln yksi laumlhiprojektori Toisin kuin perinteinen projektori laumlhi-

projektori saadaan asetettua seinaumllle suoraan projektorointikohteen ylaumlpuolelle Taumlten

se vie vaumlhemmaumln tilaa kuin normaali projektori ja oli hyvauml valinta uuteen laitekokoon-

panoon

Kuva 2 Hitachi CP-AW250NM

Tyoumltiloihin hankittiin 2000 mm x 1200 mm tussitaulut jotka toimivat laumlhiprojektorien

piirtoalueina sekauml vaihtoehtoisesti tussitauluina

5

Jokaiselle ryhmaumllle hankittiin 27-tuumaiset LG E2770V -malliset LED-naumlytoumlt Naumlmauml naumly-

toumlt on tarkoitettu vain koontiympaumlristoumln tarkkailua varten Ne kestaumlvaumlt pitkaumlkestoista

kaumlyttoumlauml ja voivat olla paumlaumlllauml youmltauml paumlivaumlauml ilman ettauml kuva palaa kiinni ruutuun Naumlytoumlt

on kiinnitetty seinaumlaumln kolmi-nivelisillauml Melicone Stile DR200 -mallisilla seinaumltelineillauml

joiden avulla naumlyttoumljen kaltevuutta ja sijaintia pystytaumlaumln saumlaumltaumlmaumlaumln

Ryhmille hankitut minitietokoneet (kuva 3) ovat kiinni yllauml esitetyissauml naumlytoumlissauml Minitie-

tokoneita hallitaan langattomalla hiirellauml sekauml naumlppaumlimistoumlllauml Perinteisen poumlytaumltietoko-

neen hankkimisen sijaan paumlaumldyttiin pienempaumlaumln vaihtoehtoon jotta tyoumlskentelytilaa

jaumlisi enemmaumln

Kuva 3 HP8200 USDT -minitietokone

Taumlrkeauml osa uutta laitekokoonpanoa on HDMI-valitsin (kuva 4) Valitsin on kytkettynauml

ryhmaumln laumlhiprojektoriin sekauml ryhmaumln jaumlsenten kaumlyttaumlmiin kannettaviin tietokoneisiin

Valitsimella on taumlrkeauml rooli ryhmien viikkopalavereissa ryhmaumln paumlivittaumlisessauml tyoumlsken-

telyssauml sekauml kehitysryhmaumln ja asiakkaan vaumllisissauml tapaamisissa Valitsin mahdollistaa

sujuvamman kommunikaation ryhmaumln jaumlsenten vaumllillauml Kurssiryhmien kehittaumljaumlt saavat

nappia painamalla oman kannettavan tietokoneensa naumlkymaumln laumlhiprojektoriin

6

Kuva 4 Kramer VS-81H HDMI -valitsin

222 Kurssin palvelimet

Kurssin ryhmaumlkohtaiset palvelimet kevaumlaumlllauml 2012 ovat koontipalvelin testi- ja tuotanto-

sovelluspalvelimet sekauml testi- ja tuotantotietokantapalvelimet (kuva 5) Testipalvelimet

toimivat ryhmaumln omana hiekkalaatikkona Kehitysympaumlristoumln palvelininfrastruktuuri

koostuu kokonaisuudessaan seuraavassa kuvassa esitellyistauml palvelimista

Kuva 5 Kehitysympaumlristoumln palvelininfrastruktuuri

7

Seuraavaksi kaumlydaumlaumln laumlpi palvelimet yksitellen Kerrotaan mitauml sovelluksia kuhunkin

palvelimeen on asennettu ja mitauml ovat kunkin palvelimen tehtaumlvaumlt

Palvelimista koontiympaumlristoumln (luvut 34 4) kannalta oleellisimmassa roolissa on koon-

tipalvelin Jokaisella ryhmaumlllauml on oma koontipalvelimensa jossa ajetaan Jenkins CI -

sovellusta Jenkins CI on vastuussa projektien automaattisesta koonnista ja haumllyttaumlauml

ryhmaumllle projektin koonnin epaumlonnistuessa Jenkins CIstauml kerrotaan lisaumlauml luvussa 4

Tuotanto- ja testipalvelimia on kaksi kappaletta jokaista ryhmaumlauml kohti Tuotantoympauml-

ristoumloumln kuuluvat tuotantosovelluspalvelin sekauml tuotantotietokantapalvelin Tuotantotie-

tokantapalvelin sisaumlltaumlauml ryhmaumlkohtaiset tietokannat Tuotantosovelluspalvelin sisaumlltaumlauml

ryhmaumlkohtaiset palvelut kuten Phpn ja Javan Vastaavasti testiympaumlristoumloumln kuuluvat

testisovelluspalvelin ja testitietokantapalvelin joilla on sama toiminnallisuus kuin tuo-

tantoympaumlristoumln palvelimilla

Ryhmien kaumlytoumlssauml oleva testiympaumlristouml mahdollistaa esimerkiksi palvelinkonfiguraatioi-

den riskittoumlmaumln testaamisen ennen muutosten kaumlyttoumloumlnottoa tuotantoympaumlristoumln puo-

lella Tuotanto -ja testipalvelimet ovat virtualisoituja Palvelimien virtualisointi mahdol-

listaa palvelimen tilan tallennuksen Palvelinten oletustilat (snapshot) voidaan halutessa

ladata muistista palvelimen korruptoituessa konfiguraatiotestaamisen yhteydessauml

Jokaisella ryhmaumlllauml on siis kaumlytoumlssaumlaumln viisi ryhmaumlkohtaista palvelinta koonti- tuotanto-

sovellus- tuotantotietokanta- testisovellus- sekauml testitietokantapalvelin Taumlmaumln lisaumlksi

ryhmillauml on kaumlytoumlssaumlaumln kolme yleiskaumlyttoumlistauml palvelinta joista kerrotaan seuraavaksi

Naumlmauml palvelimet ovat versionhallinta- projektinhallinta- sekauml varmuuskopiopalvelin

Versionhallintapalvelimella sijaitsevat ryhmien kaumlytoumlssauml olevat kaksi tietovarastoa Tois-

ta tietovarastoa kaumlytetaumlaumln laumlhdekoodin taltioimiseen ja toista tietovarastoa oheistuot-

teiden kuten dokumentaation taltioimiseen Opiskelijaryhmien tietovarastojen lisaumlksi

palvelimella on innodev-tietovarasto ympaumlristoumln yllaumlpitoa ja kehitystauml varten Kuvassa 6

on esitelty esimerkki eraumlaumln ohjelmistoprojektin tietovaraston hakemistorakenteesta

8

Kuva 6 Esimerkki opiskelijaryhmaumln tietovaraston hakemistorakenteesta

Projektinhallintapalvelin sisaumlltaumlauml Agilefant-sovelluksen josta ajetaan yhtauml instanssia

kullekin kurssin ryhmaumllle Agilefant on projektinhallintasovellus joka soveltuu hyvin

ketteraumln kehityksen tarpeisiin Sitauml kaumlytetaumlaumln ryhmaumln tyoumltuntien merkkaamiseen ja

projektin kehityksen valvomiseen Agilefantista kerrotaan tarkemmin luvussa 4

Kurssiryhmien kaumlytoumlssauml olevalle varmuuskopiopalvelimelle on tarkoitus kopioida var-

muuskopiota projektinhallinta- ja versionhallintapalvelimien tiloista Varmuuskopiointi ei

ole automatisoitua jonka takia palvelimen kaumlyttoumlmaumlaumlrauml on jaumlaumlnyt pieneksi

3 Ohjelmiston kokoaminen

Ohjelmiston kokoaminen tarkoittaa yksinkertaisimmillaan ohjelmistokoodin kaumlaumlntaumlmistauml

ajettavaan muotoon Jos ohjelmisto on iso ja sen rakenne on modulaarinen voi kehit-

taumljaumlllauml olla tarve jakaa ohjelmiston kokoaminen useisiin operaatioihin joilla on keskinaumli-

siauml riippuvuuksia

Taumlssauml luvussa tutustutaan eri tapoihin toteuttaa ohjelmiston koonti Ensin perehdytaumlaumln

makefileen ja tutustutaan ohjelmiston kokoamiseen makefile-esimerkkien avulla Tauml-

9

maumln jaumllkeen perehdytaumlaumln modernimpiin koontisovelluksiin Ant ja Maven Naumlmauml luvut

ovat tarpeellisia koontiprosessin ymmaumlrtaumlmisen kannalta

31 Makefile

Makefile on tiedosto jota Unix-komento Make kaumlyttaumlauml ohjelman kokoamiseen Makefile

kuvaa ohjelman laumlhdekooditiedostojen vaumlliset riippuvuudet ja sisaumlltaumlauml ohjeet ohjelmis-

ton kaumlaumlntaumlmiseen Kaumlaumlntaumlmisen lisaumlksi makefileen voi sisaumlllyttaumlauml mitauml vain Unix-

komentoja ja siitauml voi kaumlynnistaumlauml testejauml

Otetaan esimerkkitapaus jossa C-kieliseen ohjelmistoon kuuluu 3 tiedostoa

tiedosto1c

tiedosto2c

tiedosto1h

Ilman makefileauml ohjelma kaumlaumlnnettaumlisiin Unix-komentoriviltauml seuraavanlaisesti

gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Esimerkissauml ndashI optio kertoo kaumlaumlntaumljaumllle ettauml sen tulee etsiauml header-tiedostot tyoumlkansi-

osta Gcc-kaumlaumlntaumljauml kaumlaumlntaumlauml tiedostot ja luo sovellusohjelman rdquoesimerkkirdquo Taumlmauml laumlhes-

tymistapa ohjelmiston kaumlaumlntaumlmiseen tulee vaivalloiseksi viimeistaumlaumln siinauml vaiheessa

kun projektiin lisaumltaumlaumln tiedostoja kaumlaumlntaumlmiskomento muuttuu ja se on haettava ko-

mentorivihistoriasta tai kirjoitettava uudestaan Makefilen tekeminen ratkaisee taumlmaumln

ongelman [A Simple Makefile Tutorial]

Esimerkki makefilestauml naumlyttaumlauml taumlltauml

1 esimerkki tiedosto1c tiedosto2c

2 gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Jos yllauml olevat rivit kirjoitetaan rdquoMakefilerdquo- tai rdquomakefilerdquo-nimiseen tiedostoon ja kirjoi-

tetaan komentoriville rdquomakerdquo niin suoritetaan makefileen kirjoitettu komento (rivi 2)

Make ilman optioita suorittaa automaattisesti makefilen ensimmaumlisen kohteen (target)

joka taumlssauml tapauksessa on nimeltaumlaumln rdquoesimerkkirdquo Rivillauml 1 olevat tiedosto1c ja tiedos-

to2c kertoo makelle ettauml naumliden tiedostojen olemassaolo vaaditaan kohteen suoritta-

10

miseen Korostetaan ettauml make vaatii tabulaattorin kaumlytoumln ennen jokaista komentoa

(rivi 2) [A Simple Makefile Tutorial]

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 esimerkki tiedosto1o tiedosto2o

5 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

Edellisen esimerkin riveille 1 ja 2 on lisaumltty muuttujat rdquoKAANTAJArdquo ja rdquoOPTIOTrdquo Naumliden

muuttujien muuttaminen vaikuttaa koko tiedostoon ndash taumlssauml tapauksessa ainoastaan

riviin 5

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 all esimerkki

5

6 esimerkki tiedosto1o tiedosto2o

7 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

8

9 tiedosto1o tiedosto1c

10 gcc -c tiedosto1c

11 12 tiedosto2o tiedosto2c

13 gcc -c tiedosto2c

14 15 clean

16 rm -rf o esimerkki

Edellinen esimerkki koostuu viidestauml eri kohteesta

Ensimmaumlinen kohde rdquoallrdquo suoritetaan kun Make ajetaan ilman optioita Jotta rdquoallrdquo voi-

taisiin suorittaa pitaumlauml suorittaa ensin rdquoesimerkkirdquo (rivi 6) koska rdquoallrdquo on riippuvainen

kohteesta rdquoesimerkkirdquo

Seuraavaa kohdetta rdquoesimerkkirdquo ei voi kuitenkaan suorittaa ennen kuin Make on tar-

kastanut tiedostojen rdquotiedosto1ordquo ja rdquotiedosto2ordquo aikaleimat jos aikaleimat ovat van-

hentuneet eli tiedostot ovat muuttuneet on ajettava kohteet rdquotiedosto1ordquo sekauml rdquotie-

dosto2ordquo Naumlmauml kohteet ajettuaan voi Make siirtyauml suorittamaan kohdetta rdquoesimerkkirdquo

ja taumlmaumln jaumllkeen kohdetta rdquoallrdquo jolla ei ole toteutusta

11

Kohteella rdquocleanrdquo ei ole riippuvuuksia Taumlllaista kohdetta kutsutaan komentorivillauml ko-

mennolla rdquomake cleanrdquo Rivillauml 16 oleva komento poistaa kaikki tyoumlhakemistossa sijait-

sevat rdquoordquo-paumlaumltteiset tiedostot sekauml sovellusohjelman rdquoesimerkkirdquo

Viimeisin makefile-esimerkki on yksinkertainen ohjelmiston koonti vaikka se vaikuttaa

pelkaumlstaumlaumln ohjelman kaumlaumlntaumlmiseltauml Jos yllauml olevaa esimerkkiauml haluttaisiin kehittaumlauml li-

saumlauml voitaisiin siihen lisaumltauml esimerkiksi kohde joka hakee laumlhdekoodin tietovarastosta ja

poistaa paikalliset laumlhdekoodit kovalevyltauml ohjelman kaumlaumlntaumlmisen jaumllkeen

32 Ant

Luvussa 31 tutustuttiin makefileen joka on Maken koontikuvaustiedosto Taumlssauml luvus-

sa perehdytaumlaumln koontityoumlkalu Antin kaumlyttaumlmaumlaumln Xml-muotoiseen koontikuvaukseen

Apache Ant on Java kirjasto- ja komentorivityoumlkalu jonka tehtaumlvaumlnauml on ajaa prosesseja

jotka on kuvattu koontitiedostoissa rdquokohteinardquo joilla on keskinaumlisiauml riippuvaisuuksia

Ant on paumlaumlasiallisesti Java-sovellusten koontisovellus mutta sitauml voidaan kaumlyttaumlauml myoumls

C -ja C++ -ohjelmistojen kokoamiseen Taumlssauml luvussa on esimerkki Java-ohjelmiston

koonnista

Antin kaumlyttaumljaumlt voivat kehittaumlauml omia rdquoantlibsrdquo-kirjastoja joihin sisaumlltyy omia tehtaumlviauml

(tasks) ja tyyppejauml (types) Kaumlyttaumljille tarjotaan myoumls suuri maumlaumlrauml valmiiksi tehtyjauml

kaupallisia tai avoimia rdquoantlibsrdquo kirjastoja [Apache Ant Welcome]

Ant-koontitiedosto koostuu neljaumlstauml eri elementistauml projects targets tasks ja proper-

ties

Koontitiedostossa kuvatulla projektilla on kolme attribuuttia name default sekauml base-

dir Name kuvaa projektin nimeauml ja eikauml sitauml ole pakko maumlaumlritellauml Default kuvaa koon-

titiedoston oletuskohdetta (default target) jota kutsutaan kun kohdetta ei erikseen

anneta kokoamiskomennossa Basedir maumlaumlrittelee projektin tyoumlhakemiston jota kaumlyte-

taumlaumln hakemistopolkujen selvittaumlmiseksi Taumlmaumlkaumlaumln attribuutti ei ole pakollinen Jos

basedir-atribuuttia ei maumlaumlritellauml kaumlytetaumlaumln tyoumlhakemistona samaa hakemistoa jossa

koontitiedosto sijaitsee

12

Kohteilla (targets) on riippuvuuksia muista kohteista Kuten makefilessauml voidaan koh-

teiden vaumllille rakentaa riippuvuuksia ja luoda ohjelmiston kokoamisen kannalta jaumlrkevauml

riippuvaisuuksien verkosto

Tehtaumlvaumlt (tasks) ovat suoritettavia koodirivejauml Tehtaumlvillauml voi olla useita attribuutteja

kuten tulevasta esimerkissauml naumlhdaumlaumln

Ominaisuuksilla (properties) voidaan antaa oikoteitauml (shortcuts) komentoihin tai merk-

kijonoihin joita kaumlytetaumlaumln usein koontitiedostossa Ominaisuudella on nimi- sekauml arvo-

attribuutti [Apache Ant Using Apache Ant]

1 ltproject name=MyProject default=dist basedir=gt

2 ltdescriptiongt

3 Yksinkertainen koontikuvaustiedosto

4 ltdescriptiongt

5 lt--Asetetaan julkiset ominaisuudet --gt

6 ltproperty name=src location=srcgt

7 ltproperty name=build location=buildgt

8 ltproperty name=dist location=distgt

9

10 lttarget name=initgt

11 ltmdashLuodaan aikaleima --gt

12 lttstampgt

13 ltmdashLuodaan hakemistorakenne ldquocompilerdquo tehtaumlvaumllle --gt

14 ltmkdir dir=$buildgt

15 lttargetgt

16 17 lttarget name=compile depends=initgt

18 lt--Kaumlaumlnnetaumlaumln Java-koodi $srcstauml into $buildiin --gt

19 ltjavac srcdir=$src destdir=$buildgt

20 lttargetgt

21 22 lttarget name=dist depends=compile

23 description=Generoidaan distribuutio gt

24 lt--Luodaan distribuutio kansio --gt

25 ltmkdir dir=$distlibgt

26 27 lt-- Laitetaan $build sisaumlltouml MyProject-$DSTAMPjarriin --gt

28 ltjar jarfile=$distlibMyProject $DSTAMPjar basedir=$buildgt

29 lttargetgt

30 31 lttarget name=clean

32 description=clean up gt

33 ltmdashPoistetaan $build ja $dist hakemistot --gt

34 ltdelete dir=$buildgt

13

35 ltdelete dir=$distgt

36 lttargetgt

37 ltprojectgt

[Apache Ant Using Apache Ant Example Buildfile]

Edelliseen koontikuvaukseen on maumlaumlritelty projekti jonka nimi on ldquoMyProjectrdquo Kun

tutustutaan koonnin kuvaukseen huomataan ettauml koontitiedoston projektin oletuskoh-

teella rdquodistrdquo on riippuvuus kohteeseen rdquocompilerdquo jolla on riippuvuus kohteeseen rdquoinitrdquo

Initillauml ei ole riippuvaisuuksia Taumlten ensimmaumlinen koonnin yhteydessauml ajettava kohde

onkin rdquoinitrdquo eikauml rdquodistrdquo vaikka rdquodistrdquo on koontikuvauksen oletuskohde Voidaan sanoa

ettauml koonnin paumlaumlmaumlaumlrauml on suorittaa kohde rdquodistrdquo ja paumlaumlmaumlaumlraumln saavuttamiseksi on

suoritettava kohteita joista taumlmauml on riippuvainen Riippuvuudet toimivat samalla peri-

aatteella kuin aikaisemmissa makefile-esimerkeissauml

Ohjelmiston kokoamisen yhteydessauml halutaan edellisessauml esimerkissauml saada ohjelmisto

jakeluun Jotta ohjelmisto saataisiin jakeluun on se ensin kaumlaumlnnettaumlvauml ja sitauml ennen on

luotava ohjelmiston hakemistorakenne

Jos halutaan kehittaumlauml esimerkin koontikuvausta voidaan esimerkiksi suorittaa verk-

kosivujen paumlivitystehtaumlvauml yhden kohteen sisaumlllauml ja asettaa se riippuvaiseksi kohteesta

rdquodistrdquo Naumlin ohjelmasta saadaan paumlivitetty versio jakeluun ja verkkosivuille tulee taumlstauml

automaattinen ilmoitus ohjelmiston kaumlyttaumljille

33 Maven

Luvussa 32 tutustuttiin Anttiin joka on natiivi koontityoumlkalu Seuraavaksi tutustutaan

koonti- ja projektinhallintasovellukseen Maveniin jolla voidaan kuvata koontiprosessin

lisaumlksi myoumls projektin rakenne Maven rohkaisee kaumlyttaumlmaumlaumln parhaita kaumlytaumlntoumljauml (best

practises) joita kaumlyttaumlmaumlllauml ohjelmistoprojektista toiseen siirtyessauml oppimiskynnys

uuden koontikuvauksen ymmaumlrtaumlmiseen pienenee [Maven vs Ant or Ant vs Maven]

Maven on kaumlytoumlssauml Metropolian Ohjelmistotuotantoprojekti-kurssin ohjelmistoprojekti-

en koontityoumlkaluna

Apache Maven on ohjelmistoprojektin hallintatyoumlkalu Se perustuu projekti-olio-malli -

konseptiin (Project Object Model POM) Maven kykenee kokoamaan projektin testaa-

14

maan projektin antamaan kaumlyttaumljaumllle palautetta dokumentoimaan kokoamisen ja te-

kemaumlaumln useita muita tehtaumlviauml erillisillauml Mavenin tarjoamilla lisaumlosilla (plug-ins) [Apache

Maven Project Welcome to Apache Maven]

POM on XML-tiedosto joka sisaumlltaumlauml informaatiota projektista ja yksityiskohtaisen konfi-

guraation jota Maven kaumlyttaumlauml projektin kokoamiseen POM kostuu kohteista (goals)

jotka on maumlaumlritelty pomxml -tiedostossa Kun suoritetaan erillinen tehtaumlvauml tai kohde

Maven etsii POMmia tyoumlhakemistosta lukee POMmin hakee tarvittavan konfiguraati-

on ja suorittaa kohteen

Eraumlitauml POMissa maumlaumlriteltaumlviauml konfiguraatioita ovat projektin riippuvuudet kaumlytettaumlvaumlt

lisaumlosat ajettavat kohteet ja koontiprofiilit POMiin voi maumlaumlritellauml muutakin tietoa ku-

ten projektin version kehittaumljaumlt ja postituslistat [Apache Maven Project Introduction

to the POM]

Maven on Java-tyoumlkalu joten Java taumlytyy olla asennettuna Mavenia ajavalle koneelle

Taumlmauml luku perustuu Apachen verkkosivuilla sijaitsevaan Mavenin kaumlyttoumlohjeeseen

[Apache Maven Project Maven in 5 Minutes] Seuraavaksi luetellaan eri vaiheet Ma-

ven-projektin luomiseksi

Ensin on ladattava Maven ja kaumlytaumlvauml laumlpi asennusohjeet jotka loumlytyvaumlt osoitteesta

[httpmavenapacheorgdownloadhtmlInstallation] Taumlmaumln jaumllkeen on avattava

terminaali tai komentokehote ja kirjoitettava

mvn --version

Taumlmaumln tulostaa asennetun Mavenin ja Javan versio Esimerkiksi

1 Apache Maven 303 (r1075438 2011-02-28 183109+0100)

2 Maven home Dapache-maven-303bin

3 Java version 160_25 vendor Sun Microsystems Inc

4 Java home EProgram FilesJavajdk160_25jre

5 Default locale nl_NL platform encoding Cp1252

6 OS name windows 7 version 61 arch amd64 family windows

Maven-projekti luodaan ajamalla terminaalissa Maven kohde (goal)

15

mvn archetypegenerate -DgroupId=commycompanyapp -DartifactId=my-app -

DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Ensimmaumlisellauml ajolla taumlmauml komento lataa tarvittavat Maven lisaumlosat ja muita tiedostoja

paikalliseen tietovarastoon Huomataan ettauml rdquogeneraterdquo kohde loi rdquoartifactIdrdquonauml anne-

tun hakemiston

Kirjoitetaan komentoriville

cd my-app

Taumlmaumln kansion alta loumlytyy Mavenin standardi projektirakenne

my-app

|-- pomxml

`-- src

|-- main

| `-- java

| `-- com

| `-- mycompany

| `-- app

| `-- Appjava

`-- test

`-- java

`-- com

`-- mycompany

`-- app

`-- AppTestjava

Yllauml kuvatussa hakemistorakenteessa oleva rdquosrcmainjavardquo-hakemisto sisaumlltaumlauml projek-

tin laumlhdekoodin Vastaavasti rdquosrctestjavardquo-hakemisto sisaumlltaumlauml testien laumlhdekoodin

Pomxml-tiedosto kuvaa projektin konfiguraatiota ja sisaumlltaumlauml projektin kokoamisohjeet

Esimerkkiprojektin POM naumlyttaumlauml taumlltauml

1 ltpro-

ject xmlns=httpmavenapacheorgPOM400 xmlnsxsi=httpwwww3org20

01XMLSchema-instance

2 xsischemaLocation=httpmavenapacheorgPOM400 httpmavenapacheorg

xsdmaven-400xsdgt

3 ltmodelVersiongt400ltmodelVersiongt

4

5 ltgroupIdgtcommycompanyappltgroupIdgt

6 ltartifactIdgtmy-appltartifactIdgt

16

7 ltversiongt10-SNAPSHOTltversiongt

8 ltpackaginggtjarltpackaginggt

9

10 ltnamegtMaven Quick Start Archetypeltnamegt

11 lturlgthttpmavenapacheorglturlgt

12 13 ltdependenciesgt

14 ltdependencygt

15 ltgroupIdgtjunitltgroupIdgt

16 ltartifactIdgtjunitltartifactIdgt

17 ltversiongt482ltversiongt

18 ltscopegttestltscopegt

19 ltdependencygt

20 ltdependenciesgt

21 ltprojectgt

POM-tiedosto on Maven-projektin konfiguraation ydin Se sisaumlltaumlauml suurimman osan

informaatiosta joka vaaditaan projektin kokoamiseen halutulla tavalla

Aikaisemmassa esimerkissauml ajettiin Mavenin kohde (goal) archetypegenerate ja an-

nettiin sille parametreja Etuliite archetype on lisaumlosa joka sisaumlltaumlauml kohteen generate

Taumltauml voi verrata Antin tehtaumlvaumlaumln Taumlmauml kohde loi yksinkertaisen projektin joka perus-

tuu arkkityyppiin Yleisesti Mavenin lisaumlosat koostuvat kohteista joilla on yhteinen paumlauml-

tarkoitus Esimerkki taumlllaisesta lisaumlosasta on jboss-maven-plugin jonka tehtaumlvaumlnauml on

kaumlsitellauml erinaumlisiauml Jboss-komponentteja (items)

Maven-projekti kootaan komentoriviltauml seuraavanlaisesti

mvn package

Komentorivi tulostaa eri komentoja tulostus loppuu seuraavanlaisesti

[INFO] --------------------------

[INFO] BUILD SUCCESSFUL

[INFO] --------------------------

[INFO] Total time 2 seconds

[INFO] Finished at Thu Jul 07 213452 CEST 2011

[INFO] Final Memory 3M6M

[INFO] --------------------------

Toisin kuin ensimmaumliseksi suoritetussa komennossa (archetypegenerate) huomataan

taumlllauml kertaa kaumlytetty komento package on vain yksi sana Taumlllaista komentoa kutsutaan

17

kohteen (goal) sijaan vaiheeksi (phase) Vaihe on yksi askel koonnin elinkaaressa

(build lifecycle) joka on jaumlrjestetty sarja eri vaiheita Jos esimerkiksi ajetaan vaiheen

compile Maven itseasiassa suorittaa sarjan vaiheita

1 validate

2 generate-sources

3 process-sources

4 generate-resources

5 process-resources

6 compile

Compilen ajamisen jaumllkeen voidaan testata kaumlaumlnnettyauml JARia seuraavalla komennolla

java -cp targetmy-app-10-SNAPSHOTjar commycompanyappApp

Taumlmauml komento tulostaa

Hello World

Kaumlydaumlaumln laumlpi vielauml eri Mavenin yleisimmaumlt oletuselinkaaressa kaumlytetyt vaiheet Naumlitauml

ovat

-validate varmistaa ettauml projekti on ehjauml ja kaikki tarvittava tieto on saatavilla

-compile kaumlaumlntaumlauml projektin laumlhdekoodin

-test testaa kaumlaumlnnetyn laumlhdekoodin kaumlyttaumlen sopivaa yksikkoumltestikehystauml Naumliden

testien ei tulisi vaatia vaiheita package tai deploy

-package paketoi kaumlaumlnnetyn koodin sen jaettavaan muotoon esimerkiksi JARriksi

-integration-test prosessoi ja jaumlrjestaumlauml paketin ympaumlristoumloumln jossa integraatiotestejauml

voidaan ajaa jos tarpeellista

-verify tarkistaa onko paketti validi ja taumlyttaumlaumlkouml se laatukriteerit

-install asentaa paketin paikalliseen tietovarastoon muiden paikallisten projektien

kaumlyttoumloumln tai paikallisten projektien riippuvuudeksi

-deploy kopioi lopullisen paketin ulkoiseen tietovarastoon jaettavaksi muille kehittaumljil-

le ja projekteille Tehdaumlaumln integraatio- tai julkaisuympaumlristoumlssauml

On vielauml kaksi muuta mainitsemisen arvoista Maven-elinkaarta jotka eivaumlt sisaumllly yllauml

listattuun oletuselinkaareen Naumlitauml ovat

18

-clean poistaa aikaisempien koontien yhteydessauml luodut artifaktit

-site generoi verkkodokumentaation kyseiselle projektille

Jokainen vaihe sisaumlltaumlauml sarjan suoritettavia kohteita joiden ajaminen riippuu projektin

paketointityypistauml Jos projektin tyyppi on JAR niin package ajaa kohteen jarjar Vas-

taavasti WAR -tyyppisen projektin package -vaihe suorittaa kohteen warwar

34 Koonti ja kaumlyttoumloumlnotto

Ohjelmiston saattamista laumlhdekoodista loppukaumlyttaumljaumllle kaumlyttoumlkelpoiseen muotoon kut-

sutaan koonniksi Laumlhdekoodin kaumlaumlntaumlmisen lisaumlksi koonti voi sisaumlltaumlauml monia muita vai-

heita Aleksi Lukkarinen on opinnaumlytetyoumlssaumlaumln listannut esimerkkejauml erilaisista koon-

neista seuraavasti [Aleksi Lukkarinen opinnaumlytetyouml]

-ohjelmointikielisen laumlhdekoodin sekauml resurssien automatisoitua luomista

-eri ohjelmointikielillauml tuotetun laumlhdekoodin kaumlaumlntaumlmistauml kone- jatai vaumllikielille

-vaumlli- tai konekielisen ohjelmakoodin jaumllkikaumlsittelyauml esimerkiksi testauksen aspektioh-

jelmoinnin tai koodin tarkoituksellisen sotkemisen vuoksi

-sovelluksen testausta (esimerkiksi toimivuus tietoturvallisuus suorituskyky rakenteel-

linen ja koodaustekninen laatu sekauml kaumlyttoumltarkoitustaan vastaavuus)

-dokumentaation koontia (kuten varsinaisen sovelluksen koonti)

-koontituotteiden paketointia sekauml mahdollisten fyysisten jakelumedioiden luontia toi-

mivuus- ja virustarkistuksineen

-ohjelmistomoduulien integrointia

-palautteen antamista koonnin tuloksista

Lukkarinen jaumlsentelee opinnaumlytetyoumlssaumlaumln sovelluksen jakeluun ja kaumlyttoumloumlnottoon sisaumll-

tyviksi asioiksi

-Sovellusta suorittavien ja tukevien palvelinympaumlristoumljen luominen ja paumlivittaumlminen

-Sovelluksen sekauml sen kaumlyttaumlmien ohjelmistokomponenttien siirtaumlminen ja maumlaumlrittaumlmi-

nen esimerkiksi testaus- laadunvarmistus- esittely-koulutus- sekauml tuotantoympaumlris-

toumlihin Kohdeympaumlristoumlissauml olevat vanhat versiot on mahdollisesti paumlivitettaumlvauml jollei

uusia versiota asenneta niiden rinnalle

19

-Uusien tietokantojen luominen sekauml vanhojen paumlivittaumlminen uutta sovellusversiota

vastaaviksi

-Kirjanpidollisen materiaalin tuottaminen ja yllaumlpitaumlminen

-Palautteen antaminen jakelu- ja kaumlyttoumloumlnottoprosessin onnistumisesta

Taumlmaumln luvun tarkoitus oli perehdyttaumlauml lukija ymmaumlrtaumlmaumlaumln koontiprosessia koontiku-

vaus-esimerkkien avulla Koontiprosessin ymmaumlrtaumlminen on vaumllttaumlmaumltoumlntauml seuraavan

luvun ymmaumlrtaumlmiseen jossa perehdytaumlaumln koontiympaumlristouml -kaumlsitteeseen

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant

Taumlssauml luvussa luodaan nopea katsaus koonti- ja kaumlyttoumloumlnottoprosessien automatisoimi-

seen tutustutaan jatkuvaan integraatioon sekauml sovellukseen Jenkins CI

Lisaumlksi tutustutaan projektihallintaohjelmaan Agilefant Agilefant on yksi monipuoli-

simmista kevyistauml vapaan laumlhdekoodin projektinhallintasovelluksista ja se soveltuu

niin pieniin kuin suuriinkin projekteihin

Naumlmauml sovellukset esitellaumlaumln pohjustuksena lukuja 5 ja 6 varten joissa tutustutaan

koontiympaumlristoumln tarkkailuun

41 Jatkuva integraatio

Jatkuva integraatio (Continuous Integration CI) on modernin sovelluskehityksen kul-

makivi Itse asiassa se on mullistanut sovelluskehityksen Kun jatkuva integraatio ote-

taan kaumlyttoumloumln organisaatiossa se muuttaa radikaalisti sitauml miten tyoumlryhmauml ymmaumlrtaumlauml

koko kehitysprosessin Jatkuvalla integraatiolla on potentiaalia laukaista sarja paran-

nuksia organisaation tuotteen kehitysprosessiin Se alkaa yksinkertaisesta automaatti-

sesta koonnista kehittyen systeemiksi joka automaattisesti saattaa tuotteen tuotan-

toon Hyvauml CI-infrastruktuuri mahdollistaa virheiden helpon sekauml nopean huomaamisen

ja tarjoaa kojelaudan projektin hyvinvoinnin ja muiden statistiikkojen seuraamiseen

sekauml kehittaumljille ettauml muille projektin osapuolille Jenkins The Definite Guiden mukaan

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 2: Joakim Sandqvist - Theseus

Tiivistelmauml

Tekijauml Otsikko Sivumaumlaumlrauml Aika

Joakim Sandqvist Koonnin monitorointi 44 sivua + 0 liitettauml 1952012

Tutkinto Insinoumloumlri (AMK)

Koulutusohjelma Tietotekniikka

Suuntautumisvaihtoehto Ohjelmistotekniikka

Ohjaajat

Yliopettaja Erja Nikunen Yliopettaja Auvo Haumlkkinen

Jatkuva integraatio taumlhtaumlauml projektityoumlskentelyn sekauml ohjelmistotuotteen kehittaumlmisen hel-pottamiseen Ohjelmistotuote on tarkoitus saada valmiiksi mahdollisimman kivuttomasti ja kehitysprosessissa olisi hyvauml toumlrmaumltauml mahdollisimman vaumlhaumln kehittaumljien ohjelmoimien oh-jelmistomoduulien tai -komponenttien vaumllisiin konflikteihin Jotta konfliktit ohjelmistomoduulien ja -komponenttien vaumllillauml huomattaisiin mahdollisim-man nopeasti tarvitaan tapa ilmoittaa konfliktin tapahtumisesta eli koonnin epaumlonnistu-misesta kehitysryhmaumllle ja muille projektin osapuolille mahdollisimman nopeasti Perintei-nen tapa taumlmaumln tekemiseen on laumlhettaumlauml eri osapuolille saumlhkoumlpostia Taumlmauml ei kuitenkaan ole paras eikauml huonoin tapa vaan yksi monista tavoista vaumllittaumlauml informaatio koonnin tilasta kehitysryhmaumllle Opinnaumlytetyoumlssauml tullaan esittelemaumlaumln erilaisia ratkaisuja informatiivisen kehitysympaumlristoumln rakentamiseen Taumlmauml opinnaumlytetyouml tehtiin Metropolia Ammattikorkeakoulun Bulevardin toimipisteelle Yksi opinnaumlytetyoumln tavoitteista oli suunnitella ja ohjelmoida reaaliajassa toimiva koontiympaumlris-toumln tarkkailuun soveltuva ohjelmisto Ohjelmistotuotantoprojekti-kurssille Sovellus voidaan luokitella osaksi kehitys- sekauml tyoumlympaumlristoumlauml Opinnaumlytetyoumlssauml kerrataan jatkuvaan integraation liittyvaumlt perusasiat sekauml perehdytaumlaumln koontiympaumlristoumln tarkkailumenetelmiin Taumlssauml dokumentissa esitellaumlaumln myoumls opinnaumlyte-tyoumln konkreettinen osa Java-sovellus rdquoKoontardquo ja esitellaumlaumln kurssin uusi kehitysympaumlristouml Tyoumln lopputuloksena saatiin valmiiksi Java-sovellus Koonta jonka tarkoitus on antaa oh-jelmistokehitysryhmaumllle suoraa palautetta ohjelmistoprojektin tilasta Ohjelmistossa ei ole vielauml kaikkea asiakkaan haluamaa toiminnallisuutta mutta ohjelmiston kehittaumlmistauml jatke-taan opinnaumlytetyoumln valmistumisen jaumllkeen

Avainsanat jatkuva integraatio koonti Jenkins CI Java Agilefant

Abstract

Author(s) Title Number of Pages Date

Joakim Sandqvist Monitoring the Build Environment 44 pages + 0 appendices 19 May 2012

Degree Bachelor of Engineering

Degree Programme Information and Communications Technology

Specialisation option Software Engineering

Instructor(s)

Erja Nikunen Principal Lecturer Auvo Haumlkkinen Principal Lecturer

Continuous integration aims to ease project management and the software development process The goal is to have a software development process that has as few component and module conflicts as possible For the development team to be able to react to conflicts swiftly a convenient way to feedback the team is needed Did the build fail Who broke it Feedback can be produced in the form of e-mail This is not the best nor is this the worst way to feedback the team This is one of the many ways to notify the development team of a broken build This doc-ument offers a look at some of the feedback methods and presents an example of an in-formative development environment The thesis was carried out for the Degree Programme of Information and Communications Technology of the Helsinki Metropolia University of Applied Sciences The object was to design and program a piece of software for monitoring the build environment in real time The piece of software is to be used by the students in the Software Development Project course to monitor their Jenkins CI build activities The thesis goes through the basics of continuous integration as well as introduces differ-ent build environment monitoring methods The concrete part of the study the Java based software ldquoKoontardquo is presented and the work and development environments of the course in question are introduced as well

Keywords continuous integration building Jenkins CI Agilefant Java

Sisaumlllys

Lyhenteet ja maumlaumlritelmaumlt

1 Johdanto 1

2 Ohjelmistotuotantoprojekti -kurssi 2

21 Ohjelmistotuotantoprojekti-kurssin yleiskuvaus 2

22 Ohjelmistotuotantoprojekti-kurssin kehitysympaumlristoumln yleiskuvaus 2

221 Kurssin tyoumltilat 3

222 Kurssin palvelimet 6

3 Ohjelmiston kokoaminen 8

31 Makefile 9

32 Ant 11

33 Maven 13

34 Koonti ja kaumlyttoumloumlnotto 18

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant 19

41 Jatkuva integraatio 19

42 Jenkins CI 21

43 Agilefant 25

5 Koontiympaumlristoumln tarkkailu 28

51 Yleistauml koontiympaumlristoumln tarkkailusta 28

52 Vaumllittoumlmaumln palautteen laitteet 29

521 The Code Flow-O-Meter 30

522 Smell-O-Mat 31

6 Koontiympaumlristoumlntarkkailu sovellus 32

61 Sovelluksen toiminnallisuus 33

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri 39

7 Yhteenveto 43

Laumlhteet 45

Lyhenteet ja maumlaumlritelmaumlt

Agilefant Ketterien ohjelmistotuotantomenetelmien mukaisiin projekteihin soveltuva projektinhallintatyoumlkalu

Apache Ant Java-pohjainen koontityoumlkalu Katso luku 32

Apache Maven

Koontityoumlkalu Katso luku 33

CI Continuous Integration Jatkuva integraatio

CI-infrastruktuuri

Jatkuvan integraation toteutuksen perusrakenne Muodostuu niistauml palve-

luista ja rakenteista jotka mahdollistavat jatkuvan integraation toimin-

nan

CI-palvelu Jatkuva integraatio palvelu Esim koontipalvelimella sijaitseva jatkuvan

integraation palvelinsovellus

IDE Integrated Development Environment Integrated Design Environment

Kaikki keskeiset sovelluskehitykseen liittyvaumlt tyoumlkalut integroiva sovellus

Jatkuva integraatio

Prosessi jossa sovellusta kaumlaumlnnetaumlaumln testataan ja integroidaan jatkuvasti

kehityksen aikana

Jenkins CI Integraatiopalvelinsovellus Koontipalvelinsovellus

Kehitysympaumlristoumlinfrastruktuuri

Kehitysympaumlristoumln perusrakenne Muodostuu niistauml palveluista ja raken-

teista jotka mahdollistavat kehitysympaumlristoumln toiminnan

Koontityoumlkalu

Koontiprosessin automatisoiva tyoumlkalu

Koontipalvelin

Palvelin jolla koonti suoritetaan

Make Yksi vanhimmista ja suosituimmista koontityoumlkaluista

Projektioliomalli

Mavenin prosessikuvaus tyypillisesti nimetty pomxmlksi

Prosessikuvaus

Koontityoumlkalulle syoumltettaumlvauml kuvaus joka maumlaumlrittelee koontiprosessin Pro-

sessikuvauksen sisaumlltaumlvaumlauml tiedostoa voidaan kutsua koontitiedostoksi tai

koontikuvaustiedostoksi

Scrum Ketteraumlssauml kehityksessauml kaumlytetty projektinhallintamenetelmauml

Subversion Versionhallintasovellus

RSS-syoumlte RSS-feed Tarkoittaa mm Real Simple Syndication Hyvauml tapa levittaumlauml

usein paumlivittyvaumlauml tietoa eri laumlhteisiin

Versionhallintapalvelin

Versionhallintasovellusta kuten Subversionia ajava palvelin

XF-laite Extreme Feedback Device Extreme Notification Device Laite joka antaa

suoraa palautetta koonnin tilasta

1

1 Johdanto

Taumlssauml opinnaumlytetyoumlssauml esitellaumlaumln Metropolia Ammattikorkeakoulun Ohjelmistotuontato-

projekti-kurssin kaumlytoumlssauml oleva kehitysympaumlristouml Taumlmaumln kehitysympaumlristoumln esittelemi-

sen tyoumlympaumlristoumlineen palvelimineen ja palvelinsovelluksineen on tarkoitus toimia

suuntaa antavana materiaalina niin pienten kuin suurienkin ohjelmistoprojektien koon-

tiympaumlristoumljen ja informatiivisten kehitysympaumlristoumljen rakentamiseen

Metropolia Ammattikorkeakoulun opiskelijat tekevaumlt Ohjelmistotuotantoprojekti-

kurssilla asiakkaan tilaaman ohjelmistotuotteen Opiskelijat suunnittelevat ja ohjelmoi-

vat tuotteen alusta loppuun Opiskelijoilla on kaumlytoumlssaumlaumln moderni kehitysympaumlristouml

jota kehitetaumlaumln entisestaumlaumln koko ajan Kehitysympaumlristouml koostuu tyoumltilojen laiteratkai-

suista tyoumlasemien sovelluksista sekauml palvelin- ja palvelinsovellusinfrastruktuurista

Taumlssauml dokumentissa tullaan esittelemaumlaumln opinnaumlytetyoumlssauml ohjelmoitu Metropolian Oh-

jelmistotuotantoprojekti-kurssin kaumlyttoumloumln tarkoitettu koontiympaumlristoumln monitorointi

sovellus rdquoKoontardquo Sovelluksen tarkoitus on antaa kurssin tyoumlryhmille reaaliaikaista pa-

lautetta ohjelmistoprojektin koonnin tilasta

Luvussa 2 tutustutaan ohjelmistotuotantoprojekti-kurssin sisaumlltoumloumln kehitysympaumlristoumloumln

sekauml tyoumltiloihin Taumlmaumln jaumllkeen luvussa 3 perehdytaumlaumln ohjelmiston kokoamiseen kaumly-

maumlllauml laumlpi erilaisia koontiprosesseja eri koontityoumlkaluilla

Luvussa 4 kerrotaan jatkuvasta integraatiosta sekauml koontiympaumlristoumlstauml Lisaumlksi esitel-

laumlaumln sovellukset Jenkins CI sekauml Agilefant jotka liittyvaumlt vahvasti lukujen 5 ja 6 aihee-

seen koontiympaumlristoumln tarkkailu

Lopuksi luvussa 6 esitellaumlaumln opinnaumlytetyoumlssauml tehty Java-sovellus rdquoKoontardquo Taumlssauml lu-

vussa kaumlydaumlaumln laumlpi hieman sovelluksen ohjelmointiprosessia ja perehdytaumlaumln sovelluk-

sen toiminnallisuuteen sekauml arkkitehtuuriin yksityiskohtaisesti

2

2 Ohjelmistotuotantoprojekti -kurssi

Taumlssauml luvussa perehdytaumlaumln Metropolia Ammattikorkeakoulun Ohjelmistotuotantoprojek-

ti-kurssiin Luvun tarkoitus on antaa lukijalle hyvauml yleiskuva kurssin sisaumllloumlstauml tyoumltilois-

ta sekauml kehitysympaumlristoumlstauml

21 Ohjelmistotuotantoprojekti-kurssin yleiskuvaus

Opiskelijat paumlaumlsevaumlt soveltamaan kurssilla useita aiemmilla tietotekniikan kursseilla

opittuja tietoja ja taitoja Tyouml on projektiluontoinen Kuhunkin ryhmaumlaumln kuuluu 4-6

opiskelijaa ja ryhmiauml on yhteensauml 2-4 Projekti kestaumlauml kahden periodin ajan ja sen

kokonaistyoumlmaumlaumlrauml on noin 800-1200 tyoumltuntia

Ohjelmiston kehittaumlmiseen kaumlytetaumlaumln Scrum-ketteraumlauml menetelmaumlauml Scrumin tyoumlvaiheet

koostuvat sprinteistauml joita taumlssauml projektissa on viisi kappaletta Jokaista sprinttiauml edel-

taumlauml aloituspalaveri jossa sovitaan kyseisen sprintin tehtaumlvaumlt ja tavoite Ydinroolit

Scrumissa ovat tuotteen omistaja tiimi sekauml Scrum Master Kurssin tyoumlryhmien Scrum

Mastereina toimivat opettajat Tiimit koostuvat kurssin tyoumlryhmistauml ja tuotteen immate-

riaalioikeudet omistaa Metropolia Oy joka puolestaan antaa tuotteen kaumlyttoumloikeudet

projektiin osallistuneille tahoille Taumlmauml on toimintapa yleensauml mutta asiakkaasta riip-

puen tehdaumlaumln erilaisia sopimuksia

Jokainen kurssin ryhmauml maumlaumlrittelee suunnittelee toteuttaa testaa sekauml dokumentoi

suurehkon ohjelmiston Jokaisella projektilla on oma asiakas joko oikea yritys tai opet-

taja joka edustaa tyoumln tilaajaa Asiakas on kaumlytettaumlvissauml kunkin sprintin aloituspalave-

rissa toiminnallisten vaatimusten maumlaumlrittelyauml varten Kullakin ryhmaumlllauml on myoumls ohjaa-

ja jonka tehtaumlvaumlnauml on auttaa tyoumln kaumlynnistaumlmisessauml sekauml toimiminen Scrum Masteri-

na Ohjaajat eivaumlt varsinaisesti osallistu tiimin tyoumlskentelyyn

22 Ohjelmistotuotantoprojekti-kurssin kehitysympaumlristoumln yleiskuvaus

Kurssin viimeisimpiauml kehitysympaumlristoumlparannuksia on Aleksi Lukkarisen opinnaumlytetyouml-

naumlaumln tekemauml rdquoopetuskaumlyttoumloumln soveltuva virtuaalikonepohjainen kehitysympaumlristouml

3

jonka avulla innovaatioprojekteja toteuttavat opiskelijat voivat tyoumlskennellauml jatkuvan

integraation ja kaumlyttoumloumlnoton periaatteiden mukaisestirdquo [Lukkarinen 2011 tiivistelmauml]

Uusimmat parannukset kurssin tyouml- ja kehitysympaumlristoumloumln ovat taumlhaumln opinnaumlytetyoumlhoumln

kuuluva sovellus rdquoKoontardquo johon palataan vielauml taumlmaumln dokumentin loppupuolella sekauml

kurssin tyoumltiloihin tehdyt uudet laitehankinnat

Katselmus kehitysympaumlristoumloumln aloitetaan esittelemaumlllauml kurssin uudet tyoumltilat Taumlmaumln

jaumllkeen perehdytaumlaumln kurssin palvelininfrastruktuuriin

221 Kurssin tyoumltilat

Tyoumltilat ja viihtyvyys ovat olennainen osa ryhmaumlkeskeistauml tyoumlntekoa On taumlrkeaumlauml ettauml

kehitysryhmaumlllauml on tarpeeksi tilaa tyoumlskennellauml ja ryhmaumln sisaumlinen kommunikaatio toi-

mii mahdollisimman helposti Tyoumltilat liittyvaumlt myoumls olennaisesti koontiympaumlristoumln tark-

kailuun jota taumlssauml opinnaumlytetyoumlssauml kaumlsitellaumlaumln myoumlhemmin

Joulukuussa 2011 Metropolia teki uusia laitehankintoja Bulevardin toimipisteeseen Oh-

jelmistotuotantoprojekti-kurssin tyoumltiloihin Ensisijaisesti jokaisen kurssiryhmaumln tyoumltiloi-

hin oli saatava naumlyttouml jossa ajettaisiin taumlssauml opinnaumlytetyoumlssauml tehtyauml koontiympaumlristoumln

tarkkailuun soveltuvaa ohjelmaa rdquoKoontardquo

Taumlssauml luvussa kaumlydaumlaumln laumlpi kurssin tyoumltiloihin hankitut laitteet ja esitellaumlaumln tyoumltilat ko-

konaisuudessaan mukaan lukien laitteet jotka jaumlivaumlt kaumlyttoumloumln vanhasta laitekokoon-

panosta

Kuvassa 1 on esitelty yhden ryhmaumln tyoumltila Kyseisen ryhmaumln tyoumltilaan kuuluu kolme

tussitaulua joista yksi laumlhiprojektorin alla oleva toimii myoumls projektointipintana laumlhi-

projektorille Ryhmaumlllauml on kaumlytoumlssaumlaumln kuusi kannettavaa tietokonetta Tietokoneet sekauml

laumlhiprojektori ovat kiinni HDMI-valitsimessa Kuvan vasemmassa ylaumlnurkassa on mini-

tietokone sekauml naumlyttouml Minitietokone ja naumlyttouml on varattu koontiympaumlristoumln tarkkailuun

(luku 4) Ryhmauml naumlkee laitteesta ohjelmistoprojektinsa tilan reaaliajassa ja pystyy rea-

goimaan projektin tilamuutoksiin nopeasti

4

Kuva 1 Yhden ryhmaumln tyoumltila

Yksi oleellisimmista uusista laitehankinnoista on laumlhiprojektori (kuva 2) Jokaisella kurs-

sin ryhmaumlllauml on kaumlytoumlssaumlaumln yksi laumlhiprojektori Toisin kuin perinteinen projektori laumlhi-

projektori saadaan asetettua seinaumllle suoraan projektorointikohteen ylaumlpuolelle Taumlten

se vie vaumlhemmaumln tilaa kuin normaali projektori ja oli hyvauml valinta uuteen laitekokoon-

panoon

Kuva 2 Hitachi CP-AW250NM

Tyoumltiloihin hankittiin 2000 mm x 1200 mm tussitaulut jotka toimivat laumlhiprojektorien

piirtoalueina sekauml vaihtoehtoisesti tussitauluina

5

Jokaiselle ryhmaumllle hankittiin 27-tuumaiset LG E2770V -malliset LED-naumlytoumlt Naumlmauml naumly-

toumlt on tarkoitettu vain koontiympaumlristoumln tarkkailua varten Ne kestaumlvaumlt pitkaumlkestoista

kaumlyttoumlauml ja voivat olla paumlaumlllauml youmltauml paumlivaumlauml ilman ettauml kuva palaa kiinni ruutuun Naumlytoumlt

on kiinnitetty seinaumlaumln kolmi-nivelisillauml Melicone Stile DR200 -mallisilla seinaumltelineillauml

joiden avulla naumlyttoumljen kaltevuutta ja sijaintia pystytaumlaumln saumlaumltaumlmaumlaumln

Ryhmille hankitut minitietokoneet (kuva 3) ovat kiinni yllauml esitetyissauml naumlytoumlissauml Minitie-

tokoneita hallitaan langattomalla hiirellauml sekauml naumlppaumlimistoumlllauml Perinteisen poumlytaumltietoko-

neen hankkimisen sijaan paumlaumldyttiin pienempaumlaumln vaihtoehtoon jotta tyoumlskentelytilaa

jaumlisi enemmaumln

Kuva 3 HP8200 USDT -minitietokone

Taumlrkeauml osa uutta laitekokoonpanoa on HDMI-valitsin (kuva 4) Valitsin on kytkettynauml

ryhmaumln laumlhiprojektoriin sekauml ryhmaumln jaumlsenten kaumlyttaumlmiin kannettaviin tietokoneisiin

Valitsimella on taumlrkeauml rooli ryhmien viikkopalavereissa ryhmaumln paumlivittaumlisessauml tyoumlsken-

telyssauml sekauml kehitysryhmaumln ja asiakkaan vaumllisissauml tapaamisissa Valitsin mahdollistaa

sujuvamman kommunikaation ryhmaumln jaumlsenten vaumllillauml Kurssiryhmien kehittaumljaumlt saavat

nappia painamalla oman kannettavan tietokoneensa naumlkymaumln laumlhiprojektoriin

6

Kuva 4 Kramer VS-81H HDMI -valitsin

222 Kurssin palvelimet

Kurssin ryhmaumlkohtaiset palvelimet kevaumlaumlllauml 2012 ovat koontipalvelin testi- ja tuotanto-

sovelluspalvelimet sekauml testi- ja tuotantotietokantapalvelimet (kuva 5) Testipalvelimet

toimivat ryhmaumln omana hiekkalaatikkona Kehitysympaumlristoumln palvelininfrastruktuuri

koostuu kokonaisuudessaan seuraavassa kuvassa esitellyistauml palvelimista

Kuva 5 Kehitysympaumlristoumln palvelininfrastruktuuri

7

Seuraavaksi kaumlydaumlaumln laumlpi palvelimet yksitellen Kerrotaan mitauml sovelluksia kuhunkin

palvelimeen on asennettu ja mitauml ovat kunkin palvelimen tehtaumlvaumlt

Palvelimista koontiympaumlristoumln (luvut 34 4) kannalta oleellisimmassa roolissa on koon-

tipalvelin Jokaisella ryhmaumlllauml on oma koontipalvelimensa jossa ajetaan Jenkins CI -

sovellusta Jenkins CI on vastuussa projektien automaattisesta koonnista ja haumllyttaumlauml

ryhmaumllle projektin koonnin epaumlonnistuessa Jenkins CIstauml kerrotaan lisaumlauml luvussa 4

Tuotanto- ja testipalvelimia on kaksi kappaletta jokaista ryhmaumlauml kohti Tuotantoympauml-

ristoumloumln kuuluvat tuotantosovelluspalvelin sekauml tuotantotietokantapalvelin Tuotantotie-

tokantapalvelin sisaumlltaumlauml ryhmaumlkohtaiset tietokannat Tuotantosovelluspalvelin sisaumlltaumlauml

ryhmaumlkohtaiset palvelut kuten Phpn ja Javan Vastaavasti testiympaumlristoumloumln kuuluvat

testisovelluspalvelin ja testitietokantapalvelin joilla on sama toiminnallisuus kuin tuo-

tantoympaumlristoumln palvelimilla

Ryhmien kaumlytoumlssauml oleva testiympaumlristouml mahdollistaa esimerkiksi palvelinkonfiguraatioi-

den riskittoumlmaumln testaamisen ennen muutosten kaumlyttoumloumlnottoa tuotantoympaumlristoumln puo-

lella Tuotanto -ja testipalvelimet ovat virtualisoituja Palvelimien virtualisointi mahdol-

listaa palvelimen tilan tallennuksen Palvelinten oletustilat (snapshot) voidaan halutessa

ladata muistista palvelimen korruptoituessa konfiguraatiotestaamisen yhteydessauml

Jokaisella ryhmaumlllauml on siis kaumlytoumlssaumlaumln viisi ryhmaumlkohtaista palvelinta koonti- tuotanto-

sovellus- tuotantotietokanta- testisovellus- sekauml testitietokantapalvelin Taumlmaumln lisaumlksi

ryhmillauml on kaumlytoumlssaumlaumln kolme yleiskaumlyttoumlistauml palvelinta joista kerrotaan seuraavaksi

Naumlmauml palvelimet ovat versionhallinta- projektinhallinta- sekauml varmuuskopiopalvelin

Versionhallintapalvelimella sijaitsevat ryhmien kaumlytoumlssauml olevat kaksi tietovarastoa Tois-

ta tietovarastoa kaumlytetaumlaumln laumlhdekoodin taltioimiseen ja toista tietovarastoa oheistuot-

teiden kuten dokumentaation taltioimiseen Opiskelijaryhmien tietovarastojen lisaumlksi

palvelimella on innodev-tietovarasto ympaumlristoumln yllaumlpitoa ja kehitystauml varten Kuvassa 6

on esitelty esimerkki eraumlaumln ohjelmistoprojektin tietovaraston hakemistorakenteesta

8

Kuva 6 Esimerkki opiskelijaryhmaumln tietovaraston hakemistorakenteesta

Projektinhallintapalvelin sisaumlltaumlauml Agilefant-sovelluksen josta ajetaan yhtauml instanssia

kullekin kurssin ryhmaumllle Agilefant on projektinhallintasovellus joka soveltuu hyvin

ketteraumln kehityksen tarpeisiin Sitauml kaumlytetaumlaumln ryhmaumln tyoumltuntien merkkaamiseen ja

projektin kehityksen valvomiseen Agilefantista kerrotaan tarkemmin luvussa 4

Kurssiryhmien kaumlytoumlssauml olevalle varmuuskopiopalvelimelle on tarkoitus kopioida var-

muuskopiota projektinhallinta- ja versionhallintapalvelimien tiloista Varmuuskopiointi ei

ole automatisoitua jonka takia palvelimen kaumlyttoumlmaumlaumlrauml on jaumlaumlnyt pieneksi

3 Ohjelmiston kokoaminen

Ohjelmiston kokoaminen tarkoittaa yksinkertaisimmillaan ohjelmistokoodin kaumlaumlntaumlmistauml

ajettavaan muotoon Jos ohjelmisto on iso ja sen rakenne on modulaarinen voi kehit-

taumljaumlllauml olla tarve jakaa ohjelmiston kokoaminen useisiin operaatioihin joilla on keskinaumli-

siauml riippuvuuksia

Taumlssauml luvussa tutustutaan eri tapoihin toteuttaa ohjelmiston koonti Ensin perehdytaumlaumln

makefileen ja tutustutaan ohjelmiston kokoamiseen makefile-esimerkkien avulla Tauml-

9

maumln jaumllkeen perehdytaumlaumln modernimpiin koontisovelluksiin Ant ja Maven Naumlmauml luvut

ovat tarpeellisia koontiprosessin ymmaumlrtaumlmisen kannalta

31 Makefile

Makefile on tiedosto jota Unix-komento Make kaumlyttaumlauml ohjelman kokoamiseen Makefile

kuvaa ohjelman laumlhdekooditiedostojen vaumlliset riippuvuudet ja sisaumlltaumlauml ohjeet ohjelmis-

ton kaumlaumlntaumlmiseen Kaumlaumlntaumlmisen lisaumlksi makefileen voi sisaumlllyttaumlauml mitauml vain Unix-

komentoja ja siitauml voi kaumlynnistaumlauml testejauml

Otetaan esimerkkitapaus jossa C-kieliseen ohjelmistoon kuuluu 3 tiedostoa

tiedosto1c

tiedosto2c

tiedosto1h

Ilman makefileauml ohjelma kaumlaumlnnettaumlisiin Unix-komentoriviltauml seuraavanlaisesti

gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Esimerkissauml ndashI optio kertoo kaumlaumlntaumljaumllle ettauml sen tulee etsiauml header-tiedostot tyoumlkansi-

osta Gcc-kaumlaumlntaumljauml kaumlaumlntaumlauml tiedostot ja luo sovellusohjelman rdquoesimerkkirdquo Taumlmauml laumlhes-

tymistapa ohjelmiston kaumlaumlntaumlmiseen tulee vaivalloiseksi viimeistaumlaumln siinauml vaiheessa

kun projektiin lisaumltaumlaumln tiedostoja kaumlaumlntaumlmiskomento muuttuu ja se on haettava ko-

mentorivihistoriasta tai kirjoitettava uudestaan Makefilen tekeminen ratkaisee taumlmaumln

ongelman [A Simple Makefile Tutorial]

Esimerkki makefilestauml naumlyttaumlauml taumlltauml

1 esimerkki tiedosto1c tiedosto2c

2 gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Jos yllauml olevat rivit kirjoitetaan rdquoMakefilerdquo- tai rdquomakefilerdquo-nimiseen tiedostoon ja kirjoi-

tetaan komentoriville rdquomakerdquo niin suoritetaan makefileen kirjoitettu komento (rivi 2)

Make ilman optioita suorittaa automaattisesti makefilen ensimmaumlisen kohteen (target)

joka taumlssauml tapauksessa on nimeltaumlaumln rdquoesimerkkirdquo Rivillauml 1 olevat tiedosto1c ja tiedos-

to2c kertoo makelle ettauml naumliden tiedostojen olemassaolo vaaditaan kohteen suoritta-

10

miseen Korostetaan ettauml make vaatii tabulaattorin kaumlytoumln ennen jokaista komentoa

(rivi 2) [A Simple Makefile Tutorial]

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 esimerkki tiedosto1o tiedosto2o

5 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

Edellisen esimerkin riveille 1 ja 2 on lisaumltty muuttujat rdquoKAANTAJArdquo ja rdquoOPTIOTrdquo Naumliden

muuttujien muuttaminen vaikuttaa koko tiedostoon ndash taumlssauml tapauksessa ainoastaan

riviin 5

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 all esimerkki

5

6 esimerkki tiedosto1o tiedosto2o

7 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

8

9 tiedosto1o tiedosto1c

10 gcc -c tiedosto1c

11 12 tiedosto2o tiedosto2c

13 gcc -c tiedosto2c

14 15 clean

16 rm -rf o esimerkki

Edellinen esimerkki koostuu viidestauml eri kohteesta

Ensimmaumlinen kohde rdquoallrdquo suoritetaan kun Make ajetaan ilman optioita Jotta rdquoallrdquo voi-

taisiin suorittaa pitaumlauml suorittaa ensin rdquoesimerkkirdquo (rivi 6) koska rdquoallrdquo on riippuvainen

kohteesta rdquoesimerkkirdquo

Seuraavaa kohdetta rdquoesimerkkirdquo ei voi kuitenkaan suorittaa ennen kuin Make on tar-

kastanut tiedostojen rdquotiedosto1ordquo ja rdquotiedosto2ordquo aikaleimat jos aikaleimat ovat van-

hentuneet eli tiedostot ovat muuttuneet on ajettava kohteet rdquotiedosto1ordquo sekauml rdquotie-

dosto2ordquo Naumlmauml kohteet ajettuaan voi Make siirtyauml suorittamaan kohdetta rdquoesimerkkirdquo

ja taumlmaumln jaumllkeen kohdetta rdquoallrdquo jolla ei ole toteutusta

11

Kohteella rdquocleanrdquo ei ole riippuvuuksia Taumlllaista kohdetta kutsutaan komentorivillauml ko-

mennolla rdquomake cleanrdquo Rivillauml 16 oleva komento poistaa kaikki tyoumlhakemistossa sijait-

sevat rdquoordquo-paumlaumltteiset tiedostot sekauml sovellusohjelman rdquoesimerkkirdquo

Viimeisin makefile-esimerkki on yksinkertainen ohjelmiston koonti vaikka se vaikuttaa

pelkaumlstaumlaumln ohjelman kaumlaumlntaumlmiseltauml Jos yllauml olevaa esimerkkiauml haluttaisiin kehittaumlauml li-

saumlauml voitaisiin siihen lisaumltauml esimerkiksi kohde joka hakee laumlhdekoodin tietovarastosta ja

poistaa paikalliset laumlhdekoodit kovalevyltauml ohjelman kaumlaumlntaumlmisen jaumllkeen

32 Ant

Luvussa 31 tutustuttiin makefileen joka on Maken koontikuvaustiedosto Taumlssauml luvus-

sa perehdytaumlaumln koontityoumlkalu Antin kaumlyttaumlmaumlaumln Xml-muotoiseen koontikuvaukseen

Apache Ant on Java kirjasto- ja komentorivityoumlkalu jonka tehtaumlvaumlnauml on ajaa prosesseja

jotka on kuvattu koontitiedostoissa rdquokohteinardquo joilla on keskinaumlisiauml riippuvaisuuksia

Ant on paumlaumlasiallisesti Java-sovellusten koontisovellus mutta sitauml voidaan kaumlyttaumlauml myoumls

C -ja C++ -ohjelmistojen kokoamiseen Taumlssauml luvussa on esimerkki Java-ohjelmiston

koonnista

Antin kaumlyttaumljaumlt voivat kehittaumlauml omia rdquoantlibsrdquo-kirjastoja joihin sisaumlltyy omia tehtaumlviauml

(tasks) ja tyyppejauml (types) Kaumlyttaumljille tarjotaan myoumls suuri maumlaumlrauml valmiiksi tehtyjauml

kaupallisia tai avoimia rdquoantlibsrdquo kirjastoja [Apache Ant Welcome]

Ant-koontitiedosto koostuu neljaumlstauml eri elementistauml projects targets tasks ja proper-

ties

Koontitiedostossa kuvatulla projektilla on kolme attribuuttia name default sekauml base-

dir Name kuvaa projektin nimeauml ja eikauml sitauml ole pakko maumlaumlritellauml Default kuvaa koon-

titiedoston oletuskohdetta (default target) jota kutsutaan kun kohdetta ei erikseen

anneta kokoamiskomennossa Basedir maumlaumlrittelee projektin tyoumlhakemiston jota kaumlyte-

taumlaumln hakemistopolkujen selvittaumlmiseksi Taumlmaumlkaumlaumln attribuutti ei ole pakollinen Jos

basedir-atribuuttia ei maumlaumlritellauml kaumlytetaumlaumln tyoumlhakemistona samaa hakemistoa jossa

koontitiedosto sijaitsee

12

Kohteilla (targets) on riippuvuuksia muista kohteista Kuten makefilessauml voidaan koh-

teiden vaumllille rakentaa riippuvuuksia ja luoda ohjelmiston kokoamisen kannalta jaumlrkevauml

riippuvaisuuksien verkosto

Tehtaumlvaumlt (tasks) ovat suoritettavia koodirivejauml Tehtaumlvillauml voi olla useita attribuutteja

kuten tulevasta esimerkissauml naumlhdaumlaumln

Ominaisuuksilla (properties) voidaan antaa oikoteitauml (shortcuts) komentoihin tai merk-

kijonoihin joita kaumlytetaumlaumln usein koontitiedostossa Ominaisuudella on nimi- sekauml arvo-

attribuutti [Apache Ant Using Apache Ant]

1 ltproject name=MyProject default=dist basedir=gt

2 ltdescriptiongt

3 Yksinkertainen koontikuvaustiedosto

4 ltdescriptiongt

5 lt--Asetetaan julkiset ominaisuudet --gt

6 ltproperty name=src location=srcgt

7 ltproperty name=build location=buildgt

8 ltproperty name=dist location=distgt

9

10 lttarget name=initgt

11 ltmdashLuodaan aikaleima --gt

12 lttstampgt

13 ltmdashLuodaan hakemistorakenne ldquocompilerdquo tehtaumlvaumllle --gt

14 ltmkdir dir=$buildgt

15 lttargetgt

16 17 lttarget name=compile depends=initgt

18 lt--Kaumlaumlnnetaumlaumln Java-koodi $srcstauml into $buildiin --gt

19 ltjavac srcdir=$src destdir=$buildgt

20 lttargetgt

21 22 lttarget name=dist depends=compile

23 description=Generoidaan distribuutio gt

24 lt--Luodaan distribuutio kansio --gt

25 ltmkdir dir=$distlibgt

26 27 lt-- Laitetaan $build sisaumlltouml MyProject-$DSTAMPjarriin --gt

28 ltjar jarfile=$distlibMyProject $DSTAMPjar basedir=$buildgt

29 lttargetgt

30 31 lttarget name=clean

32 description=clean up gt

33 ltmdashPoistetaan $build ja $dist hakemistot --gt

34 ltdelete dir=$buildgt

13

35 ltdelete dir=$distgt

36 lttargetgt

37 ltprojectgt

[Apache Ant Using Apache Ant Example Buildfile]

Edelliseen koontikuvaukseen on maumlaumlritelty projekti jonka nimi on ldquoMyProjectrdquo Kun

tutustutaan koonnin kuvaukseen huomataan ettauml koontitiedoston projektin oletuskoh-

teella rdquodistrdquo on riippuvuus kohteeseen rdquocompilerdquo jolla on riippuvuus kohteeseen rdquoinitrdquo

Initillauml ei ole riippuvaisuuksia Taumlten ensimmaumlinen koonnin yhteydessauml ajettava kohde

onkin rdquoinitrdquo eikauml rdquodistrdquo vaikka rdquodistrdquo on koontikuvauksen oletuskohde Voidaan sanoa

ettauml koonnin paumlaumlmaumlaumlrauml on suorittaa kohde rdquodistrdquo ja paumlaumlmaumlaumlraumln saavuttamiseksi on

suoritettava kohteita joista taumlmauml on riippuvainen Riippuvuudet toimivat samalla peri-

aatteella kuin aikaisemmissa makefile-esimerkeissauml

Ohjelmiston kokoamisen yhteydessauml halutaan edellisessauml esimerkissauml saada ohjelmisto

jakeluun Jotta ohjelmisto saataisiin jakeluun on se ensin kaumlaumlnnettaumlvauml ja sitauml ennen on

luotava ohjelmiston hakemistorakenne

Jos halutaan kehittaumlauml esimerkin koontikuvausta voidaan esimerkiksi suorittaa verk-

kosivujen paumlivitystehtaumlvauml yhden kohteen sisaumlllauml ja asettaa se riippuvaiseksi kohteesta

rdquodistrdquo Naumlin ohjelmasta saadaan paumlivitetty versio jakeluun ja verkkosivuille tulee taumlstauml

automaattinen ilmoitus ohjelmiston kaumlyttaumljille

33 Maven

Luvussa 32 tutustuttiin Anttiin joka on natiivi koontityoumlkalu Seuraavaksi tutustutaan

koonti- ja projektinhallintasovellukseen Maveniin jolla voidaan kuvata koontiprosessin

lisaumlksi myoumls projektin rakenne Maven rohkaisee kaumlyttaumlmaumlaumln parhaita kaumlytaumlntoumljauml (best

practises) joita kaumlyttaumlmaumlllauml ohjelmistoprojektista toiseen siirtyessauml oppimiskynnys

uuden koontikuvauksen ymmaumlrtaumlmiseen pienenee [Maven vs Ant or Ant vs Maven]

Maven on kaumlytoumlssauml Metropolian Ohjelmistotuotantoprojekti-kurssin ohjelmistoprojekti-

en koontityoumlkaluna

Apache Maven on ohjelmistoprojektin hallintatyoumlkalu Se perustuu projekti-olio-malli -

konseptiin (Project Object Model POM) Maven kykenee kokoamaan projektin testaa-

14

maan projektin antamaan kaumlyttaumljaumllle palautetta dokumentoimaan kokoamisen ja te-

kemaumlaumln useita muita tehtaumlviauml erillisillauml Mavenin tarjoamilla lisaumlosilla (plug-ins) [Apache

Maven Project Welcome to Apache Maven]

POM on XML-tiedosto joka sisaumlltaumlauml informaatiota projektista ja yksityiskohtaisen konfi-

guraation jota Maven kaumlyttaumlauml projektin kokoamiseen POM kostuu kohteista (goals)

jotka on maumlaumlritelty pomxml -tiedostossa Kun suoritetaan erillinen tehtaumlvauml tai kohde

Maven etsii POMmia tyoumlhakemistosta lukee POMmin hakee tarvittavan konfiguraati-

on ja suorittaa kohteen

Eraumlitauml POMissa maumlaumlriteltaumlviauml konfiguraatioita ovat projektin riippuvuudet kaumlytettaumlvaumlt

lisaumlosat ajettavat kohteet ja koontiprofiilit POMiin voi maumlaumlritellauml muutakin tietoa ku-

ten projektin version kehittaumljaumlt ja postituslistat [Apache Maven Project Introduction

to the POM]

Maven on Java-tyoumlkalu joten Java taumlytyy olla asennettuna Mavenia ajavalle koneelle

Taumlmauml luku perustuu Apachen verkkosivuilla sijaitsevaan Mavenin kaumlyttoumlohjeeseen

[Apache Maven Project Maven in 5 Minutes] Seuraavaksi luetellaan eri vaiheet Ma-

ven-projektin luomiseksi

Ensin on ladattava Maven ja kaumlytaumlvauml laumlpi asennusohjeet jotka loumlytyvaumlt osoitteesta

[httpmavenapacheorgdownloadhtmlInstallation] Taumlmaumln jaumllkeen on avattava

terminaali tai komentokehote ja kirjoitettava

mvn --version

Taumlmaumln tulostaa asennetun Mavenin ja Javan versio Esimerkiksi

1 Apache Maven 303 (r1075438 2011-02-28 183109+0100)

2 Maven home Dapache-maven-303bin

3 Java version 160_25 vendor Sun Microsystems Inc

4 Java home EProgram FilesJavajdk160_25jre

5 Default locale nl_NL platform encoding Cp1252

6 OS name windows 7 version 61 arch amd64 family windows

Maven-projekti luodaan ajamalla terminaalissa Maven kohde (goal)

15

mvn archetypegenerate -DgroupId=commycompanyapp -DartifactId=my-app -

DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Ensimmaumlisellauml ajolla taumlmauml komento lataa tarvittavat Maven lisaumlosat ja muita tiedostoja

paikalliseen tietovarastoon Huomataan ettauml rdquogeneraterdquo kohde loi rdquoartifactIdrdquonauml anne-

tun hakemiston

Kirjoitetaan komentoriville

cd my-app

Taumlmaumln kansion alta loumlytyy Mavenin standardi projektirakenne

my-app

|-- pomxml

`-- src

|-- main

| `-- java

| `-- com

| `-- mycompany

| `-- app

| `-- Appjava

`-- test

`-- java

`-- com

`-- mycompany

`-- app

`-- AppTestjava

Yllauml kuvatussa hakemistorakenteessa oleva rdquosrcmainjavardquo-hakemisto sisaumlltaumlauml projek-

tin laumlhdekoodin Vastaavasti rdquosrctestjavardquo-hakemisto sisaumlltaumlauml testien laumlhdekoodin

Pomxml-tiedosto kuvaa projektin konfiguraatiota ja sisaumlltaumlauml projektin kokoamisohjeet

Esimerkkiprojektin POM naumlyttaumlauml taumlltauml

1 ltpro-

ject xmlns=httpmavenapacheorgPOM400 xmlnsxsi=httpwwww3org20

01XMLSchema-instance

2 xsischemaLocation=httpmavenapacheorgPOM400 httpmavenapacheorg

xsdmaven-400xsdgt

3 ltmodelVersiongt400ltmodelVersiongt

4

5 ltgroupIdgtcommycompanyappltgroupIdgt

6 ltartifactIdgtmy-appltartifactIdgt

16

7 ltversiongt10-SNAPSHOTltversiongt

8 ltpackaginggtjarltpackaginggt

9

10 ltnamegtMaven Quick Start Archetypeltnamegt

11 lturlgthttpmavenapacheorglturlgt

12 13 ltdependenciesgt

14 ltdependencygt

15 ltgroupIdgtjunitltgroupIdgt

16 ltartifactIdgtjunitltartifactIdgt

17 ltversiongt482ltversiongt

18 ltscopegttestltscopegt

19 ltdependencygt

20 ltdependenciesgt

21 ltprojectgt

POM-tiedosto on Maven-projektin konfiguraation ydin Se sisaumlltaumlauml suurimman osan

informaatiosta joka vaaditaan projektin kokoamiseen halutulla tavalla

Aikaisemmassa esimerkissauml ajettiin Mavenin kohde (goal) archetypegenerate ja an-

nettiin sille parametreja Etuliite archetype on lisaumlosa joka sisaumlltaumlauml kohteen generate

Taumltauml voi verrata Antin tehtaumlvaumlaumln Taumlmauml kohde loi yksinkertaisen projektin joka perus-

tuu arkkityyppiin Yleisesti Mavenin lisaumlosat koostuvat kohteista joilla on yhteinen paumlauml-

tarkoitus Esimerkki taumlllaisesta lisaumlosasta on jboss-maven-plugin jonka tehtaumlvaumlnauml on

kaumlsitellauml erinaumlisiauml Jboss-komponentteja (items)

Maven-projekti kootaan komentoriviltauml seuraavanlaisesti

mvn package

Komentorivi tulostaa eri komentoja tulostus loppuu seuraavanlaisesti

[INFO] --------------------------

[INFO] BUILD SUCCESSFUL

[INFO] --------------------------

[INFO] Total time 2 seconds

[INFO] Finished at Thu Jul 07 213452 CEST 2011

[INFO] Final Memory 3M6M

[INFO] --------------------------

Toisin kuin ensimmaumliseksi suoritetussa komennossa (archetypegenerate) huomataan

taumlllauml kertaa kaumlytetty komento package on vain yksi sana Taumlllaista komentoa kutsutaan

17

kohteen (goal) sijaan vaiheeksi (phase) Vaihe on yksi askel koonnin elinkaaressa

(build lifecycle) joka on jaumlrjestetty sarja eri vaiheita Jos esimerkiksi ajetaan vaiheen

compile Maven itseasiassa suorittaa sarjan vaiheita

1 validate

2 generate-sources

3 process-sources

4 generate-resources

5 process-resources

6 compile

Compilen ajamisen jaumllkeen voidaan testata kaumlaumlnnettyauml JARia seuraavalla komennolla

java -cp targetmy-app-10-SNAPSHOTjar commycompanyappApp

Taumlmauml komento tulostaa

Hello World

Kaumlydaumlaumln laumlpi vielauml eri Mavenin yleisimmaumlt oletuselinkaaressa kaumlytetyt vaiheet Naumlitauml

ovat

-validate varmistaa ettauml projekti on ehjauml ja kaikki tarvittava tieto on saatavilla

-compile kaumlaumlntaumlauml projektin laumlhdekoodin

-test testaa kaumlaumlnnetyn laumlhdekoodin kaumlyttaumlen sopivaa yksikkoumltestikehystauml Naumliden

testien ei tulisi vaatia vaiheita package tai deploy

-package paketoi kaumlaumlnnetyn koodin sen jaettavaan muotoon esimerkiksi JARriksi

-integration-test prosessoi ja jaumlrjestaumlauml paketin ympaumlristoumloumln jossa integraatiotestejauml

voidaan ajaa jos tarpeellista

-verify tarkistaa onko paketti validi ja taumlyttaumlaumlkouml se laatukriteerit

-install asentaa paketin paikalliseen tietovarastoon muiden paikallisten projektien

kaumlyttoumloumln tai paikallisten projektien riippuvuudeksi

-deploy kopioi lopullisen paketin ulkoiseen tietovarastoon jaettavaksi muille kehittaumljil-

le ja projekteille Tehdaumlaumln integraatio- tai julkaisuympaumlristoumlssauml

On vielauml kaksi muuta mainitsemisen arvoista Maven-elinkaarta jotka eivaumlt sisaumllly yllauml

listattuun oletuselinkaareen Naumlitauml ovat

18

-clean poistaa aikaisempien koontien yhteydessauml luodut artifaktit

-site generoi verkkodokumentaation kyseiselle projektille

Jokainen vaihe sisaumlltaumlauml sarjan suoritettavia kohteita joiden ajaminen riippuu projektin

paketointityypistauml Jos projektin tyyppi on JAR niin package ajaa kohteen jarjar Vas-

taavasti WAR -tyyppisen projektin package -vaihe suorittaa kohteen warwar

34 Koonti ja kaumlyttoumloumlnotto

Ohjelmiston saattamista laumlhdekoodista loppukaumlyttaumljaumllle kaumlyttoumlkelpoiseen muotoon kut-

sutaan koonniksi Laumlhdekoodin kaumlaumlntaumlmisen lisaumlksi koonti voi sisaumlltaumlauml monia muita vai-

heita Aleksi Lukkarinen on opinnaumlytetyoumlssaumlaumln listannut esimerkkejauml erilaisista koon-

neista seuraavasti [Aleksi Lukkarinen opinnaumlytetyouml]

-ohjelmointikielisen laumlhdekoodin sekauml resurssien automatisoitua luomista

-eri ohjelmointikielillauml tuotetun laumlhdekoodin kaumlaumlntaumlmistauml kone- jatai vaumllikielille

-vaumlli- tai konekielisen ohjelmakoodin jaumllkikaumlsittelyauml esimerkiksi testauksen aspektioh-

jelmoinnin tai koodin tarkoituksellisen sotkemisen vuoksi

-sovelluksen testausta (esimerkiksi toimivuus tietoturvallisuus suorituskyky rakenteel-

linen ja koodaustekninen laatu sekauml kaumlyttoumltarkoitustaan vastaavuus)

-dokumentaation koontia (kuten varsinaisen sovelluksen koonti)

-koontituotteiden paketointia sekauml mahdollisten fyysisten jakelumedioiden luontia toi-

mivuus- ja virustarkistuksineen

-ohjelmistomoduulien integrointia

-palautteen antamista koonnin tuloksista

Lukkarinen jaumlsentelee opinnaumlytetyoumlssaumlaumln sovelluksen jakeluun ja kaumlyttoumloumlnottoon sisaumll-

tyviksi asioiksi

-Sovellusta suorittavien ja tukevien palvelinympaumlristoumljen luominen ja paumlivittaumlminen

-Sovelluksen sekauml sen kaumlyttaumlmien ohjelmistokomponenttien siirtaumlminen ja maumlaumlrittaumlmi-

nen esimerkiksi testaus- laadunvarmistus- esittely-koulutus- sekauml tuotantoympaumlris-

toumlihin Kohdeympaumlristoumlissauml olevat vanhat versiot on mahdollisesti paumlivitettaumlvauml jollei

uusia versiota asenneta niiden rinnalle

19

-Uusien tietokantojen luominen sekauml vanhojen paumlivittaumlminen uutta sovellusversiota

vastaaviksi

-Kirjanpidollisen materiaalin tuottaminen ja yllaumlpitaumlminen

-Palautteen antaminen jakelu- ja kaumlyttoumloumlnottoprosessin onnistumisesta

Taumlmaumln luvun tarkoitus oli perehdyttaumlauml lukija ymmaumlrtaumlmaumlaumln koontiprosessia koontiku-

vaus-esimerkkien avulla Koontiprosessin ymmaumlrtaumlminen on vaumllttaumlmaumltoumlntauml seuraavan

luvun ymmaumlrtaumlmiseen jossa perehdytaumlaumln koontiympaumlristouml -kaumlsitteeseen

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant

Taumlssauml luvussa luodaan nopea katsaus koonti- ja kaumlyttoumloumlnottoprosessien automatisoimi-

seen tutustutaan jatkuvaan integraatioon sekauml sovellukseen Jenkins CI

Lisaumlksi tutustutaan projektihallintaohjelmaan Agilefant Agilefant on yksi monipuoli-

simmista kevyistauml vapaan laumlhdekoodin projektinhallintasovelluksista ja se soveltuu

niin pieniin kuin suuriinkin projekteihin

Naumlmauml sovellukset esitellaumlaumln pohjustuksena lukuja 5 ja 6 varten joissa tutustutaan

koontiympaumlristoumln tarkkailuun

41 Jatkuva integraatio

Jatkuva integraatio (Continuous Integration CI) on modernin sovelluskehityksen kul-

makivi Itse asiassa se on mullistanut sovelluskehityksen Kun jatkuva integraatio ote-

taan kaumlyttoumloumln organisaatiossa se muuttaa radikaalisti sitauml miten tyoumlryhmauml ymmaumlrtaumlauml

koko kehitysprosessin Jatkuvalla integraatiolla on potentiaalia laukaista sarja paran-

nuksia organisaation tuotteen kehitysprosessiin Se alkaa yksinkertaisesta automaatti-

sesta koonnista kehittyen systeemiksi joka automaattisesti saattaa tuotteen tuotan-

toon Hyvauml CI-infrastruktuuri mahdollistaa virheiden helpon sekauml nopean huomaamisen

ja tarjoaa kojelaudan projektin hyvinvoinnin ja muiden statistiikkojen seuraamiseen

sekauml kehittaumljille ettauml muille projektin osapuolille Jenkins The Definite Guiden mukaan

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 3: Joakim Sandqvist - Theseus

Abstract

Author(s) Title Number of Pages Date

Joakim Sandqvist Monitoring the Build Environment 44 pages + 0 appendices 19 May 2012

Degree Bachelor of Engineering

Degree Programme Information and Communications Technology

Specialisation option Software Engineering

Instructor(s)

Erja Nikunen Principal Lecturer Auvo Haumlkkinen Principal Lecturer

Continuous integration aims to ease project management and the software development process The goal is to have a software development process that has as few component and module conflicts as possible For the development team to be able to react to conflicts swiftly a convenient way to feedback the team is needed Did the build fail Who broke it Feedback can be produced in the form of e-mail This is not the best nor is this the worst way to feedback the team This is one of the many ways to notify the development team of a broken build This doc-ument offers a look at some of the feedback methods and presents an example of an in-formative development environment The thesis was carried out for the Degree Programme of Information and Communications Technology of the Helsinki Metropolia University of Applied Sciences The object was to design and program a piece of software for monitoring the build environment in real time The piece of software is to be used by the students in the Software Development Project course to monitor their Jenkins CI build activities The thesis goes through the basics of continuous integration as well as introduces differ-ent build environment monitoring methods The concrete part of the study the Java based software ldquoKoontardquo is presented and the work and development environments of the course in question are introduced as well

Keywords continuous integration building Jenkins CI Agilefant Java

Sisaumlllys

Lyhenteet ja maumlaumlritelmaumlt

1 Johdanto 1

2 Ohjelmistotuotantoprojekti -kurssi 2

21 Ohjelmistotuotantoprojekti-kurssin yleiskuvaus 2

22 Ohjelmistotuotantoprojekti-kurssin kehitysympaumlristoumln yleiskuvaus 2

221 Kurssin tyoumltilat 3

222 Kurssin palvelimet 6

3 Ohjelmiston kokoaminen 8

31 Makefile 9

32 Ant 11

33 Maven 13

34 Koonti ja kaumlyttoumloumlnotto 18

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant 19

41 Jatkuva integraatio 19

42 Jenkins CI 21

43 Agilefant 25

5 Koontiympaumlristoumln tarkkailu 28

51 Yleistauml koontiympaumlristoumln tarkkailusta 28

52 Vaumllittoumlmaumln palautteen laitteet 29

521 The Code Flow-O-Meter 30

522 Smell-O-Mat 31

6 Koontiympaumlristoumlntarkkailu sovellus 32

61 Sovelluksen toiminnallisuus 33

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri 39

7 Yhteenveto 43

Laumlhteet 45

Lyhenteet ja maumlaumlritelmaumlt

Agilefant Ketterien ohjelmistotuotantomenetelmien mukaisiin projekteihin soveltuva projektinhallintatyoumlkalu

Apache Ant Java-pohjainen koontityoumlkalu Katso luku 32

Apache Maven

Koontityoumlkalu Katso luku 33

CI Continuous Integration Jatkuva integraatio

CI-infrastruktuuri

Jatkuvan integraation toteutuksen perusrakenne Muodostuu niistauml palve-

luista ja rakenteista jotka mahdollistavat jatkuvan integraation toimin-

nan

CI-palvelu Jatkuva integraatio palvelu Esim koontipalvelimella sijaitseva jatkuvan

integraation palvelinsovellus

IDE Integrated Development Environment Integrated Design Environment

Kaikki keskeiset sovelluskehitykseen liittyvaumlt tyoumlkalut integroiva sovellus

Jatkuva integraatio

Prosessi jossa sovellusta kaumlaumlnnetaumlaumln testataan ja integroidaan jatkuvasti

kehityksen aikana

Jenkins CI Integraatiopalvelinsovellus Koontipalvelinsovellus

Kehitysympaumlristoumlinfrastruktuuri

Kehitysympaumlristoumln perusrakenne Muodostuu niistauml palveluista ja raken-

teista jotka mahdollistavat kehitysympaumlristoumln toiminnan

Koontityoumlkalu

Koontiprosessin automatisoiva tyoumlkalu

Koontipalvelin

Palvelin jolla koonti suoritetaan

Make Yksi vanhimmista ja suosituimmista koontityoumlkaluista

Projektioliomalli

Mavenin prosessikuvaus tyypillisesti nimetty pomxmlksi

Prosessikuvaus

Koontityoumlkalulle syoumltettaumlvauml kuvaus joka maumlaumlrittelee koontiprosessin Pro-

sessikuvauksen sisaumlltaumlvaumlauml tiedostoa voidaan kutsua koontitiedostoksi tai

koontikuvaustiedostoksi

Scrum Ketteraumlssauml kehityksessauml kaumlytetty projektinhallintamenetelmauml

Subversion Versionhallintasovellus

RSS-syoumlte RSS-feed Tarkoittaa mm Real Simple Syndication Hyvauml tapa levittaumlauml

usein paumlivittyvaumlauml tietoa eri laumlhteisiin

Versionhallintapalvelin

Versionhallintasovellusta kuten Subversionia ajava palvelin

XF-laite Extreme Feedback Device Extreme Notification Device Laite joka antaa

suoraa palautetta koonnin tilasta

1

1 Johdanto

Taumlssauml opinnaumlytetyoumlssauml esitellaumlaumln Metropolia Ammattikorkeakoulun Ohjelmistotuontato-

projekti-kurssin kaumlytoumlssauml oleva kehitysympaumlristouml Taumlmaumln kehitysympaumlristoumln esittelemi-

sen tyoumlympaumlristoumlineen palvelimineen ja palvelinsovelluksineen on tarkoitus toimia

suuntaa antavana materiaalina niin pienten kuin suurienkin ohjelmistoprojektien koon-

tiympaumlristoumljen ja informatiivisten kehitysympaumlristoumljen rakentamiseen

Metropolia Ammattikorkeakoulun opiskelijat tekevaumlt Ohjelmistotuotantoprojekti-

kurssilla asiakkaan tilaaman ohjelmistotuotteen Opiskelijat suunnittelevat ja ohjelmoi-

vat tuotteen alusta loppuun Opiskelijoilla on kaumlytoumlssaumlaumln moderni kehitysympaumlristouml

jota kehitetaumlaumln entisestaumlaumln koko ajan Kehitysympaumlristouml koostuu tyoumltilojen laiteratkai-

suista tyoumlasemien sovelluksista sekauml palvelin- ja palvelinsovellusinfrastruktuurista

Taumlssauml dokumentissa tullaan esittelemaumlaumln opinnaumlytetyoumlssauml ohjelmoitu Metropolian Oh-

jelmistotuotantoprojekti-kurssin kaumlyttoumloumln tarkoitettu koontiympaumlristoumln monitorointi

sovellus rdquoKoontardquo Sovelluksen tarkoitus on antaa kurssin tyoumlryhmille reaaliaikaista pa-

lautetta ohjelmistoprojektin koonnin tilasta

Luvussa 2 tutustutaan ohjelmistotuotantoprojekti-kurssin sisaumlltoumloumln kehitysympaumlristoumloumln

sekauml tyoumltiloihin Taumlmaumln jaumllkeen luvussa 3 perehdytaumlaumln ohjelmiston kokoamiseen kaumly-

maumlllauml laumlpi erilaisia koontiprosesseja eri koontityoumlkaluilla

Luvussa 4 kerrotaan jatkuvasta integraatiosta sekauml koontiympaumlristoumlstauml Lisaumlksi esitel-

laumlaumln sovellukset Jenkins CI sekauml Agilefant jotka liittyvaumlt vahvasti lukujen 5 ja 6 aihee-

seen koontiympaumlristoumln tarkkailu

Lopuksi luvussa 6 esitellaumlaumln opinnaumlytetyoumlssauml tehty Java-sovellus rdquoKoontardquo Taumlssauml lu-

vussa kaumlydaumlaumln laumlpi hieman sovelluksen ohjelmointiprosessia ja perehdytaumlaumln sovelluk-

sen toiminnallisuuteen sekauml arkkitehtuuriin yksityiskohtaisesti

2

2 Ohjelmistotuotantoprojekti -kurssi

Taumlssauml luvussa perehdytaumlaumln Metropolia Ammattikorkeakoulun Ohjelmistotuotantoprojek-

ti-kurssiin Luvun tarkoitus on antaa lukijalle hyvauml yleiskuva kurssin sisaumllloumlstauml tyoumltilois-

ta sekauml kehitysympaumlristoumlstauml

21 Ohjelmistotuotantoprojekti-kurssin yleiskuvaus

Opiskelijat paumlaumlsevaumlt soveltamaan kurssilla useita aiemmilla tietotekniikan kursseilla

opittuja tietoja ja taitoja Tyouml on projektiluontoinen Kuhunkin ryhmaumlaumln kuuluu 4-6

opiskelijaa ja ryhmiauml on yhteensauml 2-4 Projekti kestaumlauml kahden periodin ajan ja sen

kokonaistyoumlmaumlaumlrauml on noin 800-1200 tyoumltuntia

Ohjelmiston kehittaumlmiseen kaumlytetaumlaumln Scrum-ketteraumlauml menetelmaumlauml Scrumin tyoumlvaiheet

koostuvat sprinteistauml joita taumlssauml projektissa on viisi kappaletta Jokaista sprinttiauml edel-

taumlauml aloituspalaveri jossa sovitaan kyseisen sprintin tehtaumlvaumlt ja tavoite Ydinroolit

Scrumissa ovat tuotteen omistaja tiimi sekauml Scrum Master Kurssin tyoumlryhmien Scrum

Mastereina toimivat opettajat Tiimit koostuvat kurssin tyoumlryhmistauml ja tuotteen immate-

riaalioikeudet omistaa Metropolia Oy joka puolestaan antaa tuotteen kaumlyttoumloikeudet

projektiin osallistuneille tahoille Taumlmauml on toimintapa yleensauml mutta asiakkaasta riip-

puen tehdaumlaumln erilaisia sopimuksia

Jokainen kurssin ryhmauml maumlaumlrittelee suunnittelee toteuttaa testaa sekauml dokumentoi

suurehkon ohjelmiston Jokaisella projektilla on oma asiakas joko oikea yritys tai opet-

taja joka edustaa tyoumln tilaajaa Asiakas on kaumlytettaumlvissauml kunkin sprintin aloituspalave-

rissa toiminnallisten vaatimusten maumlaumlrittelyauml varten Kullakin ryhmaumlllauml on myoumls ohjaa-

ja jonka tehtaumlvaumlnauml on auttaa tyoumln kaumlynnistaumlmisessauml sekauml toimiminen Scrum Masteri-

na Ohjaajat eivaumlt varsinaisesti osallistu tiimin tyoumlskentelyyn

22 Ohjelmistotuotantoprojekti-kurssin kehitysympaumlristoumln yleiskuvaus

Kurssin viimeisimpiauml kehitysympaumlristoumlparannuksia on Aleksi Lukkarisen opinnaumlytetyouml-

naumlaumln tekemauml rdquoopetuskaumlyttoumloumln soveltuva virtuaalikonepohjainen kehitysympaumlristouml

3

jonka avulla innovaatioprojekteja toteuttavat opiskelijat voivat tyoumlskennellauml jatkuvan

integraation ja kaumlyttoumloumlnoton periaatteiden mukaisestirdquo [Lukkarinen 2011 tiivistelmauml]

Uusimmat parannukset kurssin tyouml- ja kehitysympaumlristoumloumln ovat taumlhaumln opinnaumlytetyoumlhoumln

kuuluva sovellus rdquoKoontardquo johon palataan vielauml taumlmaumln dokumentin loppupuolella sekauml

kurssin tyoumltiloihin tehdyt uudet laitehankinnat

Katselmus kehitysympaumlristoumloumln aloitetaan esittelemaumlllauml kurssin uudet tyoumltilat Taumlmaumln

jaumllkeen perehdytaumlaumln kurssin palvelininfrastruktuuriin

221 Kurssin tyoumltilat

Tyoumltilat ja viihtyvyys ovat olennainen osa ryhmaumlkeskeistauml tyoumlntekoa On taumlrkeaumlauml ettauml

kehitysryhmaumlllauml on tarpeeksi tilaa tyoumlskennellauml ja ryhmaumln sisaumlinen kommunikaatio toi-

mii mahdollisimman helposti Tyoumltilat liittyvaumlt myoumls olennaisesti koontiympaumlristoumln tark-

kailuun jota taumlssauml opinnaumlytetyoumlssauml kaumlsitellaumlaumln myoumlhemmin

Joulukuussa 2011 Metropolia teki uusia laitehankintoja Bulevardin toimipisteeseen Oh-

jelmistotuotantoprojekti-kurssin tyoumltiloihin Ensisijaisesti jokaisen kurssiryhmaumln tyoumltiloi-

hin oli saatava naumlyttouml jossa ajettaisiin taumlssauml opinnaumlytetyoumlssauml tehtyauml koontiympaumlristoumln

tarkkailuun soveltuvaa ohjelmaa rdquoKoontardquo

Taumlssauml luvussa kaumlydaumlaumln laumlpi kurssin tyoumltiloihin hankitut laitteet ja esitellaumlaumln tyoumltilat ko-

konaisuudessaan mukaan lukien laitteet jotka jaumlivaumlt kaumlyttoumloumln vanhasta laitekokoon-

panosta

Kuvassa 1 on esitelty yhden ryhmaumln tyoumltila Kyseisen ryhmaumln tyoumltilaan kuuluu kolme

tussitaulua joista yksi laumlhiprojektorin alla oleva toimii myoumls projektointipintana laumlhi-

projektorille Ryhmaumlllauml on kaumlytoumlssaumlaumln kuusi kannettavaa tietokonetta Tietokoneet sekauml

laumlhiprojektori ovat kiinni HDMI-valitsimessa Kuvan vasemmassa ylaumlnurkassa on mini-

tietokone sekauml naumlyttouml Minitietokone ja naumlyttouml on varattu koontiympaumlristoumln tarkkailuun

(luku 4) Ryhmauml naumlkee laitteesta ohjelmistoprojektinsa tilan reaaliajassa ja pystyy rea-

goimaan projektin tilamuutoksiin nopeasti

4

Kuva 1 Yhden ryhmaumln tyoumltila

Yksi oleellisimmista uusista laitehankinnoista on laumlhiprojektori (kuva 2) Jokaisella kurs-

sin ryhmaumlllauml on kaumlytoumlssaumlaumln yksi laumlhiprojektori Toisin kuin perinteinen projektori laumlhi-

projektori saadaan asetettua seinaumllle suoraan projektorointikohteen ylaumlpuolelle Taumlten

se vie vaumlhemmaumln tilaa kuin normaali projektori ja oli hyvauml valinta uuteen laitekokoon-

panoon

Kuva 2 Hitachi CP-AW250NM

Tyoumltiloihin hankittiin 2000 mm x 1200 mm tussitaulut jotka toimivat laumlhiprojektorien

piirtoalueina sekauml vaihtoehtoisesti tussitauluina

5

Jokaiselle ryhmaumllle hankittiin 27-tuumaiset LG E2770V -malliset LED-naumlytoumlt Naumlmauml naumly-

toumlt on tarkoitettu vain koontiympaumlristoumln tarkkailua varten Ne kestaumlvaumlt pitkaumlkestoista

kaumlyttoumlauml ja voivat olla paumlaumlllauml youmltauml paumlivaumlauml ilman ettauml kuva palaa kiinni ruutuun Naumlytoumlt

on kiinnitetty seinaumlaumln kolmi-nivelisillauml Melicone Stile DR200 -mallisilla seinaumltelineillauml

joiden avulla naumlyttoumljen kaltevuutta ja sijaintia pystytaumlaumln saumlaumltaumlmaumlaumln

Ryhmille hankitut minitietokoneet (kuva 3) ovat kiinni yllauml esitetyissauml naumlytoumlissauml Minitie-

tokoneita hallitaan langattomalla hiirellauml sekauml naumlppaumlimistoumlllauml Perinteisen poumlytaumltietoko-

neen hankkimisen sijaan paumlaumldyttiin pienempaumlaumln vaihtoehtoon jotta tyoumlskentelytilaa

jaumlisi enemmaumln

Kuva 3 HP8200 USDT -minitietokone

Taumlrkeauml osa uutta laitekokoonpanoa on HDMI-valitsin (kuva 4) Valitsin on kytkettynauml

ryhmaumln laumlhiprojektoriin sekauml ryhmaumln jaumlsenten kaumlyttaumlmiin kannettaviin tietokoneisiin

Valitsimella on taumlrkeauml rooli ryhmien viikkopalavereissa ryhmaumln paumlivittaumlisessauml tyoumlsken-

telyssauml sekauml kehitysryhmaumln ja asiakkaan vaumllisissauml tapaamisissa Valitsin mahdollistaa

sujuvamman kommunikaation ryhmaumln jaumlsenten vaumllillauml Kurssiryhmien kehittaumljaumlt saavat

nappia painamalla oman kannettavan tietokoneensa naumlkymaumln laumlhiprojektoriin

6

Kuva 4 Kramer VS-81H HDMI -valitsin

222 Kurssin palvelimet

Kurssin ryhmaumlkohtaiset palvelimet kevaumlaumlllauml 2012 ovat koontipalvelin testi- ja tuotanto-

sovelluspalvelimet sekauml testi- ja tuotantotietokantapalvelimet (kuva 5) Testipalvelimet

toimivat ryhmaumln omana hiekkalaatikkona Kehitysympaumlristoumln palvelininfrastruktuuri

koostuu kokonaisuudessaan seuraavassa kuvassa esitellyistauml palvelimista

Kuva 5 Kehitysympaumlristoumln palvelininfrastruktuuri

7

Seuraavaksi kaumlydaumlaumln laumlpi palvelimet yksitellen Kerrotaan mitauml sovelluksia kuhunkin

palvelimeen on asennettu ja mitauml ovat kunkin palvelimen tehtaumlvaumlt

Palvelimista koontiympaumlristoumln (luvut 34 4) kannalta oleellisimmassa roolissa on koon-

tipalvelin Jokaisella ryhmaumlllauml on oma koontipalvelimensa jossa ajetaan Jenkins CI -

sovellusta Jenkins CI on vastuussa projektien automaattisesta koonnista ja haumllyttaumlauml

ryhmaumllle projektin koonnin epaumlonnistuessa Jenkins CIstauml kerrotaan lisaumlauml luvussa 4

Tuotanto- ja testipalvelimia on kaksi kappaletta jokaista ryhmaumlauml kohti Tuotantoympauml-

ristoumloumln kuuluvat tuotantosovelluspalvelin sekauml tuotantotietokantapalvelin Tuotantotie-

tokantapalvelin sisaumlltaumlauml ryhmaumlkohtaiset tietokannat Tuotantosovelluspalvelin sisaumlltaumlauml

ryhmaumlkohtaiset palvelut kuten Phpn ja Javan Vastaavasti testiympaumlristoumloumln kuuluvat

testisovelluspalvelin ja testitietokantapalvelin joilla on sama toiminnallisuus kuin tuo-

tantoympaumlristoumln palvelimilla

Ryhmien kaumlytoumlssauml oleva testiympaumlristouml mahdollistaa esimerkiksi palvelinkonfiguraatioi-

den riskittoumlmaumln testaamisen ennen muutosten kaumlyttoumloumlnottoa tuotantoympaumlristoumln puo-

lella Tuotanto -ja testipalvelimet ovat virtualisoituja Palvelimien virtualisointi mahdol-

listaa palvelimen tilan tallennuksen Palvelinten oletustilat (snapshot) voidaan halutessa

ladata muistista palvelimen korruptoituessa konfiguraatiotestaamisen yhteydessauml

Jokaisella ryhmaumlllauml on siis kaumlytoumlssaumlaumln viisi ryhmaumlkohtaista palvelinta koonti- tuotanto-

sovellus- tuotantotietokanta- testisovellus- sekauml testitietokantapalvelin Taumlmaumln lisaumlksi

ryhmillauml on kaumlytoumlssaumlaumln kolme yleiskaumlyttoumlistauml palvelinta joista kerrotaan seuraavaksi

Naumlmauml palvelimet ovat versionhallinta- projektinhallinta- sekauml varmuuskopiopalvelin

Versionhallintapalvelimella sijaitsevat ryhmien kaumlytoumlssauml olevat kaksi tietovarastoa Tois-

ta tietovarastoa kaumlytetaumlaumln laumlhdekoodin taltioimiseen ja toista tietovarastoa oheistuot-

teiden kuten dokumentaation taltioimiseen Opiskelijaryhmien tietovarastojen lisaumlksi

palvelimella on innodev-tietovarasto ympaumlristoumln yllaumlpitoa ja kehitystauml varten Kuvassa 6

on esitelty esimerkki eraumlaumln ohjelmistoprojektin tietovaraston hakemistorakenteesta

8

Kuva 6 Esimerkki opiskelijaryhmaumln tietovaraston hakemistorakenteesta

Projektinhallintapalvelin sisaumlltaumlauml Agilefant-sovelluksen josta ajetaan yhtauml instanssia

kullekin kurssin ryhmaumllle Agilefant on projektinhallintasovellus joka soveltuu hyvin

ketteraumln kehityksen tarpeisiin Sitauml kaumlytetaumlaumln ryhmaumln tyoumltuntien merkkaamiseen ja

projektin kehityksen valvomiseen Agilefantista kerrotaan tarkemmin luvussa 4

Kurssiryhmien kaumlytoumlssauml olevalle varmuuskopiopalvelimelle on tarkoitus kopioida var-

muuskopiota projektinhallinta- ja versionhallintapalvelimien tiloista Varmuuskopiointi ei

ole automatisoitua jonka takia palvelimen kaumlyttoumlmaumlaumlrauml on jaumlaumlnyt pieneksi

3 Ohjelmiston kokoaminen

Ohjelmiston kokoaminen tarkoittaa yksinkertaisimmillaan ohjelmistokoodin kaumlaumlntaumlmistauml

ajettavaan muotoon Jos ohjelmisto on iso ja sen rakenne on modulaarinen voi kehit-

taumljaumlllauml olla tarve jakaa ohjelmiston kokoaminen useisiin operaatioihin joilla on keskinaumli-

siauml riippuvuuksia

Taumlssauml luvussa tutustutaan eri tapoihin toteuttaa ohjelmiston koonti Ensin perehdytaumlaumln

makefileen ja tutustutaan ohjelmiston kokoamiseen makefile-esimerkkien avulla Tauml-

9

maumln jaumllkeen perehdytaumlaumln modernimpiin koontisovelluksiin Ant ja Maven Naumlmauml luvut

ovat tarpeellisia koontiprosessin ymmaumlrtaumlmisen kannalta

31 Makefile

Makefile on tiedosto jota Unix-komento Make kaumlyttaumlauml ohjelman kokoamiseen Makefile

kuvaa ohjelman laumlhdekooditiedostojen vaumlliset riippuvuudet ja sisaumlltaumlauml ohjeet ohjelmis-

ton kaumlaumlntaumlmiseen Kaumlaumlntaumlmisen lisaumlksi makefileen voi sisaumlllyttaumlauml mitauml vain Unix-

komentoja ja siitauml voi kaumlynnistaumlauml testejauml

Otetaan esimerkkitapaus jossa C-kieliseen ohjelmistoon kuuluu 3 tiedostoa

tiedosto1c

tiedosto2c

tiedosto1h

Ilman makefileauml ohjelma kaumlaumlnnettaumlisiin Unix-komentoriviltauml seuraavanlaisesti

gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Esimerkissauml ndashI optio kertoo kaumlaumlntaumljaumllle ettauml sen tulee etsiauml header-tiedostot tyoumlkansi-

osta Gcc-kaumlaumlntaumljauml kaumlaumlntaumlauml tiedostot ja luo sovellusohjelman rdquoesimerkkirdquo Taumlmauml laumlhes-

tymistapa ohjelmiston kaumlaumlntaumlmiseen tulee vaivalloiseksi viimeistaumlaumln siinauml vaiheessa

kun projektiin lisaumltaumlaumln tiedostoja kaumlaumlntaumlmiskomento muuttuu ja se on haettava ko-

mentorivihistoriasta tai kirjoitettava uudestaan Makefilen tekeminen ratkaisee taumlmaumln

ongelman [A Simple Makefile Tutorial]

Esimerkki makefilestauml naumlyttaumlauml taumlltauml

1 esimerkki tiedosto1c tiedosto2c

2 gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Jos yllauml olevat rivit kirjoitetaan rdquoMakefilerdquo- tai rdquomakefilerdquo-nimiseen tiedostoon ja kirjoi-

tetaan komentoriville rdquomakerdquo niin suoritetaan makefileen kirjoitettu komento (rivi 2)

Make ilman optioita suorittaa automaattisesti makefilen ensimmaumlisen kohteen (target)

joka taumlssauml tapauksessa on nimeltaumlaumln rdquoesimerkkirdquo Rivillauml 1 olevat tiedosto1c ja tiedos-

to2c kertoo makelle ettauml naumliden tiedostojen olemassaolo vaaditaan kohteen suoritta-

10

miseen Korostetaan ettauml make vaatii tabulaattorin kaumlytoumln ennen jokaista komentoa

(rivi 2) [A Simple Makefile Tutorial]

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 esimerkki tiedosto1o tiedosto2o

5 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

Edellisen esimerkin riveille 1 ja 2 on lisaumltty muuttujat rdquoKAANTAJArdquo ja rdquoOPTIOTrdquo Naumliden

muuttujien muuttaminen vaikuttaa koko tiedostoon ndash taumlssauml tapauksessa ainoastaan

riviin 5

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 all esimerkki

5

6 esimerkki tiedosto1o tiedosto2o

7 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

8

9 tiedosto1o tiedosto1c

10 gcc -c tiedosto1c

11 12 tiedosto2o tiedosto2c

13 gcc -c tiedosto2c

14 15 clean

16 rm -rf o esimerkki

Edellinen esimerkki koostuu viidestauml eri kohteesta

Ensimmaumlinen kohde rdquoallrdquo suoritetaan kun Make ajetaan ilman optioita Jotta rdquoallrdquo voi-

taisiin suorittaa pitaumlauml suorittaa ensin rdquoesimerkkirdquo (rivi 6) koska rdquoallrdquo on riippuvainen

kohteesta rdquoesimerkkirdquo

Seuraavaa kohdetta rdquoesimerkkirdquo ei voi kuitenkaan suorittaa ennen kuin Make on tar-

kastanut tiedostojen rdquotiedosto1ordquo ja rdquotiedosto2ordquo aikaleimat jos aikaleimat ovat van-

hentuneet eli tiedostot ovat muuttuneet on ajettava kohteet rdquotiedosto1ordquo sekauml rdquotie-

dosto2ordquo Naumlmauml kohteet ajettuaan voi Make siirtyauml suorittamaan kohdetta rdquoesimerkkirdquo

ja taumlmaumln jaumllkeen kohdetta rdquoallrdquo jolla ei ole toteutusta

11

Kohteella rdquocleanrdquo ei ole riippuvuuksia Taumlllaista kohdetta kutsutaan komentorivillauml ko-

mennolla rdquomake cleanrdquo Rivillauml 16 oleva komento poistaa kaikki tyoumlhakemistossa sijait-

sevat rdquoordquo-paumlaumltteiset tiedostot sekauml sovellusohjelman rdquoesimerkkirdquo

Viimeisin makefile-esimerkki on yksinkertainen ohjelmiston koonti vaikka se vaikuttaa

pelkaumlstaumlaumln ohjelman kaumlaumlntaumlmiseltauml Jos yllauml olevaa esimerkkiauml haluttaisiin kehittaumlauml li-

saumlauml voitaisiin siihen lisaumltauml esimerkiksi kohde joka hakee laumlhdekoodin tietovarastosta ja

poistaa paikalliset laumlhdekoodit kovalevyltauml ohjelman kaumlaumlntaumlmisen jaumllkeen

32 Ant

Luvussa 31 tutustuttiin makefileen joka on Maken koontikuvaustiedosto Taumlssauml luvus-

sa perehdytaumlaumln koontityoumlkalu Antin kaumlyttaumlmaumlaumln Xml-muotoiseen koontikuvaukseen

Apache Ant on Java kirjasto- ja komentorivityoumlkalu jonka tehtaumlvaumlnauml on ajaa prosesseja

jotka on kuvattu koontitiedostoissa rdquokohteinardquo joilla on keskinaumlisiauml riippuvaisuuksia

Ant on paumlaumlasiallisesti Java-sovellusten koontisovellus mutta sitauml voidaan kaumlyttaumlauml myoumls

C -ja C++ -ohjelmistojen kokoamiseen Taumlssauml luvussa on esimerkki Java-ohjelmiston

koonnista

Antin kaumlyttaumljaumlt voivat kehittaumlauml omia rdquoantlibsrdquo-kirjastoja joihin sisaumlltyy omia tehtaumlviauml

(tasks) ja tyyppejauml (types) Kaumlyttaumljille tarjotaan myoumls suuri maumlaumlrauml valmiiksi tehtyjauml

kaupallisia tai avoimia rdquoantlibsrdquo kirjastoja [Apache Ant Welcome]

Ant-koontitiedosto koostuu neljaumlstauml eri elementistauml projects targets tasks ja proper-

ties

Koontitiedostossa kuvatulla projektilla on kolme attribuuttia name default sekauml base-

dir Name kuvaa projektin nimeauml ja eikauml sitauml ole pakko maumlaumlritellauml Default kuvaa koon-

titiedoston oletuskohdetta (default target) jota kutsutaan kun kohdetta ei erikseen

anneta kokoamiskomennossa Basedir maumlaumlrittelee projektin tyoumlhakemiston jota kaumlyte-

taumlaumln hakemistopolkujen selvittaumlmiseksi Taumlmaumlkaumlaumln attribuutti ei ole pakollinen Jos

basedir-atribuuttia ei maumlaumlritellauml kaumlytetaumlaumln tyoumlhakemistona samaa hakemistoa jossa

koontitiedosto sijaitsee

12

Kohteilla (targets) on riippuvuuksia muista kohteista Kuten makefilessauml voidaan koh-

teiden vaumllille rakentaa riippuvuuksia ja luoda ohjelmiston kokoamisen kannalta jaumlrkevauml

riippuvaisuuksien verkosto

Tehtaumlvaumlt (tasks) ovat suoritettavia koodirivejauml Tehtaumlvillauml voi olla useita attribuutteja

kuten tulevasta esimerkissauml naumlhdaumlaumln

Ominaisuuksilla (properties) voidaan antaa oikoteitauml (shortcuts) komentoihin tai merk-

kijonoihin joita kaumlytetaumlaumln usein koontitiedostossa Ominaisuudella on nimi- sekauml arvo-

attribuutti [Apache Ant Using Apache Ant]

1 ltproject name=MyProject default=dist basedir=gt

2 ltdescriptiongt

3 Yksinkertainen koontikuvaustiedosto

4 ltdescriptiongt

5 lt--Asetetaan julkiset ominaisuudet --gt

6 ltproperty name=src location=srcgt

7 ltproperty name=build location=buildgt

8 ltproperty name=dist location=distgt

9

10 lttarget name=initgt

11 ltmdashLuodaan aikaleima --gt

12 lttstampgt

13 ltmdashLuodaan hakemistorakenne ldquocompilerdquo tehtaumlvaumllle --gt

14 ltmkdir dir=$buildgt

15 lttargetgt

16 17 lttarget name=compile depends=initgt

18 lt--Kaumlaumlnnetaumlaumln Java-koodi $srcstauml into $buildiin --gt

19 ltjavac srcdir=$src destdir=$buildgt

20 lttargetgt

21 22 lttarget name=dist depends=compile

23 description=Generoidaan distribuutio gt

24 lt--Luodaan distribuutio kansio --gt

25 ltmkdir dir=$distlibgt

26 27 lt-- Laitetaan $build sisaumlltouml MyProject-$DSTAMPjarriin --gt

28 ltjar jarfile=$distlibMyProject $DSTAMPjar basedir=$buildgt

29 lttargetgt

30 31 lttarget name=clean

32 description=clean up gt

33 ltmdashPoistetaan $build ja $dist hakemistot --gt

34 ltdelete dir=$buildgt

13

35 ltdelete dir=$distgt

36 lttargetgt

37 ltprojectgt

[Apache Ant Using Apache Ant Example Buildfile]

Edelliseen koontikuvaukseen on maumlaumlritelty projekti jonka nimi on ldquoMyProjectrdquo Kun

tutustutaan koonnin kuvaukseen huomataan ettauml koontitiedoston projektin oletuskoh-

teella rdquodistrdquo on riippuvuus kohteeseen rdquocompilerdquo jolla on riippuvuus kohteeseen rdquoinitrdquo

Initillauml ei ole riippuvaisuuksia Taumlten ensimmaumlinen koonnin yhteydessauml ajettava kohde

onkin rdquoinitrdquo eikauml rdquodistrdquo vaikka rdquodistrdquo on koontikuvauksen oletuskohde Voidaan sanoa

ettauml koonnin paumlaumlmaumlaumlrauml on suorittaa kohde rdquodistrdquo ja paumlaumlmaumlaumlraumln saavuttamiseksi on

suoritettava kohteita joista taumlmauml on riippuvainen Riippuvuudet toimivat samalla peri-

aatteella kuin aikaisemmissa makefile-esimerkeissauml

Ohjelmiston kokoamisen yhteydessauml halutaan edellisessauml esimerkissauml saada ohjelmisto

jakeluun Jotta ohjelmisto saataisiin jakeluun on se ensin kaumlaumlnnettaumlvauml ja sitauml ennen on

luotava ohjelmiston hakemistorakenne

Jos halutaan kehittaumlauml esimerkin koontikuvausta voidaan esimerkiksi suorittaa verk-

kosivujen paumlivitystehtaumlvauml yhden kohteen sisaumlllauml ja asettaa se riippuvaiseksi kohteesta

rdquodistrdquo Naumlin ohjelmasta saadaan paumlivitetty versio jakeluun ja verkkosivuille tulee taumlstauml

automaattinen ilmoitus ohjelmiston kaumlyttaumljille

33 Maven

Luvussa 32 tutustuttiin Anttiin joka on natiivi koontityoumlkalu Seuraavaksi tutustutaan

koonti- ja projektinhallintasovellukseen Maveniin jolla voidaan kuvata koontiprosessin

lisaumlksi myoumls projektin rakenne Maven rohkaisee kaumlyttaumlmaumlaumln parhaita kaumlytaumlntoumljauml (best

practises) joita kaumlyttaumlmaumlllauml ohjelmistoprojektista toiseen siirtyessauml oppimiskynnys

uuden koontikuvauksen ymmaumlrtaumlmiseen pienenee [Maven vs Ant or Ant vs Maven]

Maven on kaumlytoumlssauml Metropolian Ohjelmistotuotantoprojekti-kurssin ohjelmistoprojekti-

en koontityoumlkaluna

Apache Maven on ohjelmistoprojektin hallintatyoumlkalu Se perustuu projekti-olio-malli -

konseptiin (Project Object Model POM) Maven kykenee kokoamaan projektin testaa-

14

maan projektin antamaan kaumlyttaumljaumllle palautetta dokumentoimaan kokoamisen ja te-

kemaumlaumln useita muita tehtaumlviauml erillisillauml Mavenin tarjoamilla lisaumlosilla (plug-ins) [Apache

Maven Project Welcome to Apache Maven]

POM on XML-tiedosto joka sisaumlltaumlauml informaatiota projektista ja yksityiskohtaisen konfi-

guraation jota Maven kaumlyttaumlauml projektin kokoamiseen POM kostuu kohteista (goals)

jotka on maumlaumlritelty pomxml -tiedostossa Kun suoritetaan erillinen tehtaumlvauml tai kohde

Maven etsii POMmia tyoumlhakemistosta lukee POMmin hakee tarvittavan konfiguraati-

on ja suorittaa kohteen

Eraumlitauml POMissa maumlaumlriteltaumlviauml konfiguraatioita ovat projektin riippuvuudet kaumlytettaumlvaumlt

lisaumlosat ajettavat kohteet ja koontiprofiilit POMiin voi maumlaumlritellauml muutakin tietoa ku-

ten projektin version kehittaumljaumlt ja postituslistat [Apache Maven Project Introduction

to the POM]

Maven on Java-tyoumlkalu joten Java taumlytyy olla asennettuna Mavenia ajavalle koneelle

Taumlmauml luku perustuu Apachen verkkosivuilla sijaitsevaan Mavenin kaumlyttoumlohjeeseen

[Apache Maven Project Maven in 5 Minutes] Seuraavaksi luetellaan eri vaiheet Ma-

ven-projektin luomiseksi

Ensin on ladattava Maven ja kaumlytaumlvauml laumlpi asennusohjeet jotka loumlytyvaumlt osoitteesta

[httpmavenapacheorgdownloadhtmlInstallation] Taumlmaumln jaumllkeen on avattava

terminaali tai komentokehote ja kirjoitettava

mvn --version

Taumlmaumln tulostaa asennetun Mavenin ja Javan versio Esimerkiksi

1 Apache Maven 303 (r1075438 2011-02-28 183109+0100)

2 Maven home Dapache-maven-303bin

3 Java version 160_25 vendor Sun Microsystems Inc

4 Java home EProgram FilesJavajdk160_25jre

5 Default locale nl_NL platform encoding Cp1252

6 OS name windows 7 version 61 arch amd64 family windows

Maven-projekti luodaan ajamalla terminaalissa Maven kohde (goal)

15

mvn archetypegenerate -DgroupId=commycompanyapp -DartifactId=my-app -

DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Ensimmaumlisellauml ajolla taumlmauml komento lataa tarvittavat Maven lisaumlosat ja muita tiedostoja

paikalliseen tietovarastoon Huomataan ettauml rdquogeneraterdquo kohde loi rdquoartifactIdrdquonauml anne-

tun hakemiston

Kirjoitetaan komentoriville

cd my-app

Taumlmaumln kansion alta loumlytyy Mavenin standardi projektirakenne

my-app

|-- pomxml

`-- src

|-- main

| `-- java

| `-- com

| `-- mycompany

| `-- app

| `-- Appjava

`-- test

`-- java

`-- com

`-- mycompany

`-- app

`-- AppTestjava

Yllauml kuvatussa hakemistorakenteessa oleva rdquosrcmainjavardquo-hakemisto sisaumlltaumlauml projek-

tin laumlhdekoodin Vastaavasti rdquosrctestjavardquo-hakemisto sisaumlltaumlauml testien laumlhdekoodin

Pomxml-tiedosto kuvaa projektin konfiguraatiota ja sisaumlltaumlauml projektin kokoamisohjeet

Esimerkkiprojektin POM naumlyttaumlauml taumlltauml

1 ltpro-

ject xmlns=httpmavenapacheorgPOM400 xmlnsxsi=httpwwww3org20

01XMLSchema-instance

2 xsischemaLocation=httpmavenapacheorgPOM400 httpmavenapacheorg

xsdmaven-400xsdgt

3 ltmodelVersiongt400ltmodelVersiongt

4

5 ltgroupIdgtcommycompanyappltgroupIdgt

6 ltartifactIdgtmy-appltartifactIdgt

16

7 ltversiongt10-SNAPSHOTltversiongt

8 ltpackaginggtjarltpackaginggt

9

10 ltnamegtMaven Quick Start Archetypeltnamegt

11 lturlgthttpmavenapacheorglturlgt

12 13 ltdependenciesgt

14 ltdependencygt

15 ltgroupIdgtjunitltgroupIdgt

16 ltartifactIdgtjunitltartifactIdgt

17 ltversiongt482ltversiongt

18 ltscopegttestltscopegt

19 ltdependencygt

20 ltdependenciesgt

21 ltprojectgt

POM-tiedosto on Maven-projektin konfiguraation ydin Se sisaumlltaumlauml suurimman osan

informaatiosta joka vaaditaan projektin kokoamiseen halutulla tavalla

Aikaisemmassa esimerkissauml ajettiin Mavenin kohde (goal) archetypegenerate ja an-

nettiin sille parametreja Etuliite archetype on lisaumlosa joka sisaumlltaumlauml kohteen generate

Taumltauml voi verrata Antin tehtaumlvaumlaumln Taumlmauml kohde loi yksinkertaisen projektin joka perus-

tuu arkkityyppiin Yleisesti Mavenin lisaumlosat koostuvat kohteista joilla on yhteinen paumlauml-

tarkoitus Esimerkki taumlllaisesta lisaumlosasta on jboss-maven-plugin jonka tehtaumlvaumlnauml on

kaumlsitellauml erinaumlisiauml Jboss-komponentteja (items)

Maven-projekti kootaan komentoriviltauml seuraavanlaisesti

mvn package

Komentorivi tulostaa eri komentoja tulostus loppuu seuraavanlaisesti

[INFO] --------------------------

[INFO] BUILD SUCCESSFUL

[INFO] --------------------------

[INFO] Total time 2 seconds

[INFO] Finished at Thu Jul 07 213452 CEST 2011

[INFO] Final Memory 3M6M

[INFO] --------------------------

Toisin kuin ensimmaumliseksi suoritetussa komennossa (archetypegenerate) huomataan

taumlllauml kertaa kaumlytetty komento package on vain yksi sana Taumlllaista komentoa kutsutaan

17

kohteen (goal) sijaan vaiheeksi (phase) Vaihe on yksi askel koonnin elinkaaressa

(build lifecycle) joka on jaumlrjestetty sarja eri vaiheita Jos esimerkiksi ajetaan vaiheen

compile Maven itseasiassa suorittaa sarjan vaiheita

1 validate

2 generate-sources

3 process-sources

4 generate-resources

5 process-resources

6 compile

Compilen ajamisen jaumllkeen voidaan testata kaumlaumlnnettyauml JARia seuraavalla komennolla

java -cp targetmy-app-10-SNAPSHOTjar commycompanyappApp

Taumlmauml komento tulostaa

Hello World

Kaumlydaumlaumln laumlpi vielauml eri Mavenin yleisimmaumlt oletuselinkaaressa kaumlytetyt vaiheet Naumlitauml

ovat

-validate varmistaa ettauml projekti on ehjauml ja kaikki tarvittava tieto on saatavilla

-compile kaumlaumlntaumlauml projektin laumlhdekoodin

-test testaa kaumlaumlnnetyn laumlhdekoodin kaumlyttaumlen sopivaa yksikkoumltestikehystauml Naumliden

testien ei tulisi vaatia vaiheita package tai deploy

-package paketoi kaumlaumlnnetyn koodin sen jaettavaan muotoon esimerkiksi JARriksi

-integration-test prosessoi ja jaumlrjestaumlauml paketin ympaumlristoumloumln jossa integraatiotestejauml

voidaan ajaa jos tarpeellista

-verify tarkistaa onko paketti validi ja taumlyttaumlaumlkouml se laatukriteerit

-install asentaa paketin paikalliseen tietovarastoon muiden paikallisten projektien

kaumlyttoumloumln tai paikallisten projektien riippuvuudeksi

-deploy kopioi lopullisen paketin ulkoiseen tietovarastoon jaettavaksi muille kehittaumljil-

le ja projekteille Tehdaumlaumln integraatio- tai julkaisuympaumlristoumlssauml

On vielauml kaksi muuta mainitsemisen arvoista Maven-elinkaarta jotka eivaumlt sisaumllly yllauml

listattuun oletuselinkaareen Naumlitauml ovat

18

-clean poistaa aikaisempien koontien yhteydessauml luodut artifaktit

-site generoi verkkodokumentaation kyseiselle projektille

Jokainen vaihe sisaumlltaumlauml sarjan suoritettavia kohteita joiden ajaminen riippuu projektin

paketointityypistauml Jos projektin tyyppi on JAR niin package ajaa kohteen jarjar Vas-

taavasti WAR -tyyppisen projektin package -vaihe suorittaa kohteen warwar

34 Koonti ja kaumlyttoumloumlnotto

Ohjelmiston saattamista laumlhdekoodista loppukaumlyttaumljaumllle kaumlyttoumlkelpoiseen muotoon kut-

sutaan koonniksi Laumlhdekoodin kaumlaumlntaumlmisen lisaumlksi koonti voi sisaumlltaumlauml monia muita vai-

heita Aleksi Lukkarinen on opinnaumlytetyoumlssaumlaumln listannut esimerkkejauml erilaisista koon-

neista seuraavasti [Aleksi Lukkarinen opinnaumlytetyouml]

-ohjelmointikielisen laumlhdekoodin sekauml resurssien automatisoitua luomista

-eri ohjelmointikielillauml tuotetun laumlhdekoodin kaumlaumlntaumlmistauml kone- jatai vaumllikielille

-vaumlli- tai konekielisen ohjelmakoodin jaumllkikaumlsittelyauml esimerkiksi testauksen aspektioh-

jelmoinnin tai koodin tarkoituksellisen sotkemisen vuoksi

-sovelluksen testausta (esimerkiksi toimivuus tietoturvallisuus suorituskyky rakenteel-

linen ja koodaustekninen laatu sekauml kaumlyttoumltarkoitustaan vastaavuus)

-dokumentaation koontia (kuten varsinaisen sovelluksen koonti)

-koontituotteiden paketointia sekauml mahdollisten fyysisten jakelumedioiden luontia toi-

mivuus- ja virustarkistuksineen

-ohjelmistomoduulien integrointia

-palautteen antamista koonnin tuloksista

Lukkarinen jaumlsentelee opinnaumlytetyoumlssaumlaumln sovelluksen jakeluun ja kaumlyttoumloumlnottoon sisaumll-

tyviksi asioiksi

-Sovellusta suorittavien ja tukevien palvelinympaumlristoumljen luominen ja paumlivittaumlminen

-Sovelluksen sekauml sen kaumlyttaumlmien ohjelmistokomponenttien siirtaumlminen ja maumlaumlrittaumlmi-

nen esimerkiksi testaus- laadunvarmistus- esittely-koulutus- sekauml tuotantoympaumlris-

toumlihin Kohdeympaumlristoumlissauml olevat vanhat versiot on mahdollisesti paumlivitettaumlvauml jollei

uusia versiota asenneta niiden rinnalle

19

-Uusien tietokantojen luominen sekauml vanhojen paumlivittaumlminen uutta sovellusversiota

vastaaviksi

-Kirjanpidollisen materiaalin tuottaminen ja yllaumlpitaumlminen

-Palautteen antaminen jakelu- ja kaumlyttoumloumlnottoprosessin onnistumisesta

Taumlmaumln luvun tarkoitus oli perehdyttaumlauml lukija ymmaumlrtaumlmaumlaumln koontiprosessia koontiku-

vaus-esimerkkien avulla Koontiprosessin ymmaumlrtaumlminen on vaumllttaumlmaumltoumlntauml seuraavan

luvun ymmaumlrtaumlmiseen jossa perehdytaumlaumln koontiympaumlristouml -kaumlsitteeseen

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant

Taumlssauml luvussa luodaan nopea katsaus koonti- ja kaumlyttoumloumlnottoprosessien automatisoimi-

seen tutustutaan jatkuvaan integraatioon sekauml sovellukseen Jenkins CI

Lisaumlksi tutustutaan projektihallintaohjelmaan Agilefant Agilefant on yksi monipuoli-

simmista kevyistauml vapaan laumlhdekoodin projektinhallintasovelluksista ja se soveltuu

niin pieniin kuin suuriinkin projekteihin

Naumlmauml sovellukset esitellaumlaumln pohjustuksena lukuja 5 ja 6 varten joissa tutustutaan

koontiympaumlristoumln tarkkailuun

41 Jatkuva integraatio

Jatkuva integraatio (Continuous Integration CI) on modernin sovelluskehityksen kul-

makivi Itse asiassa se on mullistanut sovelluskehityksen Kun jatkuva integraatio ote-

taan kaumlyttoumloumln organisaatiossa se muuttaa radikaalisti sitauml miten tyoumlryhmauml ymmaumlrtaumlauml

koko kehitysprosessin Jatkuvalla integraatiolla on potentiaalia laukaista sarja paran-

nuksia organisaation tuotteen kehitysprosessiin Se alkaa yksinkertaisesta automaatti-

sesta koonnista kehittyen systeemiksi joka automaattisesti saattaa tuotteen tuotan-

toon Hyvauml CI-infrastruktuuri mahdollistaa virheiden helpon sekauml nopean huomaamisen

ja tarjoaa kojelaudan projektin hyvinvoinnin ja muiden statistiikkojen seuraamiseen

sekauml kehittaumljille ettauml muille projektin osapuolille Jenkins The Definite Guiden mukaan

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 4: Joakim Sandqvist - Theseus

Sisaumlllys

Lyhenteet ja maumlaumlritelmaumlt

1 Johdanto 1

2 Ohjelmistotuotantoprojekti -kurssi 2

21 Ohjelmistotuotantoprojekti-kurssin yleiskuvaus 2

22 Ohjelmistotuotantoprojekti-kurssin kehitysympaumlristoumln yleiskuvaus 2

221 Kurssin tyoumltilat 3

222 Kurssin palvelimet 6

3 Ohjelmiston kokoaminen 8

31 Makefile 9

32 Ant 11

33 Maven 13

34 Koonti ja kaumlyttoumloumlnotto 18

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant 19

41 Jatkuva integraatio 19

42 Jenkins CI 21

43 Agilefant 25

5 Koontiympaumlristoumln tarkkailu 28

51 Yleistauml koontiympaumlristoumln tarkkailusta 28

52 Vaumllittoumlmaumln palautteen laitteet 29

521 The Code Flow-O-Meter 30

522 Smell-O-Mat 31

6 Koontiympaumlristoumlntarkkailu sovellus 32

61 Sovelluksen toiminnallisuus 33

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri 39

7 Yhteenveto 43

Laumlhteet 45

Lyhenteet ja maumlaumlritelmaumlt

Agilefant Ketterien ohjelmistotuotantomenetelmien mukaisiin projekteihin soveltuva projektinhallintatyoumlkalu

Apache Ant Java-pohjainen koontityoumlkalu Katso luku 32

Apache Maven

Koontityoumlkalu Katso luku 33

CI Continuous Integration Jatkuva integraatio

CI-infrastruktuuri

Jatkuvan integraation toteutuksen perusrakenne Muodostuu niistauml palve-

luista ja rakenteista jotka mahdollistavat jatkuvan integraation toimin-

nan

CI-palvelu Jatkuva integraatio palvelu Esim koontipalvelimella sijaitseva jatkuvan

integraation palvelinsovellus

IDE Integrated Development Environment Integrated Design Environment

Kaikki keskeiset sovelluskehitykseen liittyvaumlt tyoumlkalut integroiva sovellus

Jatkuva integraatio

Prosessi jossa sovellusta kaumlaumlnnetaumlaumln testataan ja integroidaan jatkuvasti

kehityksen aikana

Jenkins CI Integraatiopalvelinsovellus Koontipalvelinsovellus

Kehitysympaumlristoumlinfrastruktuuri

Kehitysympaumlristoumln perusrakenne Muodostuu niistauml palveluista ja raken-

teista jotka mahdollistavat kehitysympaumlristoumln toiminnan

Koontityoumlkalu

Koontiprosessin automatisoiva tyoumlkalu

Koontipalvelin

Palvelin jolla koonti suoritetaan

Make Yksi vanhimmista ja suosituimmista koontityoumlkaluista

Projektioliomalli

Mavenin prosessikuvaus tyypillisesti nimetty pomxmlksi

Prosessikuvaus

Koontityoumlkalulle syoumltettaumlvauml kuvaus joka maumlaumlrittelee koontiprosessin Pro-

sessikuvauksen sisaumlltaumlvaumlauml tiedostoa voidaan kutsua koontitiedostoksi tai

koontikuvaustiedostoksi

Scrum Ketteraumlssauml kehityksessauml kaumlytetty projektinhallintamenetelmauml

Subversion Versionhallintasovellus

RSS-syoumlte RSS-feed Tarkoittaa mm Real Simple Syndication Hyvauml tapa levittaumlauml

usein paumlivittyvaumlauml tietoa eri laumlhteisiin

Versionhallintapalvelin

Versionhallintasovellusta kuten Subversionia ajava palvelin

XF-laite Extreme Feedback Device Extreme Notification Device Laite joka antaa

suoraa palautetta koonnin tilasta

1

1 Johdanto

Taumlssauml opinnaumlytetyoumlssauml esitellaumlaumln Metropolia Ammattikorkeakoulun Ohjelmistotuontato-

projekti-kurssin kaumlytoumlssauml oleva kehitysympaumlristouml Taumlmaumln kehitysympaumlristoumln esittelemi-

sen tyoumlympaumlristoumlineen palvelimineen ja palvelinsovelluksineen on tarkoitus toimia

suuntaa antavana materiaalina niin pienten kuin suurienkin ohjelmistoprojektien koon-

tiympaumlristoumljen ja informatiivisten kehitysympaumlristoumljen rakentamiseen

Metropolia Ammattikorkeakoulun opiskelijat tekevaumlt Ohjelmistotuotantoprojekti-

kurssilla asiakkaan tilaaman ohjelmistotuotteen Opiskelijat suunnittelevat ja ohjelmoi-

vat tuotteen alusta loppuun Opiskelijoilla on kaumlytoumlssaumlaumln moderni kehitysympaumlristouml

jota kehitetaumlaumln entisestaumlaumln koko ajan Kehitysympaumlristouml koostuu tyoumltilojen laiteratkai-

suista tyoumlasemien sovelluksista sekauml palvelin- ja palvelinsovellusinfrastruktuurista

Taumlssauml dokumentissa tullaan esittelemaumlaumln opinnaumlytetyoumlssauml ohjelmoitu Metropolian Oh-

jelmistotuotantoprojekti-kurssin kaumlyttoumloumln tarkoitettu koontiympaumlristoumln monitorointi

sovellus rdquoKoontardquo Sovelluksen tarkoitus on antaa kurssin tyoumlryhmille reaaliaikaista pa-

lautetta ohjelmistoprojektin koonnin tilasta

Luvussa 2 tutustutaan ohjelmistotuotantoprojekti-kurssin sisaumlltoumloumln kehitysympaumlristoumloumln

sekauml tyoumltiloihin Taumlmaumln jaumllkeen luvussa 3 perehdytaumlaumln ohjelmiston kokoamiseen kaumly-

maumlllauml laumlpi erilaisia koontiprosesseja eri koontityoumlkaluilla

Luvussa 4 kerrotaan jatkuvasta integraatiosta sekauml koontiympaumlristoumlstauml Lisaumlksi esitel-

laumlaumln sovellukset Jenkins CI sekauml Agilefant jotka liittyvaumlt vahvasti lukujen 5 ja 6 aihee-

seen koontiympaumlristoumln tarkkailu

Lopuksi luvussa 6 esitellaumlaumln opinnaumlytetyoumlssauml tehty Java-sovellus rdquoKoontardquo Taumlssauml lu-

vussa kaumlydaumlaumln laumlpi hieman sovelluksen ohjelmointiprosessia ja perehdytaumlaumln sovelluk-

sen toiminnallisuuteen sekauml arkkitehtuuriin yksityiskohtaisesti

2

2 Ohjelmistotuotantoprojekti -kurssi

Taumlssauml luvussa perehdytaumlaumln Metropolia Ammattikorkeakoulun Ohjelmistotuotantoprojek-

ti-kurssiin Luvun tarkoitus on antaa lukijalle hyvauml yleiskuva kurssin sisaumllloumlstauml tyoumltilois-

ta sekauml kehitysympaumlristoumlstauml

21 Ohjelmistotuotantoprojekti-kurssin yleiskuvaus

Opiskelijat paumlaumlsevaumlt soveltamaan kurssilla useita aiemmilla tietotekniikan kursseilla

opittuja tietoja ja taitoja Tyouml on projektiluontoinen Kuhunkin ryhmaumlaumln kuuluu 4-6

opiskelijaa ja ryhmiauml on yhteensauml 2-4 Projekti kestaumlauml kahden periodin ajan ja sen

kokonaistyoumlmaumlaumlrauml on noin 800-1200 tyoumltuntia

Ohjelmiston kehittaumlmiseen kaumlytetaumlaumln Scrum-ketteraumlauml menetelmaumlauml Scrumin tyoumlvaiheet

koostuvat sprinteistauml joita taumlssauml projektissa on viisi kappaletta Jokaista sprinttiauml edel-

taumlauml aloituspalaveri jossa sovitaan kyseisen sprintin tehtaumlvaumlt ja tavoite Ydinroolit

Scrumissa ovat tuotteen omistaja tiimi sekauml Scrum Master Kurssin tyoumlryhmien Scrum

Mastereina toimivat opettajat Tiimit koostuvat kurssin tyoumlryhmistauml ja tuotteen immate-

riaalioikeudet omistaa Metropolia Oy joka puolestaan antaa tuotteen kaumlyttoumloikeudet

projektiin osallistuneille tahoille Taumlmauml on toimintapa yleensauml mutta asiakkaasta riip-

puen tehdaumlaumln erilaisia sopimuksia

Jokainen kurssin ryhmauml maumlaumlrittelee suunnittelee toteuttaa testaa sekauml dokumentoi

suurehkon ohjelmiston Jokaisella projektilla on oma asiakas joko oikea yritys tai opet-

taja joka edustaa tyoumln tilaajaa Asiakas on kaumlytettaumlvissauml kunkin sprintin aloituspalave-

rissa toiminnallisten vaatimusten maumlaumlrittelyauml varten Kullakin ryhmaumlllauml on myoumls ohjaa-

ja jonka tehtaumlvaumlnauml on auttaa tyoumln kaumlynnistaumlmisessauml sekauml toimiminen Scrum Masteri-

na Ohjaajat eivaumlt varsinaisesti osallistu tiimin tyoumlskentelyyn

22 Ohjelmistotuotantoprojekti-kurssin kehitysympaumlristoumln yleiskuvaus

Kurssin viimeisimpiauml kehitysympaumlristoumlparannuksia on Aleksi Lukkarisen opinnaumlytetyouml-

naumlaumln tekemauml rdquoopetuskaumlyttoumloumln soveltuva virtuaalikonepohjainen kehitysympaumlristouml

3

jonka avulla innovaatioprojekteja toteuttavat opiskelijat voivat tyoumlskennellauml jatkuvan

integraation ja kaumlyttoumloumlnoton periaatteiden mukaisestirdquo [Lukkarinen 2011 tiivistelmauml]

Uusimmat parannukset kurssin tyouml- ja kehitysympaumlristoumloumln ovat taumlhaumln opinnaumlytetyoumlhoumln

kuuluva sovellus rdquoKoontardquo johon palataan vielauml taumlmaumln dokumentin loppupuolella sekauml

kurssin tyoumltiloihin tehdyt uudet laitehankinnat

Katselmus kehitysympaumlristoumloumln aloitetaan esittelemaumlllauml kurssin uudet tyoumltilat Taumlmaumln

jaumllkeen perehdytaumlaumln kurssin palvelininfrastruktuuriin

221 Kurssin tyoumltilat

Tyoumltilat ja viihtyvyys ovat olennainen osa ryhmaumlkeskeistauml tyoumlntekoa On taumlrkeaumlauml ettauml

kehitysryhmaumlllauml on tarpeeksi tilaa tyoumlskennellauml ja ryhmaumln sisaumlinen kommunikaatio toi-

mii mahdollisimman helposti Tyoumltilat liittyvaumlt myoumls olennaisesti koontiympaumlristoumln tark-

kailuun jota taumlssauml opinnaumlytetyoumlssauml kaumlsitellaumlaumln myoumlhemmin

Joulukuussa 2011 Metropolia teki uusia laitehankintoja Bulevardin toimipisteeseen Oh-

jelmistotuotantoprojekti-kurssin tyoumltiloihin Ensisijaisesti jokaisen kurssiryhmaumln tyoumltiloi-

hin oli saatava naumlyttouml jossa ajettaisiin taumlssauml opinnaumlytetyoumlssauml tehtyauml koontiympaumlristoumln

tarkkailuun soveltuvaa ohjelmaa rdquoKoontardquo

Taumlssauml luvussa kaumlydaumlaumln laumlpi kurssin tyoumltiloihin hankitut laitteet ja esitellaumlaumln tyoumltilat ko-

konaisuudessaan mukaan lukien laitteet jotka jaumlivaumlt kaumlyttoumloumln vanhasta laitekokoon-

panosta

Kuvassa 1 on esitelty yhden ryhmaumln tyoumltila Kyseisen ryhmaumln tyoumltilaan kuuluu kolme

tussitaulua joista yksi laumlhiprojektorin alla oleva toimii myoumls projektointipintana laumlhi-

projektorille Ryhmaumlllauml on kaumlytoumlssaumlaumln kuusi kannettavaa tietokonetta Tietokoneet sekauml

laumlhiprojektori ovat kiinni HDMI-valitsimessa Kuvan vasemmassa ylaumlnurkassa on mini-

tietokone sekauml naumlyttouml Minitietokone ja naumlyttouml on varattu koontiympaumlristoumln tarkkailuun

(luku 4) Ryhmauml naumlkee laitteesta ohjelmistoprojektinsa tilan reaaliajassa ja pystyy rea-

goimaan projektin tilamuutoksiin nopeasti

4

Kuva 1 Yhden ryhmaumln tyoumltila

Yksi oleellisimmista uusista laitehankinnoista on laumlhiprojektori (kuva 2) Jokaisella kurs-

sin ryhmaumlllauml on kaumlytoumlssaumlaumln yksi laumlhiprojektori Toisin kuin perinteinen projektori laumlhi-

projektori saadaan asetettua seinaumllle suoraan projektorointikohteen ylaumlpuolelle Taumlten

se vie vaumlhemmaumln tilaa kuin normaali projektori ja oli hyvauml valinta uuteen laitekokoon-

panoon

Kuva 2 Hitachi CP-AW250NM

Tyoumltiloihin hankittiin 2000 mm x 1200 mm tussitaulut jotka toimivat laumlhiprojektorien

piirtoalueina sekauml vaihtoehtoisesti tussitauluina

5

Jokaiselle ryhmaumllle hankittiin 27-tuumaiset LG E2770V -malliset LED-naumlytoumlt Naumlmauml naumly-

toumlt on tarkoitettu vain koontiympaumlristoumln tarkkailua varten Ne kestaumlvaumlt pitkaumlkestoista

kaumlyttoumlauml ja voivat olla paumlaumlllauml youmltauml paumlivaumlauml ilman ettauml kuva palaa kiinni ruutuun Naumlytoumlt

on kiinnitetty seinaumlaumln kolmi-nivelisillauml Melicone Stile DR200 -mallisilla seinaumltelineillauml

joiden avulla naumlyttoumljen kaltevuutta ja sijaintia pystytaumlaumln saumlaumltaumlmaumlaumln

Ryhmille hankitut minitietokoneet (kuva 3) ovat kiinni yllauml esitetyissauml naumlytoumlissauml Minitie-

tokoneita hallitaan langattomalla hiirellauml sekauml naumlppaumlimistoumlllauml Perinteisen poumlytaumltietoko-

neen hankkimisen sijaan paumlaumldyttiin pienempaumlaumln vaihtoehtoon jotta tyoumlskentelytilaa

jaumlisi enemmaumln

Kuva 3 HP8200 USDT -minitietokone

Taumlrkeauml osa uutta laitekokoonpanoa on HDMI-valitsin (kuva 4) Valitsin on kytkettynauml

ryhmaumln laumlhiprojektoriin sekauml ryhmaumln jaumlsenten kaumlyttaumlmiin kannettaviin tietokoneisiin

Valitsimella on taumlrkeauml rooli ryhmien viikkopalavereissa ryhmaumln paumlivittaumlisessauml tyoumlsken-

telyssauml sekauml kehitysryhmaumln ja asiakkaan vaumllisissauml tapaamisissa Valitsin mahdollistaa

sujuvamman kommunikaation ryhmaumln jaumlsenten vaumllillauml Kurssiryhmien kehittaumljaumlt saavat

nappia painamalla oman kannettavan tietokoneensa naumlkymaumln laumlhiprojektoriin

6

Kuva 4 Kramer VS-81H HDMI -valitsin

222 Kurssin palvelimet

Kurssin ryhmaumlkohtaiset palvelimet kevaumlaumlllauml 2012 ovat koontipalvelin testi- ja tuotanto-

sovelluspalvelimet sekauml testi- ja tuotantotietokantapalvelimet (kuva 5) Testipalvelimet

toimivat ryhmaumln omana hiekkalaatikkona Kehitysympaumlristoumln palvelininfrastruktuuri

koostuu kokonaisuudessaan seuraavassa kuvassa esitellyistauml palvelimista

Kuva 5 Kehitysympaumlristoumln palvelininfrastruktuuri

7

Seuraavaksi kaumlydaumlaumln laumlpi palvelimet yksitellen Kerrotaan mitauml sovelluksia kuhunkin

palvelimeen on asennettu ja mitauml ovat kunkin palvelimen tehtaumlvaumlt

Palvelimista koontiympaumlristoumln (luvut 34 4) kannalta oleellisimmassa roolissa on koon-

tipalvelin Jokaisella ryhmaumlllauml on oma koontipalvelimensa jossa ajetaan Jenkins CI -

sovellusta Jenkins CI on vastuussa projektien automaattisesta koonnista ja haumllyttaumlauml

ryhmaumllle projektin koonnin epaumlonnistuessa Jenkins CIstauml kerrotaan lisaumlauml luvussa 4

Tuotanto- ja testipalvelimia on kaksi kappaletta jokaista ryhmaumlauml kohti Tuotantoympauml-

ristoumloumln kuuluvat tuotantosovelluspalvelin sekauml tuotantotietokantapalvelin Tuotantotie-

tokantapalvelin sisaumlltaumlauml ryhmaumlkohtaiset tietokannat Tuotantosovelluspalvelin sisaumlltaumlauml

ryhmaumlkohtaiset palvelut kuten Phpn ja Javan Vastaavasti testiympaumlristoumloumln kuuluvat

testisovelluspalvelin ja testitietokantapalvelin joilla on sama toiminnallisuus kuin tuo-

tantoympaumlristoumln palvelimilla

Ryhmien kaumlytoumlssauml oleva testiympaumlristouml mahdollistaa esimerkiksi palvelinkonfiguraatioi-

den riskittoumlmaumln testaamisen ennen muutosten kaumlyttoumloumlnottoa tuotantoympaumlristoumln puo-

lella Tuotanto -ja testipalvelimet ovat virtualisoituja Palvelimien virtualisointi mahdol-

listaa palvelimen tilan tallennuksen Palvelinten oletustilat (snapshot) voidaan halutessa

ladata muistista palvelimen korruptoituessa konfiguraatiotestaamisen yhteydessauml

Jokaisella ryhmaumlllauml on siis kaumlytoumlssaumlaumln viisi ryhmaumlkohtaista palvelinta koonti- tuotanto-

sovellus- tuotantotietokanta- testisovellus- sekauml testitietokantapalvelin Taumlmaumln lisaumlksi

ryhmillauml on kaumlytoumlssaumlaumln kolme yleiskaumlyttoumlistauml palvelinta joista kerrotaan seuraavaksi

Naumlmauml palvelimet ovat versionhallinta- projektinhallinta- sekauml varmuuskopiopalvelin

Versionhallintapalvelimella sijaitsevat ryhmien kaumlytoumlssauml olevat kaksi tietovarastoa Tois-

ta tietovarastoa kaumlytetaumlaumln laumlhdekoodin taltioimiseen ja toista tietovarastoa oheistuot-

teiden kuten dokumentaation taltioimiseen Opiskelijaryhmien tietovarastojen lisaumlksi

palvelimella on innodev-tietovarasto ympaumlristoumln yllaumlpitoa ja kehitystauml varten Kuvassa 6

on esitelty esimerkki eraumlaumln ohjelmistoprojektin tietovaraston hakemistorakenteesta

8

Kuva 6 Esimerkki opiskelijaryhmaumln tietovaraston hakemistorakenteesta

Projektinhallintapalvelin sisaumlltaumlauml Agilefant-sovelluksen josta ajetaan yhtauml instanssia

kullekin kurssin ryhmaumllle Agilefant on projektinhallintasovellus joka soveltuu hyvin

ketteraumln kehityksen tarpeisiin Sitauml kaumlytetaumlaumln ryhmaumln tyoumltuntien merkkaamiseen ja

projektin kehityksen valvomiseen Agilefantista kerrotaan tarkemmin luvussa 4

Kurssiryhmien kaumlytoumlssauml olevalle varmuuskopiopalvelimelle on tarkoitus kopioida var-

muuskopiota projektinhallinta- ja versionhallintapalvelimien tiloista Varmuuskopiointi ei

ole automatisoitua jonka takia palvelimen kaumlyttoumlmaumlaumlrauml on jaumlaumlnyt pieneksi

3 Ohjelmiston kokoaminen

Ohjelmiston kokoaminen tarkoittaa yksinkertaisimmillaan ohjelmistokoodin kaumlaumlntaumlmistauml

ajettavaan muotoon Jos ohjelmisto on iso ja sen rakenne on modulaarinen voi kehit-

taumljaumlllauml olla tarve jakaa ohjelmiston kokoaminen useisiin operaatioihin joilla on keskinaumli-

siauml riippuvuuksia

Taumlssauml luvussa tutustutaan eri tapoihin toteuttaa ohjelmiston koonti Ensin perehdytaumlaumln

makefileen ja tutustutaan ohjelmiston kokoamiseen makefile-esimerkkien avulla Tauml-

9

maumln jaumllkeen perehdytaumlaumln modernimpiin koontisovelluksiin Ant ja Maven Naumlmauml luvut

ovat tarpeellisia koontiprosessin ymmaumlrtaumlmisen kannalta

31 Makefile

Makefile on tiedosto jota Unix-komento Make kaumlyttaumlauml ohjelman kokoamiseen Makefile

kuvaa ohjelman laumlhdekooditiedostojen vaumlliset riippuvuudet ja sisaumlltaumlauml ohjeet ohjelmis-

ton kaumlaumlntaumlmiseen Kaumlaumlntaumlmisen lisaumlksi makefileen voi sisaumlllyttaumlauml mitauml vain Unix-

komentoja ja siitauml voi kaumlynnistaumlauml testejauml

Otetaan esimerkkitapaus jossa C-kieliseen ohjelmistoon kuuluu 3 tiedostoa

tiedosto1c

tiedosto2c

tiedosto1h

Ilman makefileauml ohjelma kaumlaumlnnettaumlisiin Unix-komentoriviltauml seuraavanlaisesti

gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Esimerkissauml ndashI optio kertoo kaumlaumlntaumljaumllle ettauml sen tulee etsiauml header-tiedostot tyoumlkansi-

osta Gcc-kaumlaumlntaumljauml kaumlaumlntaumlauml tiedostot ja luo sovellusohjelman rdquoesimerkkirdquo Taumlmauml laumlhes-

tymistapa ohjelmiston kaumlaumlntaumlmiseen tulee vaivalloiseksi viimeistaumlaumln siinauml vaiheessa

kun projektiin lisaumltaumlaumln tiedostoja kaumlaumlntaumlmiskomento muuttuu ja se on haettava ko-

mentorivihistoriasta tai kirjoitettava uudestaan Makefilen tekeminen ratkaisee taumlmaumln

ongelman [A Simple Makefile Tutorial]

Esimerkki makefilestauml naumlyttaumlauml taumlltauml

1 esimerkki tiedosto1c tiedosto2c

2 gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Jos yllauml olevat rivit kirjoitetaan rdquoMakefilerdquo- tai rdquomakefilerdquo-nimiseen tiedostoon ja kirjoi-

tetaan komentoriville rdquomakerdquo niin suoritetaan makefileen kirjoitettu komento (rivi 2)

Make ilman optioita suorittaa automaattisesti makefilen ensimmaumlisen kohteen (target)

joka taumlssauml tapauksessa on nimeltaumlaumln rdquoesimerkkirdquo Rivillauml 1 olevat tiedosto1c ja tiedos-

to2c kertoo makelle ettauml naumliden tiedostojen olemassaolo vaaditaan kohteen suoritta-

10

miseen Korostetaan ettauml make vaatii tabulaattorin kaumlytoumln ennen jokaista komentoa

(rivi 2) [A Simple Makefile Tutorial]

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 esimerkki tiedosto1o tiedosto2o

5 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

Edellisen esimerkin riveille 1 ja 2 on lisaumltty muuttujat rdquoKAANTAJArdquo ja rdquoOPTIOTrdquo Naumliden

muuttujien muuttaminen vaikuttaa koko tiedostoon ndash taumlssauml tapauksessa ainoastaan

riviin 5

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 all esimerkki

5

6 esimerkki tiedosto1o tiedosto2o

7 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

8

9 tiedosto1o tiedosto1c

10 gcc -c tiedosto1c

11 12 tiedosto2o tiedosto2c

13 gcc -c tiedosto2c

14 15 clean

16 rm -rf o esimerkki

Edellinen esimerkki koostuu viidestauml eri kohteesta

Ensimmaumlinen kohde rdquoallrdquo suoritetaan kun Make ajetaan ilman optioita Jotta rdquoallrdquo voi-

taisiin suorittaa pitaumlauml suorittaa ensin rdquoesimerkkirdquo (rivi 6) koska rdquoallrdquo on riippuvainen

kohteesta rdquoesimerkkirdquo

Seuraavaa kohdetta rdquoesimerkkirdquo ei voi kuitenkaan suorittaa ennen kuin Make on tar-

kastanut tiedostojen rdquotiedosto1ordquo ja rdquotiedosto2ordquo aikaleimat jos aikaleimat ovat van-

hentuneet eli tiedostot ovat muuttuneet on ajettava kohteet rdquotiedosto1ordquo sekauml rdquotie-

dosto2ordquo Naumlmauml kohteet ajettuaan voi Make siirtyauml suorittamaan kohdetta rdquoesimerkkirdquo

ja taumlmaumln jaumllkeen kohdetta rdquoallrdquo jolla ei ole toteutusta

11

Kohteella rdquocleanrdquo ei ole riippuvuuksia Taumlllaista kohdetta kutsutaan komentorivillauml ko-

mennolla rdquomake cleanrdquo Rivillauml 16 oleva komento poistaa kaikki tyoumlhakemistossa sijait-

sevat rdquoordquo-paumlaumltteiset tiedostot sekauml sovellusohjelman rdquoesimerkkirdquo

Viimeisin makefile-esimerkki on yksinkertainen ohjelmiston koonti vaikka se vaikuttaa

pelkaumlstaumlaumln ohjelman kaumlaumlntaumlmiseltauml Jos yllauml olevaa esimerkkiauml haluttaisiin kehittaumlauml li-

saumlauml voitaisiin siihen lisaumltauml esimerkiksi kohde joka hakee laumlhdekoodin tietovarastosta ja

poistaa paikalliset laumlhdekoodit kovalevyltauml ohjelman kaumlaumlntaumlmisen jaumllkeen

32 Ant

Luvussa 31 tutustuttiin makefileen joka on Maken koontikuvaustiedosto Taumlssauml luvus-

sa perehdytaumlaumln koontityoumlkalu Antin kaumlyttaumlmaumlaumln Xml-muotoiseen koontikuvaukseen

Apache Ant on Java kirjasto- ja komentorivityoumlkalu jonka tehtaumlvaumlnauml on ajaa prosesseja

jotka on kuvattu koontitiedostoissa rdquokohteinardquo joilla on keskinaumlisiauml riippuvaisuuksia

Ant on paumlaumlasiallisesti Java-sovellusten koontisovellus mutta sitauml voidaan kaumlyttaumlauml myoumls

C -ja C++ -ohjelmistojen kokoamiseen Taumlssauml luvussa on esimerkki Java-ohjelmiston

koonnista

Antin kaumlyttaumljaumlt voivat kehittaumlauml omia rdquoantlibsrdquo-kirjastoja joihin sisaumlltyy omia tehtaumlviauml

(tasks) ja tyyppejauml (types) Kaumlyttaumljille tarjotaan myoumls suuri maumlaumlrauml valmiiksi tehtyjauml

kaupallisia tai avoimia rdquoantlibsrdquo kirjastoja [Apache Ant Welcome]

Ant-koontitiedosto koostuu neljaumlstauml eri elementistauml projects targets tasks ja proper-

ties

Koontitiedostossa kuvatulla projektilla on kolme attribuuttia name default sekauml base-

dir Name kuvaa projektin nimeauml ja eikauml sitauml ole pakko maumlaumlritellauml Default kuvaa koon-

titiedoston oletuskohdetta (default target) jota kutsutaan kun kohdetta ei erikseen

anneta kokoamiskomennossa Basedir maumlaumlrittelee projektin tyoumlhakemiston jota kaumlyte-

taumlaumln hakemistopolkujen selvittaumlmiseksi Taumlmaumlkaumlaumln attribuutti ei ole pakollinen Jos

basedir-atribuuttia ei maumlaumlritellauml kaumlytetaumlaumln tyoumlhakemistona samaa hakemistoa jossa

koontitiedosto sijaitsee

12

Kohteilla (targets) on riippuvuuksia muista kohteista Kuten makefilessauml voidaan koh-

teiden vaumllille rakentaa riippuvuuksia ja luoda ohjelmiston kokoamisen kannalta jaumlrkevauml

riippuvaisuuksien verkosto

Tehtaumlvaumlt (tasks) ovat suoritettavia koodirivejauml Tehtaumlvillauml voi olla useita attribuutteja

kuten tulevasta esimerkissauml naumlhdaumlaumln

Ominaisuuksilla (properties) voidaan antaa oikoteitauml (shortcuts) komentoihin tai merk-

kijonoihin joita kaumlytetaumlaumln usein koontitiedostossa Ominaisuudella on nimi- sekauml arvo-

attribuutti [Apache Ant Using Apache Ant]

1 ltproject name=MyProject default=dist basedir=gt

2 ltdescriptiongt

3 Yksinkertainen koontikuvaustiedosto

4 ltdescriptiongt

5 lt--Asetetaan julkiset ominaisuudet --gt

6 ltproperty name=src location=srcgt

7 ltproperty name=build location=buildgt

8 ltproperty name=dist location=distgt

9

10 lttarget name=initgt

11 ltmdashLuodaan aikaleima --gt

12 lttstampgt

13 ltmdashLuodaan hakemistorakenne ldquocompilerdquo tehtaumlvaumllle --gt

14 ltmkdir dir=$buildgt

15 lttargetgt

16 17 lttarget name=compile depends=initgt

18 lt--Kaumlaumlnnetaumlaumln Java-koodi $srcstauml into $buildiin --gt

19 ltjavac srcdir=$src destdir=$buildgt

20 lttargetgt

21 22 lttarget name=dist depends=compile

23 description=Generoidaan distribuutio gt

24 lt--Luodaan distribuutio kansio --gt

25 ltmkdir dir=$distlibgt

26 27 lt-- Laitetaan $build sisaumlltouml MyProject-$DSTAMPjarriin --gt

28 ltjar jarfile=$distlibMyProject $DSTAMPjar basedir=$buildgt

29 lttargetgt

30 31 lttarget name=clean

32 description=clean up gt

33 ltmdashPoistetaan $build ja $dist hakemistot --gt

34 ltdelete dir=$buildgt

13

35 ltdelete dir=$distgt

36 lttargetgt

37 ltprojectgt

[Apache Ant Using Apache Ant Example Buildfile]

Edelliseen koontikuvaukseen on maumlaumlritelty projekti jonka nimi on ldquoMyProjectrdquo Kun

tutustutaan koonnin kuvaukseen huomataan ettauml koontitiedoston projektin oletuskoh-

teella rdquodistrdquo on riippuvuus kohteeseen rdquocompilerdquo jolla on riippuvuus kohteeseen rdquoinitrdquo

Initillauml ei ole riippuvaisuuksia Taumlten ensimmaumlinen koonnin yhteydessauml ajettava kohde

onkin rdquoinitrdquo eikauml rdquodistrdquo vaikka rdquodistrdquo on koontikuvauksen oletuskohde Voidaan sanoa

ettauml koonnin paumlaumlmaumlaumlrauml on suorittaa kohde rdquodistrdquo ja paumlaumlmaumlaumlraumln saavuttamiseksi on

suoritettava kohteita joista taumlmauml on riippuvainen Riippuvuudet toimivat samalla peri-

aatteella kuin aikaisemmissa makefile-esimerkeissauml

Ohjelmiston kokoamisen yhteydessauml halutaan edellisessauml esimerkissauml saada ohjelmisto

jakeluun Jotta ohjelmisto saataisiin jakeluun on se ensin kaumlaumlnnettaumlvauml ja sitauml ennen on

luotava ohjelmiston hakemistorakenne

Jos halutaan kehittaumlauml esimerkin koontikuvausta voidaan esimerkiksi suorittaa verk-

kosivujen paumlivitystehtaumlvauml yhden kohteen sisaumlllauml ja asettaa se riippuvaiseksi kohteesta

rdquodistrdquo Naumlin ohjelmasta saadaan paumlivitetty versio jakeluun ja verkkosivuille tulee taumlstauml

automaattinen ilmoitus ohjelmiston kaumlyttaumljille

33 Maven

Luvussa 32 tutustuttiin Anttiin joka on natiivi koontityoumlkalu Seuraavaksi tutustutaan

koonti- ja projektinhallintasovellukseen Maveniin jolla voidaan kuvata koontiprosessin

lisaumlksi myoumls projektin rakenne Maven rohkaisee kaumlyttaumlmaumlaumln parhaita kaumlytaumlntoumljauml (best

practises) joita kaumlyttaumlmaumlllauml ohjelmistoprojektista toiseen siirtyessauml oppimiskynnys

uuden koontikuvauksen ymmaumlrtaumlmiseen pienenee [Maven vs Ant or Ant vs Maven]

Maven on kaumlytoumlssauml Metropolian Ohjelmistotuotantoprojekti-kurssin ohjelmistoprojekti-

en koontityoumlkaluna

Apache Maven on ohjelmistoprojektin hallintatyoumlkalu Se perustuu projekti-olio-malli -

konseptiin (Project Object Model POM) Maven kykenee kokoamaan projektin testaa-

14

maan projektin antamaan kaumlyttaumljaumllle palautetta dokumentoimaan kokoamisen ja te-

kemaumlaumln useita muita tehtaumlviauml erillisillauml Mavenin tarjoamilla lisaumlosilla (plug-ins) [Apache

Maven Project Welcome to Apache Maven]

POM on XML-tiedosto joka sisaumlltaumlauml informaatiota projektista ja yksityiskohtaisen konfi-

guraation jota Maven kaumlyttaumlauml projektin kokoamiseen POM kostuu kohteista (goals)

jotka on maumlaumlritelty pomxml -tiedostossa Kun suoritetaan erillinen tehtaumlvauml tai kohde

Maven etsii POMmia tyoumlhakemistosta lukee POMmin hakee tarvittavan konfiguraati-

on ja suorittaa kohteen

Eraumlitauml POMissa maumlaumlriteltaumlviauml konfiguraatioita ovat projektin riippuvuudet kaumlytettaumlvaumlt

lisaumlosat ajettavat kohteet ja koontiprofiilit POMiin voi maumlaumlritellauml muutakin tietoa ku-

ten projektin version kehittaumljaumlt ja postituslistat [Apache Maven Project Introduction

to the POM]

Maven on Java-tyoumlkalu joten Java taumlytyy olla asennettuna Mavenia ajavalle koneelle

Taumlmauml luku perustuu Apachen verkkosivuilla sijaitsevaan Mavenin kaumlyttoumlohjeeseen

[Apache Maven Project Maven in 5 Minutes] Seuraavaksi luetellaan eri vaiheet Ma-

ven-projektin luomiseksi

Ensin on ladattava Maven ja kaumlytaumlvauml laumlpi asennusohjeet jotka loumlytyvaumlt osoitteesta

[httpmavenapacheorgdownloadhtmlInstallation] Taumlmaumln jaumllkeen on avattava

terminaali tai komentokehote ja kirjoitettava

mvn --version

Taumlmaumln tulostaa asennetun Mavenin ja Javan versio Esimerkiksi

1 Apache Maven 303 (r1075438 2011-02-28 183109+0100)

2 Maven home Dapache-maven-303bin

3 Java version 160_25 vendor Sun Microsystems Inc

4 Java home EProgram FilesJavajdk160_25jre

5 Default locale nl_NL platform encoding Cp1252

6 OS name windows 7 version 61 arch amd64 family windows

Maven-projekti luodaan ajamalla terminaalissa Maven kohde (goal)

15

mvn archetypegenerate -DgroupId=commycompanyapp -DartifactId=my-app -

DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Ensimmaumlisellauml ajolla taumlmauml komento lataa tarvittavat Maven lisaumlosat ja muita tiedostoja

paikalliseen tietovarastoon Huomataan ettauml rdquogeneraterdquo kohde loi rdquoartifactIdrdquonauml anne-

tun hakemiston

Kirjoitetaan komentoriville

cd my-app

Taumlmaumln kansion alta loumlytyy Mavenin standardi projektirakenne

my-app

|-- pomxml

`-- src

|-- main

| `-- java

| `-- com

| `-- mycompany

| `-- app

| `-- Appjava

`-- test

`-- java

`-- com

`-- mycompany

`-- app

`-- AppTestjava

Yllauml kuvatussa hakemistorakenteessa oleva rdquosrcmainjavardquo-hakemisto sisaumlltaumlauml projek-

tin laumlhdekoodin Vastaavasti rdquosrctestjavardquo-hakemisto sisaumlltaumlauml testien laumlhdekoodin

Pomxml-tiedosto kuvaa projektin konfiguraatiota ja sisaumlltaumlauml projektin kokoamisohjeet

Esimerkkiprojektin POM naumlyttaumlauml taumlltauml

1 ltpro-

ject xmlns=httpmavenapacheorgPOM400 xmlnsxsi=httpwwww3org20

01XMLSchema-instance

2 xsischemaLocation=httpmavenapacheorgPOM400 httpmavenapacheorg

xsdmaven-400xsdgt

3 ltmodelVersiongt400ltmodelVersiongt

4

5 ltgroupIdgtcommycompanyappltgroupIdgt

6 ltartifactIdgtmy-appltartifactIdgt

16

7 ltversiongt10-SNAPSHOTltversiongt

8 ltpackaginggtjarltpackaginggt

9

10 ltnamegtMaven Quick Start Archetypeltnamegt

11 lturlgthttpmavenapacheorglturlgt

12 13 ltdependenciesgt

14 ltdependencygt

15 ltgroupIdgtjunitltgroupIdgt

16 ltartifactIdgtjunitltartifactIdgt

17 ltversiongt482ltversiongt

18 ltscopegttestltscopegt

19 ltdependencygt

20 ltdependenciesgt

21 ltprojectgt

POM-tiedosto on Maven-projektin konfiguraation ydin Se sisaumlltaumlauml suurimman osan

informaatiosta joka vaaditaan projektin kokoamiseen halutulla tavalla

Aikaisemmassa esimerkissauml ajettiin Mavenin kohde (goal) archetypegenerate ja an-

nettiin sille parametreja Etuliite archetype on lisaumlosa joka sisaumlltaumlauml kohteen generate

Taumltauml voi verrata Antin tehtaumlvaumlaumln Taumlmauml kohde loi yksinkertaisen projektin joka perus-

tuu arkkityyppiin Yleisesti Mavenin lisaumlosat koostuvat kohteista joilla on yhteinen paumlauml-

tarkoitus Esimerkki taumlllaisesta lisaumlosasta on jboss-maven-plugin jonka tehtaumlvaumlnauml on

kaumlsitellauml erinaumlisiauml Jboss-komponentteja (items)

Maven-projekti kootaan komentoriviltauml seuraavanlaisesti

mvn package

Komentorivi tulostaa eri komentoja tulostus loppuu seuraavanlaisesti

[INFO] --------------------------

[INFO] BUILD SUCCESSFUL

[INFO] --------------------------

[INFO] Total time 2 seconds

[INFO] Finished at Thu Jul 07 213452 CEST 2011

[INFO] Final Memory 3M6M

[INFO] --------------------------

Toisin kuin ensimmaumliseksi suoritetussa komennossa (archetypegenerate) huomataan

taumlllauml kertaa kaumlytetty komento package on vain yksi sana Taumlllaista komentoa kutsutaan

17

kohteen (goal) sijaan vaiheeksi (phase) Vaihe on yksi askel koonnin elinkaaressa

(build lifecycle) joka on jaumlrjestetty sarja eri vaiheita Jos esimerkiksi ajetaan vaiheen

compile Maven itseasiassa suorittaa sarjan vaiheita

1 validate

2 generate-sources

3 process-sources

4 generate-resources

5 process-resources

6 compile

Compilen ajamisen jaumllkeen voidaan testata kaumlaumlnnettyauml JARia seuraavalla komennolla

java -cp targetmy-app-10-SNAPSHOTjar commycompanyappApp

Taumlmauml komento tulostaa

Hello World

Kaumlydaumlaumln laumlpi vielauml eri Mavenin yleisimmaumlt oletuselinkaaressa kaumlytetyt vaiheet Naumlitauml

ovat

-validate varmistaa ettauml projekti on ehjauml ja kaikki tarvittava tieto on saatavilla

-compile kaumlaumlntaumlauml projektin laumlhdekoodin

-test testaa kaumlaumlnnetyn laumlhdekoodin kaumlyttaumlen sopivaa yksikkoumltestikehystauml Naumliden

testien ei tulisi vaatia vaiheita package tai deploy

-package paketoi kaumlaumlnnetyn koodin sen jaettavaan muotoon esimerkiksi JARriksi

-integration-test prosessoi ja jaumlrjestaumlauml paketin ympaumlristoumloumln jossa integraatiotestejauml

voidaan ajaa jos tarpeellista

-verify tarkistaa onko paketti validi ja taumlyttaumlaumlkouml se laatukriteerit

-install asentaa paketin paikalliseen tietovarastoon muiden paikallisten projektien

kaumlyttoumloumln tai paikallisten projektien riippuvuudeksi

-deploy kopioi lopullisen paketin ulkoiseen tietovarastoon jaettavaksi muille kehittaumljil-

le ja projekteille Tehdaumlaumln integraatio- tai julkaisuympaumlristoumlssauml

On vielauml kaksi muuta mainitsemisen arvoista Maven-elinkaarta jotka eivaumlt sisaumllly yllauml

listattuun oletuselinkaareen Naumlitauml ovat

18

-clean poistaa aikaisempien koontien yhteydessauml luodut artifaktit

-site generoi verkkodokumentaation kyseiselle projektille

Jokainen vaihe sisaumlltaumlauml sarjan suoritettavia kohteita joiden ajaminen riippuu projektin

paketointityypistauml Jos projektin tyyppi on JAR niin package ajaa kohteen jarjar Vas-

taavasti WAR -tyyppisen projektin package -vaihe suorittaa kohteen warwar

34 Koonti ja kaumlyttoumloumlnotto

Ohjelmiston saattamista laumlhdekoodista loppukaumlyttaumljaumllle kaumlyttoumlkelpoiseen muotoon kut-

sutaan koonniksi Laumlhdekoodin kaumlaumlntaumlmisen lisaumlksi koonti voi sisaumlltaumlauml monia muita vai-

heita Aleksi Lukkarinen on opinnaumlytetyoumlssaumlaumln listannut esimerkkejauml erilaisista koon-

neista seuraavasti [Aleksi Lukkarinen opinnaumlytetyouml]

-ohjelmointikielisen laumlhdekoodin sekauml resurssien automatisoitua luomista

-eri ohjelmointikielillauml tuotetun laumlhdekoodin kaumlaumlntaumlmistauml kone- jatai vaumllikielille

-vaumlli- tai konekielisen ohjelmakoodin jaumllkikaumlsittelyauml esimerkiksi testauksen aspektioh-

jelmoinnin tai koodin tarkoituksellisen sotkemisen vuoksi

-sovelluksen testausta (esimerkiksi toimivuus tietoturvallisuus suorituskyky rakenteel-

linen ja koodaustekninen laatu sekauml kaumlyttoumltarkoitustaan vastaavuus)

-dokumentaation koontia (kuten varsinaisen sovelluksen koonti)

-koontituotteiden paketointia sekauml mahdollisten fyysisten jakelumedioiden luontia toi-

mivuus- ja virustarkistuksineen

-ohjelmistomoduulien integrointia

-palautteen antamista koonnin tuloksista

Lukkarinen jaumlsentelee opinnaumlytetyoumlssaumlaumln sovelluksen jakeluun ja kaumlyttoumloumlnottoon sisaumll-

tyviksi asioiksi

-Sovellusta suorittavien ja tukevien palvelinympaumlristoumljen luominen ja paumlivittaumlminen

-Sovelluksen sekauml sen kaumlyttaumlmien ohjelmistokomponenttien siirtaumlminen ja maumlaumlrittaumlmi-

nen esimerkiksi testaus- laadunvarmistus- esittely-koulutus- sekauml tuotantoympaumlris-

toumlihin Kohdeympaumlristoumlissauml olevat vanhat versiot on mahdollisesti paumlivitettaumlvauml jollei

uusia versiota asenneta niiden rinnalle

19

-Uusien tietokantojen luominen sekauml vanhojen paumlivittaumlminen uutta sovellusversiota

vastaaviksi

-Kirjanpidollisen materiaalin tuottaminen ja yllaumlpitaumlminen

-Palautteen antaminen jakelu- ja kaumlyttoumloumlnottoprosessin onnistumisesta

Taumlmaumln luvun tarkoitus oli perehdyttaumlauml lukija ymmaumlrtaumlmaumlaumln koontiprosessia koontiku-

vaus-esimerkkien avulla Koontiprosessin ymmaumlrtaumlminen on vaumllttaumlmaumltoumlntauml seuraavan

luvun ymmaumlrtaumlmiseen jossa perehdytaumlaumln koontiympaumlristouml -kaumlsitteeseen

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant

Taumlssauml luvussa luodaan nopea katsaus koonti- ja kaumlyttoumloumlnottoprosessien automatisoimi-

seen tutustutaan jatkuvaan integraatioon sekauml sovellukseen Jenkins CI

Lisaumlksi tutustutaan projektihallintaohjelmaan Agilefant Agilefant on yksi monipuoli-

simmista kevyistauml vapaan laumlhdekoodin projektinhallintasovelluksista ja se soveltuu

niin pieniin kuin suuriinkin projekteihin

Naumlmauml sovellukset esitellaumlaumln pohjustuksena lukuja 5 ja 6 varten joissa tutustutaan

koontiympaumlristoumln tarkkailuun

41 Jatkuva integraatio

Jatkuva integraatio (Continuous Integration CI) on modernin sovelluskehityksen kul-

makivi Itse asiassa se on mullistanut sovelluskehityksen Kun jatkuva integraatio ote-

taan kaumlyttoumloumln organisaatiossa se muuttaa radikaalisti sitauml miten tyoumlryhmauml ymmaumlrtaumlauml

koko kehitysprosessin Jatkuvalla integraatiolla on potentiaalia laukaista sarja paran-

nuksia organisaation tuotteen kehitysprosessiin Se alkaa yksinkertaisesta automaatti-

sesta koonnista kehittyen systeemiksi joka automaattisesti saattaa tuotteen tuotan-

toon Hyvauml CI-infrastruktuuri mahdollistaa virheiden helpon sekauml nopean huomaamisen

ja tarjoaa kojelaudan projektin hyvinvoinnin ja muiden statistiikkojen seuraamiseen

sekauml kehittaumljille ettauml muille projektin osapuolille Jenkins The Definite Guiden mukaan

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 5: Joakim Sandqvist - Theseus

Lyhenteet ja maumlaumlritelmaumlt

Agilefant Ketterien ohjelmistotuotantomenetelmien mukaisiin projekteihin soveltuva projektinhallintatyoumlkalu

Apache Ant Java-pohjainen koontityoumlkalu Katso luku 32

Apache Maven

Koontityoumlkalu Katso luku 33

CI Continuous Integration Jatkuva integraatio

CI-infrastruktuuri

Jatkuvan integraation toteutuksen perusrakenne Muodostuu niistauml palve-

luista ja rakenteista jotka mahdollistavat jatkuvan integraation toimin-

nan

CI-palvelu Jatkuva integraatio palvelu Esim koontipalvelimella sijaitseva jatkuvan

integraation palvelinsovellus

IDE Integrated Development Environment Integrated Design Environment

Kaikki keskeiset sovelluskehitykseen liittyvaumlt tyoumlkalut integroiva sovellus

Jatkuva integraatio

Prosessi jossa sovellusta kaumlaumlnnetaumlaumln testataan ja integroidaan jatkuvasti

kehityksen aikana

Jenkins CI Integraatiopalvelinsovellus Koontipalvelinsovellus

Kehitysympaumlristoumlinfrastruktuuri

Kehitysympaumlristoumln perusrakenne Muodostuu niistauml palveluista ja raken-

teista jotka mahdollistavat kehitysympaumlristoumln toiminnan

Koontityoumlkalu

Koontiprosessin automatisoiva tyoumlkalu

Koontipalvelin

Palvelin jolla koonti suoritetaan

Make Yksi vanhimmista ja suosituimmista koontityoumlkaluista

Projektioliomalli

Mavenin prosessikuvaus tyypillisesti nimetty pomxmlksi

Prosessikuvaus

Koontityoumlkalulle syoumltettaumlvauml kuvaus joka maumlaumlrittelee koontiprosessin Pro-

sessikuvauksen sisaumlltaumlvaumlauml tiedostoa voidaan kutsua koontitiedostoksi tai

koontikuvaustiedostoksi

Scrum Ketteraumlssauml kehityksessauml kaumlytetty projektinhallintamenetelmauml

Subversion Versionhallintasovellus

RSS-syoumlte RSS-feed Tarkoittaa mm Real Simple Syndication Hyvauml tapa levittaumlauml

usein paumlivittyvaumlauml tietoa eri laumlhteisiin

Versionhallintapalvelin

Versionhallintasovellusta kuten Subversionia ajava palvelin

XF-laite Extreme Feedback Device Extreme Notification Device Laite joka antaa

suoraa palautetta koonnin tilasta

1

1 Johdanto

Taumlssauml opinnaumlytetyoumlssauml esitellaumlaumln Metropolia Ammattikorkeakoulun Ohjelmistotuontato-

projekti-kurssin kaumlytoumlssauml oleva kehitysympaumlristouml Taumlmaumln kehitysympaumlristoumln esittelemi-

sen tyoumlympaumlristoumlineen palvelimineen ja palvelinsovelluksineen on tarkoitus toimia

suuntaa antavana materiaalina niin pienten kuin suurienkin ohjelmistoprojektien koon-

tiympaumlristoumljen ja informatiivisten kehitysympaumlristoumljen rakentamiseen

Metropolia Ammattikorkeakoulun opiskelijat tekevaumlt Ohjelmistotuotantoprojekti-

kurssilla asiakkaan tilaaman ohjelmistotuotteen Opiskelijat suunnittelevat ja ohjelmoi-

vat tuotteen alusta loppuun Opiskelijoilla on kaumlytoumlssaumlaumln moderni kehitysympaumlristouml

jota kehitetaumlaumln entisestaumlaumln koko ajan Kehitysympaumlristouml koostuu tyoumltilojen laiteratkai-

suista tyoumlasemien sovelluksista sekauml palvelin- ja palvelinsovellusinfrastruktuurista

Taumlssauml dokumentissa tullaan esittelemaumlaumln opinnaumlytetyoumlssauml ohjelmoitu Metropolian Oh-

jelmistotuotantoprojekti-kurssin kaumlyttoumloumln tarkoitettu koontiympaumlristoumln monitorointi

sovellus rdquoKoontardquo Sovelluksen tarkoitus on antaa kurssin tyoumlryhmille reaaliaikaista pa-

lautetta ohjelmistoprojektin koonnin tilasta

Luvussa 2 tutustutaan ohjelmistotuotantoprojekti-kurssin sisaumlltoumloumln kehitysympaumlristoumloumln

sekauml tyoumltiloihin Taumlmaumln jaumllkeen luvussa 3 perehdytaumlaumln ohjelmiston kokoamiseen kaumly-

maumlllauml laumlpi erilaisia koontiprosesseja eri koontityoumlkaluilla

Luvussa 4 kerrotaan jatkuvasta integraatiosta sekauml koontiympaumlristoumlstauml Lisaumlksi esitel-

laumlaumln sovellukset Jenkins CI sekauml Agilefant jotka liittyvaumlt vahvasti lukujen 5 ja 6 aihee-

seen koontiympaumlristoumln tarkkailu

Lopuksi luvussa 6 esitellaumlaumln opinnaumlytetyoumlssauml tehty Java-sovellus rdquoKoontardquo Taumlssauml lu-

vussa kaumlydaumlaumln laumlpi hieman sovelluksen ohjelmointiprosessia ja perehdytaumlaumln sovelluk-

sen toiminnallisuuteen sekauml arkkitehtuuriin yksityiskohtaisesti

2

2 Ohjelmistotuotantoprojekti -kurssi

Taumlssauml luvussa perehdytaumlaumln Metropolia Ammattikorkeakoulun Ohjelmistotuotantoprojek-

ti-kurssiin Luvun tarkoitus on antaa lukijalle hyvauml yleiskuva kurssin sisaumllloumlstauml tyoumltilois-

ta sekauml kehitysympaumlristoumlstauml

21 Ohjelmistotuotantoprojekti-kurssin yleiskuvaus

Opiskelijat paumlaumlsevaumlt soveltamaan kurssilla useita aiemmilla tietotekniikan kursseilla

opittuja tietoja ja taitoja Tyouml on projektiluontoinen Kuhunkin ryhmaumlaumln kuuluu 4-6

opiskelijaa ja ryhmiauml on yhteensauml 2-4 Projekti kestaumlauml kahden periodin ajan ja sen

kokonaistyoumlmaumlaumlrauml on noin 800-1200 tyoumltuntia

Ohjelmiston kehittaumlmiseen kaumlytetaumlaumln Scrum-ketteraumlauml menetelmaumlauml Scrumin tyoumlvaiheet

koostuvat sprinteistauml joita taumlssauml projektissa on viisi kappaletta Jokaista sprinttiauml edel-

taumlauml aloituspalaveri jossa sovitaan kyseisen sprintin tehtaumlvaumlt ja tavoite Ydinroolit

Scrumissa ovat tuotteen omistaja tiimi sekauml Scrum Master Kurssin tyoumlryhmien Scrum

Mastereina toimivat opettajat Tiimit koostuvat kurssin tyoumlryhmistauml ja tuotteen immate-

riaalioikeudet omistaa Metropolia Oy joka puolestaan antaa tuotteen kaumlyttoumloikeudet

projektiin osallistuneille tahoille Taumlmauml on toimintapa yleensauml mutta asiakkaasta riip-

puen tehdaumlaumln erilaisia sopimuksia

Jokainen kurssin ryhmauml maumlaumlrittelee suunnittelee toteuttaa testaa sekauml dokumentoi

suurehkon ohjelmiston Jokaisella projektilla on oma asiakas joko oikea yritys tai opet-

taja joka edustaa tyoumln tilaajaa Asiakas on kaumlytettaumlvissauml kunkin sprintin aloituspalave-

rissa toiminnallisten vaatimusten maumlaumlrittelyauml varten Kullakin ryhmaumlllauml on myoumls ohjaa-

ja jonka tehtaumlvaumlnauml on auttaa tyoumln kaumlynnistaumlmisessauml sekauml toimiminen Scrum Masteri-

na Ohjaajat eivaumlt varsinaisesti osallistu tiimin tyoumlskentelyyn

22 Ohjelmistotuotantoprojekti-kurssin kehitysympaumlristoumln yleiskuvaus

Kurssin viimeisimpiauml kehitysympaumlristoumlparannuksia on Aleksi Lukkarisen opinnaumlytetyouml-

naumlaumln tekemauml rdquoopetuskaumlyttoumloumln soveltuva virtuaalikonepohjainen kehitysympaumlristouml

3

jonka avulla innovaatioprojekteja toteuttavat opiskelijat voivat tyoumlskennellauml jatkuvan

integraation ja kaumlyttoumloumlnoton periaatteiden mukaisestirdquo [Lukkarinen 2011 tiivistelmauml]

Uusimmat parannukset kurssin tyouml- ja kehitysympaumlristoumloumln ovat taumlhaumln opinnaumlytetyoumlhoumln

kuuluva sovellus rdquoKoontardquo johon palataan vielauml taumlmaumln dokumentin loppupuolella sekauml

kurssin tyoumltiloihin tehdyt uudet laitehankinnat

Katselmus kehitysympaumlristoumloumln aloitetaan esittelemaumlllauml kurssin uudet tyoumltilat Taumlmaumln

jaumllkeen perehdytaumlaumln kurssin palvelininfrastruktuuriin

221 Kurssin tyoumltilat

Tyoumltilat ja viihtyvyys ovat olennainen osa ryhmaumlkeskeistauml tyoumlntekoa On taumlrkeaumlauml ettauml

kehitysryhmaumlllauml on tarpeeksi tilaa tyoumlskennellauml ja ryhmaumln sisaumlinen kommunikaatio toi-

mii mahdollisimman helposti Tyoumltilat liittyvaumlt myoumls olennaisesti koontiympaumlristoumln tark-

kailuun jota taumlssauml opinnaumlytetyoumlssauml kaumlsitellaumlaumln myoumlhemmin

Joulukuussa 2011 Metropolia teki uusia laitehankintoja Bulevardin toimipisteeseen Oh-

jelmistotuotantoprojekti-kurssin tyoumltiloihin Ensisijaisesti jokaisen kurssiryhmaumln tyoumltiloi-

hin oli saatava naumlyttouml jossa ajettaisiin taumlssauml opinnaumlytetyoumlssauml tehtyauml koontiympaumlristoumln

tarkkailuun soveltuvaa ohjelmaa rdquoKoontardquo

Taumlssauml luvussa kaumlydaumlaumln laumlpi kurssin tyoumltiloihin hankitut laitteet ja esitellaumlaumln tyoumltilat ko-

konaisuudessaan mukaan lukien laitteet jotka jaumlivaumlt kaumlyttoumloumln vanhasta laitekokoon-

panosta

Kuvassa 1 on esitelty yhden ryhmaumln tyoumltila Kyseisen ryhmaumln tyoumltilaan kuuluu kolme

tussitaulua joista yksi laumlhiprojektorin alla oleva toimii myoumls projektointipintana laumlhi-

projektorille Ryhmaumlllauml on kaumlytoumlssaumlaumln kuusi kannettavaa tietokonetta Tietokoneet sekauml

laumlhiprojektori ovat kiinni HDMI-valitsimessa Kuvan vasemmassa ylaumlnurkassa on mini-

tietokone sekauml naumlyttouml Minitietokone ja naumlyttouml on varattu koontiympaumlristoumln tarkkailuun

(luku 4) Ryhmauml naumlkee laitteesta ohjelmistoprojektinsa tilan reaaliajassa ja pystyy rea-

goimaan projektin tilamuutoksiin nopeasti

4

Kuva 1 Yhden ryhmaumln tyoumltila

Yksi oleellisimmista uusista laitehankinnoista on laumlhiprojektori (kuva 2) Jokaisella kurs-

sin ryhmaumlllauml on kaumlytoumlssaumlaumln yksi laumlhiprojektori Toisin kuin perinteinen projektori laumlhi-

projektori saadaan asetettua seinaumllle suoraan projektorointikohteen ylaumlpuolelle Taumlten

se vie vaumlhemmaumln tilaa kuin normaali projektori ja oli hyvauml valinta uuteen laitekokoon-

panoon

Kuva 2 Hitachi CP-AW250NM

Tyoumltiloihin hankittiin 2000 mm x 1200 mm tussitaulut jotka toimivat laumlhiprojektorien

piirtoalueina sekauml vaihtoehtoisesti tussitauluina

5

Jokaiselle ryhmaumllle hankittiin 27-tuumaiset LG E2770V -malliset LED-naumlytoumlt Naumlmauml naumly-

toumlt on tarkoitettu vain koontiympaumlristoumln tarkkailua varten Ne kestaumlvaumlt pitkaumlkestoista

kaumlyttoumlauml ja voivat olla paumlaumlllauml youmltauml paumlivaumlauml ilman ettauml kuva palaa kiinni ruutuun Naumlytoumlt

on kiinnitetty seinaumlaumln kolmi-nivelisillauml Melicone Stile DR200 -mallisilla seinaumltelineillauml

joiden avulla naumlyttoumljen kaltevuutta ja sijaintia pystytaumlaumln saumlaumltaumlmaumlaumln

Ryhmille hankitut minitietokoneet (kuva 3) ovat kiinni yllauml esitetyissauml naumlytoumlissauml Minitie-

tokoneita hallitaan langattomalla hiirellauml sekauml naumlppaumlimistoumlllauml Perinteisen poumlytaumltietoko-

neen hankkimisen sijaan paumlaumldyttiin pienempaumlaumln vaihtoehtoon jotta tyoumlskentelytilaa

jaumlisi enemmaumln

Kuva 3 HP8200 USDT -minitietokone

Taumlrkeauml osa uutta laitekokoonpanoa on HDMI-valitsin (kuva 4) Valitsin on kytkettynauml

ryhmaumln laumlhiprojektoriin sekauml ryhmaumln jaumlsenten kaumlyttaumlmiin kannettaviin tietokoneisiin

Valitsimella on taumlrkeauml rooli ryhmien viikkopalavereissa ryhmaumln paumlivittaumlisessauml tyoumlsken-

telyssauml sekauml kehitysryhmaumln ja asiakkaan vaumllisissauml tapaamisissa Valitsin mahdollistaa

sujuvamman kommunikaation ryhmaumln jaumlsenten vaumllillauml Kurssiryhmien kehittaumljaumlt saavat

nappia painamalla oman kannettavan tietokoneensa naumlkymaumln laumlhiprojektoriin

6

Kuva 4 Kramer VS-81H HDMI -valitsin

222 Kurssin palvelimet

Kurssin ryhmaumlkohtaiset palvelimet kevaumlaumlllauml 2012 ovat koontipalvelin testi- ja tuotanto-

sovelluspalvelimet sekauml testi- ja tuotantotietokantapalvelimet (kuva 5) Testipalvelimet

toimivat ryhmaumln omana hiekkalaatikkona Kehitysympaumlristoumln palvelininfrastruktuuri

koostuu kokonaisuudessaan seuraavassa kuvassa esitellyistauml palvelimista

Kuva 5 Kehitysympaumlristoumln palvelininfrastruktuuri

7

Seuraavaksi kaumlydaumlaumln laumlpi palvelimet yksitellen Kerrotaan mitauml sovelluksia kuhunkin

palvelimeen on asennettu ja mitauml ovat kunkin palvelimen tehtaumlvaumlt

Palvelimista koontiympaumlristoumln (luvut 34 4) kannalta oleellisimmassa roolissa on koon-

tipalvelin Jokaisella ryhmaumlllauml on oma koontipalvelimensa jossa ajetaan Jenkins CI -

sovellusta Jenkins CI on vastuussa projektien automaattisesta koonnista ja haumllyttaumlauml

ryhmaumllle projektin koonnin epaumlonnistuessa Jenkins CIstauml kerrotaan lisaumlauml luvussa 4

Tuotanto- ja testipalvelimia on kaksi kappaletta jokaista ryhmaumlauml kohti Tuotantoympauml-

ristoumloumln kuuluvat tuotantosovelluspalvelin sekauml tuotantotietokantapalvelin Tuotantotie-

tokantapalvelin sisaumlltaumlauml ryhmaumlkohtaiset tietokannat Tuotantosovelluspalvelin sisaumlltaumlauml

ryhmaumlkohtaiset palvelut kuten Phpn ja Javan Vastaavasti testiympaumlristoumloumln kuuluvat

testisovelluspalvelin ja testitietokantapalvelin joilla on sama toiminnallisuus kuin tuo-

tantoympaumlristoumln palvelimilla

Ryhmien kaumlytoumlssauml oleva testiympaumlristouml mahdollistaa esimerkiksi palvelinkonfiguraatioi-

den riskittoumlmaumln testaamisen ennen muutosten kaumlyttoumloumlnottoa tuotantoympaumlristoumln puo-

lella Tuotanto -ja testipalvelimet ovat virtualisoituja Palvelimien virtualisointi mahdol-

listaa palvelimen tilan tallennuksen Palvelinten oletustilat (snapshot) voidaan halutessa

ladata muistista palvelimen korruptoituessa konfiguraatiotestaamisen yhteydessauml

Jokaisella ryhmaumlllauml on siis kaumlytoumlssaumlaumln viisi ryhmaumlkohtaista palvelinta koonti- tuotanto-

sovellus- tuotantotietokanta- testisovellus- sekauml testitietokantapalvelin Taumlmaumln lisaumlksi

ryhmillauml on kaumlytoumlssaumlaumln kolme yleiskaumlyttoumlistauml palvelinta joista kerrotaan seuraavaksi

Naumlmauml palvelimet ovat versionhallinta- projektinhallinta- sekauml varmuuskopiopalvelin

Versionhallintapalvelimella sijaitsevat ryhmien kaumlytoumlssauml olevat kaksi tietovarastoa Tois-

ta tietovarastoa kaumlytetaumlaumln laumlhdekoodin taltioimiseen ja toista tietovarastoa oheistuot-

teiden kuten dokumentaation taltioimiseen Opiskelijaryhmien tietovarastojen lisaumlksi

palvelimella on innodev-tietovarasto ympaumlristoumln yllaumlpitoa ja kehitystauml varten Kuvassa 6

on esitelty esimerkki eraumlaumln ohjelmistoprojektin tietovaraston hakemistorakenteesta

8

Kuva 6 Esimerkki opiskelijaryhmaumln tietovaraston hakemistorakenteesta

Projektinhallintapalvelin sisaumlltaumlauml Agilefant-sovelluksen josta ajetaan yhtauml instanssia

kullekin kurssin ryhmaumllle Agilefant on projektinhallintasovellus joka soveltuu hyvin

ketteraumln kehityksen tarpeisiin Sitauml kaumlytetaumlaumln ryhmaumln tyoumltuntien merkkaamiseen ja

projektin kehityksen valvomiseen Agilefantista kerrotaan tarkemmin luvussa 4

Kurssiryhmien kaumlytoumlssauml olevalle varmuuskopiopalvelimelle on tarkoitus kopioida var-

muuskopiota projektinhallinta- ja versionhallintapalvelimien tiloista Varmuuskopiointi ei

ole automatisoitua jonka takia palvelimen kaumlyttoumlmaumlaumlrauml on jaumlaumlnyt pieneksi

3 Ohjelmiston kokoaminen

Ohjelmiston kokoaminen tarkoittaa yksinkertaisimmillaan ohjelmistokoodin kaumlaumlntaumlmistauml

ajettavaan muotoon Jos ohjelmisto on iso ja sen rakenne on modulaarinen voi kehit-

taumljaumlllauml olla tarve jakaa ohjelmiston kokoaminen useisiin operaatioihin joilla on keskinaumli-

siauml riippuvuuksia

Taumlssauml luvussa tutustutaan eri tapoihin toteuttaa ohjelmiston koonti Ensin perehdytaumlaumln

makefileen ja tutustutaan ohjelmiston kokoamiseen makefile-esimerkkien avulla Tauml-

9

maumln jaumllkeen perehdytaumlaumln modernimpiin koontisovelluksiin Ant ja Maven Naumlmauml luvut

ovat tarpeellisia koontiprosessin ymmaumlrtaumlmisen kannalta

31 Makefile

Makefile on tiedosto jota Unix-komento Make kaumlyttaumlauml ohjelman kokoamiseen Makefile

kuvaa ohjelman laumlhdekooditiedostojen vaumlliset riippuvuudet ja sisaumlltaumlauml ohjeet ohjelmis-

ton kaumlaumlntaumlmiseen Kaumlaumlntaumlmisen lisaumlksi makefileen voi sisaumlllyttaumlauml mitauml vain Unix-

komentoja ja siitauml voi kaumlynnistaumlauml testejauml

Otetaan esimerkkitapaus jossa C-kieliseen ohjelmistoon kuuluu 3 tiedostoa

tiedosto1c

tiedosto2c

tiedosto1h

Ilman makefileauml ohjelma kaumlaumlnnettaumlisiin Unix-komentoriviltauml seuraavanlaisesti

gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Esimerkissauml ndashI optio kertoo kaumlaumlntaumljaumllle ettauml sen tulee etsiauml header-tiedostot tyoumlkansi-

osta Gcc-kaumlaumlntaumljauml kaumlaumlntaumlauml tiedostot ja luo sovellusohjelman rdquoesimerkkirdquo Taumlmauml laumlhes-

tymistapa ohjelmiston kaumlaumlntaumlmiseen tulee vaivalloiseksi viimeistaumlaumln siinauml vaiheessa

kun projektiin lisaumltaumlaumln tiedostoja kaumlaumlntaumlmiskomento muuttuu ja se on haettava ko-

mentorivihistoriasta tai kirjoitettava uudestaan Makefilen tekeminen ratkaisee taumlmaumln

ongelman [A Simple Makefile Tutorial]

Esimerkki makefilestauml naumlyttaumlauml taumlltauml

1 esimerkki tiedosto1c tiedosto2c

2 gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Jos yllauml olevat rivit kirjoitetaan rdquoMakefilerdquo- tai rdquomakefilerdquo-nimiseen tiedostoon ja kirjoi-

tetaan komentoriville rdquomakerdquo niin suoritetaan makefileen kirjoitettu komento (rivi 2)

Make ilman optioita suorittaa automaattisesti makefilen ensimmaumlisen kohteen (target)

joka taumlssauml tapauksessa on nimeltaumlaumln rdquoesimerkkirdquo Rivillauml 1 olevat tiedosto1c ja tiedos-

to2c kertoo makelle ettauml naumliden tiedostojen olemassaolo vaaditaan kohteen suoritta-

10

miseen Korostetaan ettauml make vaatii tabulaattorin kaumlytoumln ennen jokaista komentoa

(rivi 2) [A Simple Makefile Tutorial]

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 esimerkki tiedosto1o tiedosto2o

5 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

Edellisen esimerkin riveille 1 ja 2 on lisaumltty muuttujat rdquoKAANTAJArdquo ja rdquoOPTIOTrdquo Naumliden

muuttujien muuttaminen vaikuttaa koko tiedostoon ndash taumlssauml tapauksessa ainoastaan

riviin 5

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 all esimerkki

5

6 esimerkki tiedosto1o tiedosto2o

7 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

8

9 tiedosto1o tiedosto1c

10 gcc -c tiedosto1c

11 12 tiedosto2o tiedosto2c

13 gcc -c tiedosto2c

14 15 clean

16 rm -rf o esimerkki

Edellinen esimerkki koostuu viidestauml eri kohteesta

Ensimmaumlinen kohde rdquoallrdquo suoritetaan kun Make ajetaan ilman optioita Jotta rdquoallrdquo voi-

taisiin suorittaa pitaumlauml suorittaa ensin rdquoesimerkkirdquo (rivi 6) koska rdquoallrdquo on riippuvainen

kohteesta rdquoesimerkkirdquo

Seuraavaa kohdetta rdquoesimerkkirdquo ei voi kuitenkaan suorittaa ennen kuin Make on tar-

kastanut tiedostojen rdquotiedosto1ordquo ja rdquotiedosto2ordquo aikaleimat jos aikaleimat ovat van-

hentuneet eli tiedostot ovat muuttuneet on ajettava kohteet rdquotiedosto1ordquo sekauml rdquotie-

dosto2ordquo Naumlmauml kohteet ajettuaan voi Make siirtyauml suorittamaan kohdetta rdquoesimerkkirdquo

ja taumlmaumln jaumllkeen kohdetta rdquoallrdquo jolla ei ole toteutusta

11

Kohteella rdquocleanrdquo ei ole riippuvuuksia Taumlllaista kohdetta kutsutaan komentorivillauml ko-

mennolla rdquomake cleanrdquo Rivillauml 16 oleva komento poistaa kaikki tyoumlhakemistossa sijait-

sevat rdquoordquo-paumlaumltteiset tiedostot sekauml sovellusohjelman rdquoesimerkkirdquo

Viimeisin makefile-esimerkki on yksinkertainen ohjelmiston koonti vaikka se vaikuttaa

pelkaumlstaumlaumln ohjelman kaumlaumlntaumlmiseltauml Jos yllauml olevaa esimerkkiauml haluttaisiin kehittaumlauml li-

saumlauml voitaisiin siihen lisaumltauml esimerkiksi kohde joka hakee laumlhdekoodin tietovarastosta ja

poistaa paikalliset laumlhdekoodit kovalevyltauml ohjelman kaumlaumlntaumlmisen jaumllkeen

32 Ant

Luvussa 31 tutustuttiin makefileen joka on Maken koontikuvaustiedosto Taumlssauml luvus-

sa perehdytaumlaumln koontityoumlkalu Antin kaumlyttaumlmaumlaumln Xml-muotoiseen koontikuvaukseen

Apache Ant on Java kirjasto- ja komentorivityoumlkalu jonka tehtaumlvaumlnauml on ajaa prosesseja

jotka on kuvattu koontitiedostoissa rdquokohteinardquo joilla on keskinaumlisiauml riippuvaisuuksia

Ant on paumlaumlasiallisesti Java-sovellusten koontisovellus mutta sitauml voidaan kaumlyttaumlauml myoumls

C -ja C++ -ohjelmistojen kokoamiseen Taumlssauml luvussa on esimerkki Java-ohjelmiston

koonnista

Antin kaumlyttaumljaumlt voivat kehittaumlauml omia rdquoantlibsrdquo-kirjastoja joihin sisaumlltyy omia tehtaumlviauml

(tasks) ja tyyppejauml (types) Kaumlyttaumljille tarjotaan myoumls suuri maumlaumlrauml valmiiksi tehtyjauml

kaupallisia tai avoimia rdquoantlibsrdquo kirjastoja [Apache Ant Welcome]

Ant-koontitiedosto koostuu neljaumlstauml eri elementistauml projects targets tasks ja proper-

ties

Koontitiedostossa kuvatulla projektilla on kolme attribuuttia name default sekauml base-

dir Name kuvaa projektin nimeauml ja eikauml sitauml ole pakko maumlaumlritellauml Default kuvaa koon-

titiedoston oletuskohdetta (default target) jota kutsutaan kun kohdetta ei erikseen

anneta kokoamiskomennossa Basedir maumlaumlrittelee projektin tyoumlhakemiston jota kaumlyte-

taumlaumln hakemistopolkujen selvittaumlmiseksi Taumlmaumlkaumlaumln attribuutti ei ole pakollinen Jos

basedir-atribuuttia ei maumlaumlritellauml kaumlytetaumlaumln tyoumlhakemistona samaa hakemistoa jossa

koontitiedosto sijaitsee

12

Kohteilla (targets) on riippuvuuksia muista kohteista Kuten makefilessauml voidaan koh-

teiden vaumllille rakentaa riippuvuuksia ja luoda ohjelmiston kokoamisen kannalta jaumlrkevauml

riippuvaisuuksien verkosto

Tehtaumlvaumlt (tasks) ovat suoritettavia koodirivejauml Tehtaumlvillauml voi olla useita attribuutteja

kuten tulevasta esimerkissauml naumlhdaumlaumln

Ominaisuuksilla (properties) voidaan antaa oikoteitauml (shortcuts) komentoihin tai merk-

kijonoihin joita kaumlytetaumlaumln usein koontitiedostossa Ominaisuudella on nimi- sekauml arvo-

attribuutti [Apache Ant Using Apache Ant]

1 ltproject name=MyProject default=dist basedir=gt

2 ltdescriptiongt

3 Yksinkertainen koontikuvaustiedosto

4 ltdescriptiongt

5 lt--Asetetaan julkiset ominaisuudet --gt

6 ltproperty name=src location=srcgt

7 ltproperty name=build location=buildgt

8 ltproperty name=dist location=distgt

9

10 lttarget name=initgt

11 ltmdashLuodaan aikaleima --gt

12 lttstampgt

13 ltmdashLuodaan hakemistorakenne ldquocompilerdquo tehtaumlvaumllle --gt

14 ltmkdir dir=$buildgt

15 lttargetgt

16 17 lttarget name=compile depends=initgt

18 lt--Kaumlaumlnnetaumlaumln Java-koodi $srcstauml into $buildiin --gt

19 ltjavac srcdir=$src destdir=$buildgt

20 lttargetgt

21 22 lttarget name=dist depends=compile

23 description=Generoidaan distribuutio gt

24 lt--Luodaan distribuutio kansio --gt

25 ltmkdir dir=$distlibgt

26 27 lt-- Laitetaan $build sisaumlltouml MyProject-$DSTAMPjarriin --gt

28 ltjar jarfile=$distlibMyProject $DSTAMPjar basedir=$buildgt

29 lttargetgt

30 31 lttarget name=clean

32 description=clean up gt

33 ltmdashPoistetaan $build ja $dist hakemistot --gt

34 ltdelete dir=$buildgt

13

35 ltdelete dir=$distgt

36 lttargetgt

37 ltprojectgt

[Apache Ant Using Apache Ant Example Buildfile]

Edelliseen koontikuvaukseen on maumlaumlritelty projekti jonka nimi on ldquoMyProjectrdquo Kun

tutustutaan koonnin kuvaukseen huomataan ettauml koontitiedoston projektin oletuskoh-

teella rdquodistrdquo on riippuvuus kohteeseen rdquocompilerdquo jolla on riippuvuus kohteeseen rdquoinitrdquo

Initillauml ei ole riippuvaisuuksia Taumlten ensimmaumlinen koonnin yhteydessauml ajettava kohde

onkin rdquoinitrdquo eikauml rdquodistrdquo vaikka rdquodistrdquo on koontikuvauksen oletuskohde Voidaan sanoa

ettauml koonnin paumlaumlmaumlaumlrauml on suorittaa kohde rdquodistrdquo ja paumlaumlmaumlaumlraumln saavuttamiseksi on

suoritettava kohteita joista taumlmauml on riippuvainen Riippuvuudet toimivat samalla peri-

aatteella kuin aikaisemmissa makefile-esimerkeissauml

Ohjelmiston kokoamisen yhteydessauml halutaan edellisessauml esimerkissauml saada ohjelmisto

jakeluun Jotta ohjelmisto saataisiin jakeluun on se ensin kaumlaumlnnettaumlvauml ja sitauml ennen on

luotava ohjelmiston hakemistorakenne

Jos halutaan kehittaumlauml esimerkin koontikuvausta voidaan esimerkiksi suorittaa verk-

kosivujen paumlivitystehtaumlvauml yhden kohteen sisaumlllauml ja asettaa se riippuvaiseksi kohteesta

rdquodistrdquo Naumlin ohjelmasta saadaan paumlivitetty versio jakeluun ja verkkosivuille tulee taumlstauml

automaattinen ilmoitus ohjelmiston kaumlyttaumljille

33 Maven

Luvussa 32 tutustuttiin Anttiin joka on natiivi koontityoumlkalu Seuraavaksi tutustutaan

koonti- ja projektinhallintasovellukseen Maveniin jolla voidaan kuvata koontiprosessin

lisaumlksi myoumls projektin rakenne Maven rohkaisee kaumlyttaumlmaumlaumln parhaita kaumlytaumlntoumljauml (best

practises) joita kaumlyttaumlmaumlllauml ohjelmistoprojektista toiseen siirtyessauml oppimiskynnys

uuden koontikuvauksen ymmaumlrtaumlmiseen pienenee [Maven vs Ant or Ant vs Maven]

Maven on kaumlytoumlssauml Metropolian Ohjelmistotuotantoprojekti-kurssin ohjelmistoprojekti-

en koontityoumlkaluna

Apache Maven on ohjelmistoprojektin hallintatyoumlkalu Se perustuu projekti-olio-malli -

konseptiin (Project Object Model POM) Maven kykenee kokoamaan projektin testaa-

14

maan projektin antamaan kaumlyttaumljaumllle palautetta dokumentoimaan kokoamisen ja te-

kemaumlaumln useita muita tehtaumlviauml erillisillauml Mavenin tarjoamilla lisaumlosilla (plug-ins) [Apache

Maven Project Welcome to Apache Maven]

POM on XML-tiedosto joka sisaumlltaumlauml informaatiota projektista ja yksityiskohtaisen konfi-

guraation jota Maven kaumlyttaumlauml projektin kokoamiseen POM kostuu kohteista (goals)

jotka on maumlaumlritelty pomxml -tiedostossa Kun suoritetaan erillinen tehtaumlvauml tai kohde

Maven etsii POMmia tyoumlhakemistosta lukee POMmin hakee tarvittavan konfiguraati-

on ja suorittaa kohteen

Eraumlitauml POMissa maumlaumlriteltaumlviauml konfiguraatioita ovat projektin riippuvuudet kaumlytettaumlvaumlt

lisaumlosat ajettavat kohteet ja koontiprofiilit POMiin voi maumlaumlritellauml muutakin tietoa ku-

ten projektin version kehittaumljaumlt ja postituslistat [Apache Maven Project Introduction

to the POM]

Maven on Java-tyoumlkalu joten Java taumlytyy olla asennettuna Mavenia ajavalle koneelle

Taumlmauml luku perustuu Apachen verkkosivuilla sijaitsevaan Mavenin kaumlyttoumlohjeeseen

[Apache Maven Project Maven in 5 Minutes] Seuraavaksi luetellaan eri vaiheet Ma-

ven-projektin luomiseksi

Ensin on ladattava Maven ja kaumlytaumlvauml laumlpi asennusohjeet jotka loumlytyvaumlt osoitteesta

[httpmavenapacheorgdownloadhtmlInstallation] Taumlmaumln jaumllkeen on avattava

terminaali tai komentokehote ja kirjoitettava

mvn --version

Taumlmaumln tulostaa asennetun Mavenin ja Javan versio Esimerkiksi

1 Apache Maven 303 (r1075438 2011-02-28 183109+0100)

2 Maven home Dapache-maven-303bin

3 Java version 160_25 vendor Sun Microsystems Inc

4 Java home EProgram FilesJavajdk160_25jre

5 Default locale nl_NL platform encoding Cp1252

6 OS name windows 7 version 61 arch amd64 family windows

Maven-projekti luodaan ajamalla terminaalissa Maven kohde (goal)

15

mvn archetypegenerate -DgroupId=commycompanyapp -DartifactId=my-app -

DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Ensimmaumlisellauml ajolla taumlmauml komento lataa tarvittavat Maven lisaumlosat ja muita tiedostoja

paikalliseen tietovarastoon Huomataan ettauml rdquogeneraterdquo kohde loi rdquoartifactIdrdquonauml anne-

tun hakemiston

Kirjoitetaan komentoriville

cd my-app

Taumlmaumln kansion alta loumlytyy Mavenin standardi projektirakenne

my-app

|-- pomxml

`-- src

|-- main

| `-- java

| `-- com

| `-- mycompany

| `-- app

| `-- Appjava

`-- test

`-- java

`-- com

`-- mycompany

`-- app

`-- AppTestjava

Yllauml kuvatussa hakemistorakenteessa oleva rdquosrcmainjavardquo-hakemisto sisaumlltaumlauml projek-

tin laumlhdekoodin Vastaavasti rdquosrctestjavardquo-hakemisto sisaumlltaumlauml testien laumlhdekoodin

Pomxml-tiedosto kuvaa projektin konfiguraatiota ja sisaumlltaumlauml projektin kokoamisohjeet

Esimerkkiprojektin POM naumlyttaumlauml taumlltauml

1 ltpro-

ject xmlns=httpmavenapacheorgPOM400 xmlnsxsi=httpwwww3org20

01XMLSchema-instance

2 xsischemaLocation=httpmavenapacheorgPOM400 httpmavenapacheorg

xsdmaven-400xsdgt

3 ltmodelVersiongt400ltmodelVersiongt

4

5 ltgroupIdgtcommycompanyappltgroupIdgt

6 ltartifactIdgtmy-appltartifactIdgt

16

7 ltversiongt10-SNAPSHOTltversiongt

8 ltpackaginggtjarltpackaginggt

9

10 ltnamegtMaven Quick Start Archetypeltnamegt

11 lturlgthttpmavenapacheorglturlgt

12 13 ltdependenciesgt

14 ltdependencygt

15 ltgroupIdgtjunitltgroupIdgt

16 ltartifactIdgtjunitltartifactIdgt

17 ltversiongt482ltversiongt

18 ltscopegttestltscopegt

19 ltdependencygt

20 ltdependenciesgt

21 ltprojectgt

POM-tiedosto on Maven-projektin konfiguraation ydin Se sisaumlltaumlauml suurimman osan

informaatiosta joka vaaditaan projektin kokoamiseen halutulla tavalla

Aikaisemmassa esimerkissauml ajettiin Mavenin kohde (goal) archetypegenerate ja an-

nettiin sille parametreja Etuliite archetype on lisaumlosa joka sisaumlltaumlauml kohteen generate

Taumltauml voi verrata Antin tehtaumlvaumlaumln Taumlmauml kohde loi yksinkertaisen projektin joka perus-

tuu arkkityyppiin Yleisesti Mavenin lisaumlosat koostuvat kohteista joilla on yhteinen paumlauml-

tarkoitus Esimerkki taumlllaisesta lisaumlosasta on jboss-maven-plugin jonka tehtaumlvaumlnauml on

kaumlsitellauml erinaumlisiauml Jboss-komponentteja (items)

Maven-projekti kootaan komentoriviltauml seuraavanlaisesti

mvn package

Komentorivi tulostaa eri komentoja tulostus loppuu seuraavanlaisesti

[INFO] --------------------------

[INFO] BUILD SUCCESSFUL

[INFO] --------------------------

[INFO] Total time 2 seconds

[INFO] Finished at Thu Jul 07 213452 CEST 2011

[INFO] Final Memory 3M6M

[INFO] --------------------------

Toisin kuin ensimmaumliseksi suoritetussa komennossa (archetypegenerate) huomataan

taumlllauml kertaa kaumlytetty komento package on vain yksi sana Taumlllaista komentoa kutsutaan

17

kohteen (goal) sijaan vaiheeksi (phase) Vaihe on yksi askel koonnin elinkaaressa

(build lifecycle) joka on jaumlrjestetty sarja eri vaiheita Jos esimerkiksi ajetaan vaiheen

compile Maven itseasiassa suorittaa sarjan vaiheita

1 validate

2 generate-sources

3 process-sources

4 generate-resources

5 process-resources

6 compile

Compilen ajamisen jaumllkeen voidaan testata kaumlaumlnnettyauml JARia seuraavalla komennolla

java -cp targetmy-app-10-SNAPSHOTjar commycompanyappApp

Taumlmauml komento tulostaa

Hello World

Kaumlydaumlaumln laumlpi vielauml eri Mavenin yleisimmaumlt oletuselinkaaressa kaumlytetyt vaiheet Naumlitauml

ovat

-validate varmistaa ettauml projekti on ehjauml ja kaikki tarvittava tieto on saatavilla

-compile kaumlaumlntaumlauml projektin laumlhdekoodin

-test testaa kaumlaumlnnetyn laumlhdekoodin kaumlyttaumlen sopivaa yksikkoumltestikehystauml Naumliden

testien ei tulisi vaatia vaiheita package tai deploy

-package paketoi kaumlaumlnnetyn koodin sen jaettavaan muotoon esimerkiksi JARriksi

-integration-test prosessoi ja jaumlrjestaumlauml paketin ympaumlristoumloumln jossa integraatiotestejauml

voidaan ajaa jos tarpeellista

-verify tarkistaa onko paketti validi ja taumlyttaumlaumlkouml se laatukriteerit

-install asentaa paketin paikalliseen tietovarastoon muiden paikallisten projektien

kaumlyttoumloumln tai paikallisten projektien riippuvuudeksi

-deploy kopioi lopullisen paketin ulkoiseen tietovarastoon jaettavaksi muille kehittaumljil-

le ja projekteille Tehdaumlaumln integraatio- tai julkaisuympaumlristoumlssauml

On vielauml kaksi muuta mainitsemisen arvoista Maven-elinkaarta jotka eivaumlt sisaumllly yllauml

listattuun oletuselinkaareen Naumlitauml ovat

18

-clean poistaa aikaisempien koontien yhteydessauml luodut artifaktit

-site generoi verkkodokumentaation kyseiselle projektille

Jokainen vaihe sisaumlltaumlauml sarjan suoritettavia kohteita joiden ajaminen riippuu projektin

paketointityypistauml Jos projektin tyyppi on JAR niin package ajaa kohteen jarjar Vas-

taavasti WAR -tyyppisen projektin package -vaihe suorittaa kohteen warwar

34 Koonti ja kaumlyttoumloumlnotto

Ohjelmiston saattamista laumlhdekoodista loppukaumlyttaumljaumllle kaumlyttoumlkelpoiseen muotoon kut-

sutaan koonniksi Laumlhdekoodin kaumlaumlntaumlmisen lisaumlksi koonti voi sisaumlltaumlauml monia muita vai-

heita Aleksi Lukkarinen on opinnaumlytetyoumlssaumlaumln listannut esimerkkejauml erilaisista koon-

neista seuraavasti [Aleksi Lukkarinen opinnaumlytetyouml]

-ohjelmointikielisen laumlhdekoodin sekauml resurssien automatisoitua luomista

-eri ohjelmointikielillauml tuotetun laumlhdekoodin kaumlaumlntaumlmistauml kone- jatai vaumllikielille

-vaumlli- tai konekielisen ohjelmakoodin jaumllkikaumlsittelyauml esimerkiksi testauksen aspektioh-

jelmoinnin tai koodin tarkoituksellisen sotkemisen vuoksi

-sovelluksen testausta (esimerkiksi toimivuus tietoturvallisuus suorituskyky rakenteel-

linen ja koodaustekninen laatu sekauml kaumlyttoumltarkoitustaan vastaavuus)

-dokumentaation koontia (kuten varsinaisen sovelluksen koonti)

-koontituotteiden paketointia sekauml mahdollisten fyysisten jakelumedioiden luontia toi-

mivuus- ja virustarkistuksineen

-ohjelmistomoduulien integrointia

-palautteen antamista koonnin tuloksista

Lukkarinen jaumlsentelee opinnaumlytetyoumlssaumlaumln sovelluksen jakeluun ja kaumlyttoumloumlnottoon sisaumll-

tyviksi asioiksi

-Sovellusta suorittavien ja tukevien palvelinympaumlristoumljen luominen ja paumlivittaumlminen

-Sovelluksen sekauml sen kaumlyttaumlmien ohjelmistokomponenttien siirtaumlminen ja maumlaumlrittaumlmi-

nen esimerkiksi testaus- laadunvarmistus- esittely-koulutus- sekauml tuotantoympaumlris-

toumlihin Kohdeympaumlristoumlissauml olevat vanhat versiot on mahdollisesti paumlivitettaumlvauml jollei

uusia versiota asenneta niiden rinnalle

19

-Uusien tietokantojen luominen sekauml vanhojen paumlivittaumlminen uutta sovellusversiota

vastaaviksi

-Kirjanpidollisen materiaalin tuottaminen ja yllaumlpitaumlminen

-Palautteen antaminen jakelu- ja kaumlyttoumloumlnottoprosessin onnistumisesta

Taumlmaumln luvun tarkoitus oli perehdyttaumlauml lukija ymmaumlrtaumlmaumlaumln koontiprosessia koontiku-

vaus-esimerkkien avulla Koontiprosessin ymmaumlrtaumlminen on vaumllttaumlmaumltoumlntauml seuraavan

luvun ymmaumlrtaumlmiseen jossa perehdytaumlaumln koontiympaumlristouml -kaumlsitteeseen

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant

Taumlssauml luvussa luodaan nopea katsaus koonti- ja kaumlyttoumloumlnottoprosessien automatisoimi-

seen tutustutaan jatkuvaan integraatioon sekauml sovellukseen Jenkins CI

Lisaumlksi tutustutaan projektihallintaohjelmaan Agilefant Agilefant on yksi monipuoli-

simmista kevyistauml vapaan laumlhdekoodin projektinhallintasovelluksista ja se soveltuu

niin pieniin kuin suuriinkin projekteihin

Naumlmauml sovellukset esitellaumlaumln pohjustuksena lukuja 5 ja 6 varten joissa tutustutaan

koontiympaumlristoumln tarkkailuun

41 Jatkuva integraatio

Jatkuva integraatio (Continuous Integration CI) on modernin sovelluskehityksen kul-

makivi Itse asiassa se on mullistanut sovelluskehityksen Kun jatkuva integraatio ote-

taan kaumlyttoumloumln organisaatiossa se muuttaa radikaalisti sitauml miten tyoumlryhmauml ymmaumlrtaumlauml

koko kehitysprosessin Jatkuvalla integraatiolla on potentiaalia laukaista sarja paran-

nuksia organisaation tuotteen kehitysprosessiin Se alkaa yksinkertaisesta automaatti-

sesta koonnista kehittyen systeemiksi joka automaattisesti saattaa tuotteen tuotan-

toon Hyvauml CI-infrastruktuuri mahdollistaa virheiden helpon sekauml nopean huomaamisen

ja tarjoaa kojelaudan projektin hyvinvoinnin ja muiden statistiikkojen seuraamiseen

sekauml kehittaumljille ettauml muille projektin osapuolille Jenkins The Definite Guiden mukaan

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 6: Joakim Sandqvist - Theseus

Koontipalvelin

Palvelin jolla koonti suoritetaan

Make Yksi vanhimmista ja suosituimmista koontityoumlkaluista

Projektioliomalli

Mavenin prosessikuvaus tyypillisesti nimetty pomxmlksi

Prosessikuvaus

Koontityoumlkalulle syoumltettaumlvauml kuvaus joka maumlaumlrittelee koontiprosessin Pro-

sessikuvauksen sisaumlltaumlvaumlauml tiedostoa voidaan kutsua koontitiedostoksi tai

koontikuvaustiedostoksi

Scrum Ketteraumlssauml kehityksessauml kaumlytetty projektinhallintamenetelmauml

Subversion Versionhallintasovellus

RSS-syoumlte RSS-feed Tarkoittaa mm Real Simple Syndication Hyvauml tapa levittaumlauml

usein paumlivittyvaumlauml tietoa eri laumlhteisiin

Versionhallintapalvelin

Versionhallintasovellusta kuten Subversionia ajava palvelin

XF-laite Extreme Feedback Device Extreme Notification Device Laite joka antaa

suoraa palautetta koonnin tilasta

1

1 Johdanto

Taumlssauml opinnaumlytetyoumlssauml esitellaumlaumln Metropolia Ammattikorkeakoulun Ohjelmistotuontato-

projekti-kurssin kaumlytoumlssauml oleva kehitysympaumlristouml Taumlmaumln kehitysympaumlristoumln esittelemi-

sen tyoumlympaumlristoumlineen palvelimineen ja palvelinsovelluksineen on tarkoitus toimia

suuntaa antavana materiaalina niin pienten kuin suurienkin ohjelmistoprojektien koon-

tiympaumlristoumljen ja informatiivisten kehitysympaumlristoumljen rakentamiseen

Metropolia Ammattikorkeakoulun opiskelijat tekevaumlt Ohjelmistotuotantoprojekti-

kurssilla asiakkaan tilaaman ohjelmistotuotteen Opiskelijat suunnittelevat ja ohjelmoi-

vat tuotteen alusta loppuun Opiskelijoilla on kaumlytoumlssaumlaumln moderni kehitysympaumlristouml

jota kehitetaumlaumln entisestaumlaumln koko ajan Kehitysympaumlristouml koostuu tyoumltilojen laiteratkai-

suista tyoumlasemien sovelluksista sekauml palvelin- ja palvelinsovellusinfrastruktuurista

Taumlssauml dokumentissa tullaan esittelemaumlaumln opinnaumlytetyoumlssauml ohjelmoitu Metropolian Oh-

jelmistotuotantoprojekti-kurssin kaumlyttoumloumln tarkoitettu koontiympaumlristoumln monitorointi

sovellus rdquoKoontardquo Sovelluksen tarkoitus on antaa kurssin tyoumlryhmille reaaliaikaista pa-

lautetta ohjelmistoprojektin koonnin tilasta

Luvussa 2 tutustutaan ohjelmistotuotantoprojekti-kurssin sisaumlltoumloumln kehitysympaumlristoumloumln

sekauml tyoumltiloihin Taumlmaumln jaumllkeen luvussa 3 perehdytaumlaumln ohjelmiston kokoamiseen kaumly-

maumlllauml laumlpi erilaisia koontiprosesseja eri koontityoumlkaluilla

Luvussa 4 kerrotaan jatkuvasta integraatiosta sekauml koontiympaumlristoumlstauml Lisaumlksi esitel-

laumlaumln sovellukset Jenkins CI sekauml Agilefant jotka liittyvaumlt vahvasti lukujen 5 ja 6 aihee-

seen koontiympaumlristoumln tarkkailu

Lopuksi luvussa 6 esitellaumlaumln opinnaumlytetyoumlssauml tehty Java-sovellus rdquoKoontardquo Taumlssauml lu-

vussa kaumlydaumlaumln laumlpi hieman sovelluksen ohjelmointiprosessia ja perehdytaumlaumln sovelluk-

sen toiminnallisuuteen sekauml arkkitehtuuriin yksityiskohtaisesti

2

2 Ohjelmistotuotantoprojekti -kurssi

Taumlssauml luvussa perehdytaumlaumln Metropolia Ammattikorkeakoulun Ohjelmistotuotantoprojek-

ti-kurssiin Luvun tarkoitus on antaa lukijalle hyvauml yleiskuva kurssin sisaumllloumlstauml tyoumltilois-

ta sekauml kehitysympaumlristoumlstauml

21 Ohjelmistotuotantoprojekti-kurssin yleiskuvaus

Opiskelijat paumlaumlsevaumlt soveltamaan kurssilla useita aiemmilla tietotekniikan kursseilla

opittuja tietoja ja taitoja Tyouml on projektiluontoinen Kuhunkin ryhmaumlaumln kuuluu 4-6

opiskelijaa ja ryhmiauml on yhteensauml 2-4 Projekti kestaumlauml kahden periodin ajan ja sen

kokonaistyoumlmaumlaumlrauml on noin 800-1200 tyoumltuntia

Ohjelmiston kehittaumlmiseen kaumlytetaumlaumln Scrum-ketteraumlauml menetelmaumlauml Scrumin tyoumlvaiheet

koostuvat sprinteistauml joita taumlssauml projektissa on viisi kappaletta Jokaista sprinttiauml edel-

taumlauml aloituspalaveri jossa sovitaan kyseisen sprintin tehtaumlvaumlt ja tavoite Ydinroolit

Scrumissa ovat tuotteen omistaja tiimi sekauml Scrum Master Kurssin tyoumlryhmien Scrum

Mastereina toimivat opettajat Tiimit koostuvat kurssin tyoumlryhmistauml ja tuotteen immate-

riaalioikeudet omistaa Metropolia Oy joka puolestaan antaa tuotteen kaumlyttoumloikeudet

projektiin osallistuneille tahoille Taumlmauml on toimintapa yleensauml mutta asiakkaasta riip-

puen tehdaumlaumln erilaisia sopimuksia

Jokainen kurssin ryhmauml maumlaumlrittelee suunnittelee toteuttaa testaa sekauml dokumentoi

suurehkon ohjelmiston Jokaisella projektilla on oma asiakas joko oikea yritys tai opet-

taja joka edustaa tyoumln tilaajaa Asiakas on kaumlytettaumlvissauml kunkin sprintin aloituspalave-

rissa toiminnallisten vaatimusten maumlaumlrittelyauml varten Kullakin ryhmaumlllauml on myoumls ohjaa-

ja jonka tehtaumlvaumlnauml on auttaa tyoumln kaumlynnistaumlmisessauml sekauml toimiminen Scrum Masteri-

na Ohjaajat eivaumlt varsinaisesti osallistu tiimin tyoumlskentelyyn

22 Ohjelmistotuotantoprojekti-kurssin kehitysympaumlristoumln yleiskuvaus

Kurssin viimeisimpiauml kehitysympaumlristoumlparannuksia on Aleksi Lukkarisen opinnaumlytetyouml-

naumlaumln tekemauml rdquoopetuskaumlyttoumloumln soveltuva virtuaalikonepohjainen kehitysympaumlristouml

3

jonka avulla innovaatioprojekteja toteuttavat opiskelijat voivat tyoumlskennellauml jatkuvan

integraation ja kaumlyttoumloumlnoton periaatteiden mukaisestirdquo [Lukkarinen 2011 tiivistelmauml]

Uusimmat parannukset kurssin tyouml- ja kehitysympaumlristoumloumln ovat taumlhaumln opinnaumlytetyoumlhoumln

kuuluva sovellus rdquoKoontardquo johon palataan vielauml taumlmaumln dokumentin loppupuolella sekauml

kurssin tyoumltiloihin tehdyt uudet laitehankinnat

Katselmus kehitysympaumlristoumloumln aloitetaan esittelemaumlllauml kurssin uudet tyoumltilat Taumlmaumln

jaumllkeen perehdytaumlaumln kurssin palvelininfrastruktuuriin

221 Kurssin tyoumltilat

Tyoumltilat ja viihtyvyys ovat olennainen osa ryhmaumlkeskeistauml tyoumlntekoa On taumlrkeaumlauml ettauml

kehitysryhmaumlllauml on tarpeeksi tilaa tyoumlskennellauml ja ryhmaumln sisaumlinen kommunikaatio toi-

mii mahdollisimman helposti Tyoumltilat liittyvaumlt myoumls olennaisesti koontiympaumlristoumln tark-

kailuun jota taumlssauml opinnaumlytetyoumlssauml kaumlsitellaumlaumln myoumlhemmin

Joulukuussa 2011 Metropolia teki uusia laitehankintoja Bulevardin toimipisteeseen Oh-

jelmistotuotantoprojekti-kurssin tyoumltiloihin Ensisijaisesti jokaisen kurssiryhmaumln tyoumltiloi-

hin oli saatava naumlyttouml jossa ajettaisiin taumlssauml opinnaumlytetyoumlssauml tehtyauml koontiympaumlristoumln

tarkkailuun soveltuvaa ohjelmaa rdquoKoontardquo

Taumlssauml luvussa kaumlydaumlaumln laumlpi kurssin tyoumltiloihin hankitut laitteet ja esitellaumlaumln tyoumltilat ko-

konaisuudessaan mukaan lukien laitteet jotka jaumlivaumlt kaumlyttoumloumln vanhasta laitekokoon-

panosta

Kuvassa 1 on esitelty yhden ryhmaumln tyoumltila Kyseisen ryhmaumln tyoumltilaan kuuluu kolme

tussitaulua joista yksi laumlhiprojektorin alla oleva toimii myoumls projektointipintana laumlhi-

projektorille Ryhmaumlllauml on kaumlytoumlssaumlaumln kuusi kannettavaa tietokonetta Tietokoneet sekauml

laumlhiprojektori ovat kiinni HDMI-valitsimessa Kuvan vasemmassa ylaumlnurkassa on mini-

tietokone sekauml naumlyttouml Minitietokone ja naumlyttouml on varattu koontiympaumlristoumln tarkkailuun

(luku 4) Ryhmauml naumlkee laitteesta ohjelmistoprojektinsa tilan reaaliajassa ja pystyy rea-

goimaan projektin tilamuutoksiin nopeasti

4

Kuva 1 Yhden ryhmaumln tyoumltila

Yksi oleellisimmista uusista laitehankinnoista on laumlhiprojektori (kuva 2) Jokaisella kurs-

sin ryhmaumlllauml on kaumlytoumlssaumlaumln yksi laumlhiprojektori Toisin kuin perinteinen projektori laumlhi-

projektori saadaan asetettua seinaumllle suoraan projektorointikohteen ylaumlpuolelle Taumlten

se vie vaumlhemmaumln tilaa kuin normaali projektori ja oli hyvauml valinta uuteen laitekokoon-

panoon

Kuva 2 Hitachi CP-AW250NM

Tyoumltiloihin hankittiin 2000 mm x 1200 mm tussitaulut jotka toimivat laumlhiprojektorien

piirtoalueina sekauml vaihtoehtoisesti tussitauluina

5

Jokaiselle ryhmaumllle hankittiin 27-tuumaiset LG E2770V -malliset LED-naumlytoumlt Naumlmauml naumly-

toumlt on tarkoitettu vain koontiympaumlristoumln tarkkailua varten Ne kestaumlvaumlt pitkaumlkestoista

kaumlyttoumlauml ja voivat olla paumlaumlllauml youmltauml paumlivaumlauml ilman ettauml kuva palaa kiinni ruutuun Naumlytoumlt

on kiinnitetty seinaumlaumln kolmi-nivelisillauml Melicone Stile DR200 -mallisilla seinaumltelineillauml

joiden avulla naumlyttoumljen kaltevuutta ja sijaintia pystytaumlaumln saumlaumltaumlmaumlaumln

Ryhmille hankitut minitietokoneet (kuva 3) ovat kiinni yllauml esitetyissauml naumlytoumlissauml Minitie-

tokoneita hallitaan langattomalla hiirellauml sekauml naumlppaumlimistoumlllauml Perinteisen poumlytaumltietoko-

neen hankkimisen sijaan paumlaumldyttiin pienempaumlaumln vaihtoehtoon jotta tyoumlskentelytilaa

jaumlisi enemmaumln

Kuva 3 HP8200 USDT -minitietokone

Taumlrkeauml osa uutta laitekokoonpanoa on HDMI-valitsin (kuva 4) Valitsin on kytkettynauml

ryhmaumln laumlhiprojektoriin sekauml ryhmaumln jaumlsenten kaumlyttaumlmiin kannettaviin tietokoneisiin

Valitsimella on taumlrkeauml rooli ryhmien viikkopalavereissa ryhmaumln paumlivittaumlisessauml tyoumlsken-

telyssauml sekauml kehitysryhmaumln ja asiakkaan vaumllisissauml tapaamisissa Valitsin mahdollistaa

sujuvamman kommunikaation ryhmaumln jaumlsenten vaumllillauml Kurssiryhmien kehittaumljaumlt saavat

nappia painamalla oman kannettavan tietokoneensa naumlkymaumln laumlhiprojektoriin

6

Kuva 4 Kramer VS-81H HDMI -valitsin

222 Kurssin palvelimet

Kurssin ryhmaumlkohtaiset palvelimet kevaumlaumlllauml 2012 ovat koontipalvelin testi- ja tuotanto-

sovelluspalvelimet sekauml testi- ja tuotantotietokantapalvelimet (kuva 5) Testipalvelimet

toimivat ryhmaumln omana hiekkalaatikkona Kehitysympaumlristoumln palvelininfrastruktuuri

koostuu kokonaisuudessaan seuraavassa kuvassa esitellyistauml palvelimista

Kuva 5 Kehitysympaumlristoumln palvelininfrastruktuuri

7

Seuraavaksi kaumlydaumlaumln laumlpi palvelimet yksitellen Kerrotaan mitauml sovelluksia kuhunkin

palvelimeen on asennettu ja mitauml ovat kunkin palvelimen tehtaumlvaumlt

Palvelimista koontiympaumlristoumln (luvut 34 4) kannalta oleellisimmassa roolissa on koon-

tipalvelin Jokaisella ryhmaumlllauml on oma koontipalvelimensa jossa ajetaan Jenkins CI -

sovellusta Jenkins CI on vastuussa projektien automaattisesta koonnista ja haumllyttaumlauml

ryhmaumllle projektin koonnin epaumlonnistuessa Jenkins CIstauml kerrotaan lisaumlauml luvussa 4

Tuotanto- ja testipalvelimia on kaksi kappaletta jokaista ryhmaumlauml kohti Tuotantoympauml-

ristoumloumln kuuluvat tuotantosovelluspalvelin sekauml tuotantotietokantapalvelin Tuotantotie-

tokantapalvelin sisaumlltaumlauml ryhmaumlkohtaiset tietokannat Tuotantosovelluspalvelin sisaumlltaumlauml

ryhmaumlkohtaiset palvelut kuten Phpn ja Javan Vastaavasti testiympaumlristoumloumln kuuluvat

testisovelluspalvelin ja testitietokantapalvelin joilla on sama toiminnallisuus kuin tuo-

tantoympaumlristoumln palvelimilla

Ryhmien kaumlytoumlssauml oleva testiympaumlristouml mahdollistaa esimerkiksi palvelinkonfiguraatioi-

den riskittoumlmaumln testaamisen ennen muutosten kaumlyttoumloumlnottoa tuotantoympaumlristoumln puo-

lella Tuotanto -ja testipalvelimet ovat virtualisoituja Palvelimien virtualisointi mahdol-

listaa palvelimen tilan tallennuksen Palvelinten oletustilat (snapshot) voidaan halutessa

ladata muistista palvelimen korruptoituessa konfiguraatiotestaamisen yhteydessauml

Jokaisella ryhmaumlllauml on siis kaumlytoumlssaumlaumln viisi ryhmaumlkohtaista palvelinta koonti- tuotanto-

sovellus- tuotantotietokanta- testisovellus- sekauml testitietokantapalvelin Taumlmaumln lisaumlksi

ryhmillauml on kaumlytoumlssaumlaumln kolme yleiskaumlyttoumlistauml palvelinta joista kerrotaan seuraavaksi

Naumlmauml palvelimet ovat versionhallinta- projektinhallinta- sekauml varmuuskopiopalvelin

Versionhallintapalvelimella sijaitsevat ryhmien kaumlytoumlssauml olevat kaksi tietovarastoa Tois-

ta tietovarastoa kaumlytetaumlaumln laumlhdekoodin taltioimiseen ja toista tietovarastoa oheistuot-

teiden kuten dokumentaation taltioimiseen Opiskelijaryhmien tietovarastojen lisaumlksi

palvelimella on innodev-tietovarasto ympaumlristoumln yllaumlpitoa ja kehitystauml varten Kuvassa 6

on esitelty esimerkki eraumlaumln ohjelmistoprojektin tietovaraston hakemistorakenteesta

8

Kuva 6 Esimerkki opiskelijaryhmaumln tietovaraston hakemistorakenteesta

Projektinhallintapalvelin sisaumlltaumlauml Agilefant-sovelluksen josta ajetaan yhtauml instanssia

kullekin kurssin ryhmaumllle Agilefant on projektinhallintasovellus joka soveltuu hyvin

ketteraumln kehityksen tarpeisiin Sitauml kaumlytetaumlaumln ryhmaumln tyoumltuntien merkkaamiseen ja

projektin kehityksen valvomiseen Agilefantista kerrotaan tarkemmin luvussa 4

Kurssiryhmien kaumlytoumlssauml olevalle varmuuskopiopalvelimelle on tarkoitus kopioida var-

muuskopiota projektinhallinta- ja versionhallintapalvelimien tiloista Varmuuskopiointi ei

ole automatisoitua jonka takia palvelimen kaumlyttoumlmaumlaumlrauml on jaumlaumlnyt pieneksi

3 Ohjelmiston kokoaminen

Ohjelmiston kokoaminen tarkoittaa yksinkertaisimmillaan ohjelmistokoodin kaumlaumlntaumlmistauml

ajettavaan muotoon Jos ohjelmisto on iso ja sen rakenne on modulaarinen voi kehit-

taumljaumlllauml olla tarve jakaa ohjelmiston kokoaminen useisiin operaatioihin joilla on keskinaumli-

siauml riippuvuuksia

Taumlssauml luvussa tutustutaan eri tapoihin toteuttaa ohjelmiston koonti Ensin perehdytaumlaumln

makefileen ja tutustutaan ohjelmiston kokoamiseen makefile-esimerkkien avulla Tauml-

9

maumln jaumllkeen perehdytaumlaumln modernimpiin koontisovelluksiin Ant ja Maven Naumlmauml luvut

ovat tarpeellisia koontiprosessin ymmaumlrtaumlmisen kannalta

31 Makefile

Makefile on tiedosto jota Unix-komento Make kaumlyttaumlauml ohjelman kokoamiseen Makefile

kuvaa ohjelman laumlhdekooditiedostojen vaumlliset riippuvuudet ja sisaumlltaumlauml ohjeet ohjelmis-

ton kaumlaumlntaumlmiseen Kaumlaumlntaumlmisen lisaumlksi makefileen voi sisaumlllyttaumlauml mitauml vain Unix-

komentoja ja siitauml voi kaumlynnistaumlauml testejauml

Otetaan esimerkkitapaus jossa C-kieliseen ohjelmistoon kuuluu 3 tiedostoa

tiedosto1c

tiedosto2c

tiedosto1h

Ilman makefileauml ohjelma kaumlaumlnnettaumlisiin Unix-komentoriviltauml seuraavanlaisesti

gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Esimerkissauml ndashI optio kertoo kaumlaumlntaumljaumllle ettauml sen tulee etsiauml header-tiedostot tyoumlkansi-

osta Gcc-kaumlaumlntaumljauml kaumlaumlntaumlauml tiedostot ja luo sovellusohjelman rdquoesimerkkirdquo Taumlmauml laumlhes-

tymistapa ohjelmiston kaumlaumlntaumlmiseen tulee vaivalloiseksi viimeistaumlaumln siinauml vaiheessa

kun projektiin lisaumltaumlaumln tiedostoja kaumlaumlntaumlmiskomento muuttuu ja se on haettava ko-

mentorivihistoriasta tai kirjoitettava uudestaan Makefilen tekeminen ratkaisee taumlmaumln

ongelman [A Simple Makefile Tutorial]

Esimerkki makefilestauml naumlyttaumlauml taumlltauml

1 esimerkki tiedosto1c tiedosto2c

2 gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Jos yllauml olevat rivit kirjoitetaan rdquoMakefilerdquo- tai rdquomakefilerdquo-nimiseen tiedostoon ja kirjoi-

tetaan komentoriville rdquomakerdquo niin suoritetaan makefileen kirjoitettu komento (rivi 2)

Make ilman optioita suorittaa automaattisesti makefilen ensimmaumlisen kohteen (target)

joka taumlssauml tapauksessa on nimeltaumlaumln rdquoesimerkkirdquo Rivillauml 1 olevat tiedosto1c ja tiedos-

to2c kertoo makelle ettauml naumliden tiedostojen olemassaolo vaaditaan kohteen suoritta-

10

miseen Korostetaan ettauml make vaatii tabulaattorin kaumlytoumln ennen jokaista komentoa

(rivi 2) [A Simple Makefile Tutorial]

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 esimerkki tiedosto1o tiedosto2o

5 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

Edellisen esimerkin riveille 1 ja 2 on lisaumltty muuttujat rdquoKAANTAJArdquo ja rdquoOPTIOTrdquo Naumliden

muuttujien muuttaminen vaikuttaa koko tiedostoon ndash taumlssauml tapauksessa ainoastaan

riviin 5

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 all esimerkki

5

6 esimerkki tiedosto1o tiedosto2o

7 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

8

9 tiedosto1o tiedosto1c

10 gcc -c tiedosto1c

11 12 tiedosto2o tiedosto2c

13 gcc -c tiedosto2c

14 15 clean

16 rm -rf o esimerkki

Edellinen esimerkki koostuu viidestauml eri kohteesta

Ensimmaumlinen kohde rdquoallrdquo suoritetaan kun Make ajetaan ilman optioita Jotta rdquoallrdquo voi-

taisiin suorittaa pitaumlauml suorittaa ensin rdquoesimerkkirdquo (rivi 6) koska rdquoallrdquo on riippuvainen

kohteesta rdquoesimerkkirdquo

Seuraavaa kohdetta rdquoesimerkkirdquo ei voi kuitenkaan suorittaa ennen kuin Make on tar-

kastanut tiedostojen rdquotiedosto1ordquo ja rdquotiedosto2ordquo aikaleimat jos aikaleimat ovat van-

hentuneet eli tiedostot ovat muuttuneet on ajettava kohteet rdquotiedosto1ordquo sekauml rdquotie-

dosto2ordquo Naumlmauml kohteet ajettuaan voi Make siirtyauml suorittamaan kohdetta rdquoesimerkkirdquo

ja taumlmaumln jaumllkeen kohdetta rdquoallrdquo jolla ei ole toteutusta

11

Kohteella rdquocleanrdquo ei ole riippuvuuksia Taumlllaista kohdetta kutsutaan komentorivillauml ko-

mennolla rdquomake cleanrdquo Rivillauml 16 oleva komento poistaa kaikki tyoumlhakemistossa sijait-

sevat rdquoordquo-paumlaumltteiset tiedostot sekauml sovellusohjelman rdquoesimerkkirdquo

Viimeisin makefile-esimerkki on yksinkertainen ohjelmiston koonti vaikka se vaikuttaa

pelkaumlstaumlaumln ohjelman kaumlaumlntaumlmiseltauml Jos yllauml olevaa esimerkkiauml haluttaisiin kehittaumlauml li-

saumlauml voitaisiin siihen lisaumltauml esimerkiksi kohde joka hakee laumlhdekoodin tietovarastosta ja

poistaa paikalliset laumlhdekoodit kovalevyltauml ohjelman kaumlaumlntaumlmisen jaumllkeen

32 Ant

Luvussa 31 tutustuttiin makefileen joka on Maken koontikuvaustiedosto Taumlssauml luvus-

sa perehdytaumlaumln koontityoumlkalu Antin kaumlyttaumlmaumlaumln Xml-muotoiseen koontikuvaukseen

Apache Ant on Java kirjasto- ja komentorivityoumlkalu jonka tehtaumlvaumlnauml on ajaa prosesseja

jotka on kuvattu koontitiedostoissa rdquokohteinardquo joilla on keskinaumlisiauml riippuvaisuuksia

Ant on paumlaumlasiallisesti Java-sovellusten koontisovellus mutta sitauml voidaan kaumlyttaumlauml myoumls

C -ja C++ -ohjelmistojen kokoamiseen Taumlssauml luvussa on esimerkki Java-ohjelmiston

koonnista

Antin kaumlyttaumljaumlt voivat kehittaumlauml omia rdquoantlibsrdquo-kirjastoja joihin sisaumlltyy omia tehtaumlviauml

(tasks) ja tyyppejauml (types) Kaumlyttaumljille tarjotaan myoumls suuri maumlaumlrauml valmiiksi tehtyjauml

kaupallisia tai avoimia rdquoantlibsrdquo kirjastoja [Apache Ant Welcome]

Ant-koontitiedosto koostuu neljaumlstauml eri elementistauml projects targets tasks ja proper-

ties

Koontitiedostossa kuvatulla projektilla on kolme attribuuttia name default sekauml base-

dir Name kuvaa projektin nimeauml ja eikauml sitauml ole pakko maumlaumlritellauml Default kuvaa koon-

titiedoston oletuskohdetta (default target) jota kutsutaan kun kohdetta ei erikseen

anneta kokoamiskomennossa Basedir maumlaumlrittelee projektin tyoumlhakemiston jota kaumlyte-

taumlaumln hakemistopolkujen selvittaumlmiseksi Taumlmaumlkaumlaumln attribuutti ei ole pakollinen Jos

basedir-atribuuttia ei maumlaumlritellauml kaumlytetaumlaumln tyoumlhakemistona samaa hakemistoa jossa

koontitiedosto sijaitsee

12

Kohteilla (targets) on riippuvuuksia muista kohteista Kuten makefilessauml voidaan koh-

teiden vaumllille rakentaa riippuvuuksia ja luoda ohjelmiston kokoamisen kannalta jaumlrkevauml

riippuvaisuuksien verkosto

Tehtaumlvaumlt (tasks) ovat suoritettavia koodirivejauml Tehtaumlvillauml voi olla useita attribuutteja

kuten tulevasta esimerkissauml naumlhdaumlaumln

Ominaisuuksilla (properties) voidaan antaa oikoteitauml (shortcuts) komentoihin tai merk-

kijonoihin joita kaumlytetaumlaumln usein koontitiedostossa Ominaisuudella on nimi- sekauml arvo-

attribuutti [Apache Ant Using Apache Ant]

1 ltproject name=MyProject default=dist basedir=gt

2 ltdescriptiongt

3 Yksinkertainen koontikuvaustiedosto

4 ltdescriptiongt

5 lt--Asetetaan julkiset ominaisuudet --gt

6 ltproperty name=src location=srcgt

7 ltproperty name=build location=buildgt

8 ltproperty name=dist location=distgt

9

10 lttarget name=initgt

11 ltmdashLuodaan aikaleima --gt

12 lttstampgt

13 ltmdashLuodaan hakemistorakenne ldquocompilerdquo tehtaumlvaumllle --gt

14 ltmkdir dir=$buildgt

15 lttargetgt

16 17 lttarget name=compile depends=initgt

18 lt--Kaumlaumlnnetaumlaumln Java-koodi $srcstauml into $buildiin --gt

19 ltjavac srcdir=$src destdir=$buildgt

20 lttargetgt

21 22 lttarget name=dist depends=compile

23 description=Generoidaan distribuutio gt

24 lt--Luodaan distribuutio kansio --gt

25 ltmkdir dir=$distlibgt

26 27 lt-- Laitetaan $build sisaumlltouml MyProject-$DSTAMPjarriin --gt

28 ltjar jarfile=$distlibMyProject $DSTAMPjar basedir=$buildgt

29 lttargetgt

30 31 lttarget name=clean

32 description=clean up gt

33 ltmdashPoistetaan $build ja $dist hakemistot --gt

34 ltdelete dir=$buildgt

13

35 ltdelete dir=$distgt

36 lttargetgt

37 ltprojectgt

[Apache Ant Using Apache Ant Example Buildfile]

Edelliseen koontikuvaukseen on maumlaumlritelty projekti jonka nimi on ldquoMyProjectrdquo Kun

tutustutaan koonnin kuvaukseen huomataan ettauml koontitiedoston projektin oletuskoh-

teella rdquodistrdquo on riippuvuus kohteeseen rdquocompilerdquo jolla on riippuvuus kohteeseen rdquoinitrdquo

Initillauml ei ole riippuvaisuuksia Taumlten ensimmaumlinen koonnin yhteydessauml ajettava kohde

onkin rdquoinitrdquo eikauml rdquodistrdquo vaikka rdquodistrdquo on koontikuvauksen oletuskohde Voidaan sanoa

ettauml koonnin paumlaumlmaumlaumlrauml on suorittaa kohde rdquodistrdquo ja paumlaumlmaumlaumlraumln saavuttamiseksi on

suoritettava kohteita joista taumlmauml on riippuvainen Riippuvuudet toimivat samalla peri-

aatteella kuin aikaisemmissa makefile-esimerkeissauml

Ohjelmiston kokoamisen yhteydessauml halutaan edellisessauml esimerkissauml saada ohjelmisto

jakeluun Jotta ohjelmisto saataisiin jakeluun on se ensin kaumlaumlnnettaumlvauml ja sitauml ennen on

luotava ohjelmiston hakemistorakenne

Jos halutaan kehittaumlauml esimerkin koontikuvausta voidaan esimerkiksi suorittaa verk-

kosivujen paumlivitystehtaumlvauml yhden kohteen sisaumlllauml ja asettaa se riippuvaiseksi kohteesta

rdquodistrdquo Naumlin ohjelmasta saadaan paumlivitetty versio jakeluun ja verkkosivuille tulee taumlstauml

automaattinen ilmoitus ohjelmiston kaumlyttaumljille

33 Maven

Luvussa 32 tutustuttiin Anttiin joka on natiivi koontityoumlkalu Seuraavaksi tutustutaan

koonti- ja projektinhallintasovellukseen Maveniin jolla voidaan kuvata koontiprosessin

lisaumlksi myoumls projektin rakenne Maven rohkaisee kaumlyttaumlmaumlaumln parhaita kaumlytaumlntoumljauml (best

practises) joita kaumlyttaumlmaumlllauml ohjelmistoprojektista toiseen siirtyessauml oppimiskynnys

uuden koontikuvauksen ymmaumlrtaumlmiseen pienenee [Maven vs Ant or Ant vs Maven]

Maven on kaumlytoumlssauml Metropolian Ohjelmistotuotantoprojekti-kurssin ohjelmistoprojekti-

en koontityoumlkaluna

Apache Maven on ohjelmistoprojektin hallintatyoumlkalu Se perustuu projekti-olio-malli -

konseptiin (Project Object Model POM) Maven kykenee kokoamaan projektin testaa-

14

maan projektin antamaan kaumlyttaumljaumllle palautetta dokumentoimaan kokoamisen ja te-

kemaumlaumln useita muita tehtaumlviauml erillisillauml Mavenin tarjoamilla lisaumlosilla (plug-ins) [Apache

Maven Project Welcome to Apache Maven]

POM on XML-tiedosto joka sisaumlltaumlauml informaatiota projektista ja yksityiskohtaisen konfi-

guraation jota Maven kaumlyttaumlauml projektin kokoamiseen POM kostuu kohteista (goals)

jotka on maumlaumlritelty pomxml -tiedostossa Kun suoritetaan erillinen tehtaumlvauml tai kohde

Maven etsii POMmia tyoumlhakemistosta lukee POMmin hakee tarvittavan konfiguraati-

on ja suorittaa kohteen

Eraumlitauml POMissa maumlaumlriteltaumlviauml konfiguraatioita ovat projektin riippuvuudet kaumlytettaumlvaumlt

lisaumlosat ajettavat kohteet ja koontiprofiilit POMiin voi maumlaumlritellauml muutakin tietoa ku-

ten projektin version kehittaumljaumlt ja postituslistat [Apache Maven Project Introduction

to the POM]

Maven on Java-tyoumlkalu joten Java taumlytyy olla asennettuna Mavenia ajavalle koneelle

Taumlmauml luku perustuu Apachen verkkosivuilla sijaitsevaan Mavenin kaumlyttoumlohjeeseen

[Apache Maven Project Maven in 5 Minutes] Seuraavaksi luetellaan eri vaiheet Ma-

ven-projektin luomiseksi

Ensin on ladattava Maven ja kaumlytaumlvauml laumlpi asennusohjeet jotka loumlytyvaumlt osoitteesta

[httpmavenapacheorgdownloadhtmlInstallation] Taumlmaumln jaumllkeen on avattava

terminaali tai komentokehote ja kirjoitettava

mvn --version

Taumlmaumln tulostaa asennetun Mavenin ja Javan versio Esimerkiksi

1 Apache Maven 303 (r1075438 2011-02-28 183109+0100)

2 Maven home Dapache-maven-303bin

3 Java version 160_25 vendor Sun Microsystems Inc

4 Java home EProgram FilesJavajdk160_25jre

5 Default locale nl_NL platform encoding Cp1252

6 OS name windows 7 version 61 arch amd64 family windows

Maven-projekti luodaan ajamalla terminaalissa Maven kohde (goal)

15

mvn archetypegenerate -DgroupId=commycompanyapp -DartifactId=my-app -

DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Ensimmaumlisellauml ajolla taumlmauml komento lataa tarvittavat Maven lisaumlosat ja muita tiedostoja

paikalliseen tietovarastoon Huomataan ettauml rdquogeneraterdquo kohde loi rdquoartifactIdrdquonauml anne-

tun hakemiston

Kirjoitetaan komentoriville

cd my-app

Taumlmaumln kansion alta loumlytyy Mavenin standardi projektirakenne

my-app

|-- pomxml

`-- src

|-- main

| `-- java

| `-- com

| `-- mycompany

| `-- app

| `-- Appjava

`-- test

`-- java

`-- com

`-- mycompany

`-- app

`-- AppTestjava

Yllauml kuvatussa hakemistorakenteessa oleva rdquosrcmainjavardquo-hakemisto sisaumlltaumlauml projek-

tin laumlhdekoodin Vastaavasti rdquosrctestjavardquo-hakemisto sisaumlltaumlauml testien laumlhdekoodin

Pomxml-tiedosto kuvaa projektin konfiguraatiota ja sisaumlltaumlauml projektin kokoamisohjeet

Esimerkkiprojektin POM naumlyttaumlauml taumlltauml

1 ltpro-

ject xmlns=httpmavenapacheorgPOM400 xmlnsxsi=httpwwww3org20

01XMLSchema-instance

2 xsischemaLocation=httpmavenapacheorgPOM400 httpmavenapacheorg

xsdmaven-400xsdgt

3 ltmodelVersiongt400ltmodelVersiongt

4

5 ltgroupIdgtcommycompanyappltgroupIdgt

6 ltartifactIdgtmy-appltartifactIdgt

16

7 ltversiongt10-SNAPSHOTltversiongt

8 ltpackaginggtjarltpackaginggt

9

10 ltnamegtMaven Quick Start Archetypeltnamegt

11 lturlgthttpmavenapacheorglturlgt

12 13 ltdependenciesgt

14 ltdependencygt

15 ltgroupIdgtjunitltgroupIdgt

16 ltartifactIdgtjunitltartifactIdgt

17 ltversiongt482ltversiongt

18 ltscopegttestltscopegt

19 ltdependencygt

20 ltdependenciesgt

21 ltprojectgt

POM-tiedosto on Maven-projektin konfiguraation ydin Se sisaumlltaumlauml suurimman osan

informaatiosta joka vaaditaan projektin kokoamiseen halutulla tavalla

Aikaisemmassa esimerkissauml ajettiin Mavenin kohde (goal) archetypegenerate ja an-

nettiin sille parametreja Etuliite archetype on lisaumlosa joka sisaumlltaumlauml kohteen generate

Taumltauml voi verrata Antin tehtaumlvaumlaumln Taumlmauml kohde loi yksinkertaisen projektin joka perus-

tuu arkkityyppiin Yleisesti Mavenin lisaumlosat koostuvat kohteista joilla on yhteinen paumlauml-

tarkoitus Esimerkki taumlllaisesta lisaumlosasta on jboss-maven-plugin jonka tehtaumlvaumlnauml on

kaumlsitellauml erinaumlisiauml Jboss-komponentteja (items)

Maven-projekti kootaan komentoriviltauml seuraavanlaisesti

mvn package

Komentorivi tulostaa eri komentoja tulostus loppuu seuraavanlaisesti

[INFO] --------------------------

[INFO] BUILD SUCCESSFUL

[INFO] --------------------------

[INFO] Total time 2 seconds

[INFO] Finished at Thu Jul 07 213452 CEST 2011

[INFO] Final Memory 3M6M

[INFO] --------------------------

Toisin kuin ensimmaumliseksi suoritetussa komennossa (archetypegenerate) huomataan

taumlllauml kertaa kaumlytetty komento package on vain yksi sana Taumlllaista komentoa kutsutaan

17

kohteen (goal) sijaan vaiheeksi (phase) Vaihe on yksi askel koonnin elinkaaressa

(build lifecycle) joka on jaumlrjestetty sarja eri vaiheita Jos esimerkiksi ajetaan vaiheen

compile Maven itseasiassa suorittaa sarjan vaiheita

1 validate

2 generate-sources

3 process-sources

4 generate-resources

5 process-resources

6 compile

Compilen ajamisen jaumllkeen voidaan testata kaumlaumlnnettyauml JARia seuraavalla komennolla

java -cp targetmy-app-10-SNAPSHOTjar commycompanyappApp

Taumlmauml komento tulostaa

Hello World

Kaumlydaumlaumln laumlpi vielauml eri Mavenin yleisimmaumlt oletuselinkaaressa kaumlytetyt vaiheet Naumlitauml

ovat

-validate varmistaa ettauml projekti on ehjauml ja kaikki tarvittava tieto on saatavilla

-compile kaumlaumlntaumlauml projektin laumlhdekoodin

-test testaa kaumlaumlnnetyn laumlhdekoodin kaumlyttaumlen sopivaa yksikkoumltestikehystauml Naumliden

testien ei tulisi vaatia vaiheita package tai deploy

-package paketoi kaumlaumlnnetyn koodin sen jaettavaan muotoon esimerkiksi JARriksi

-integration-test prosessoi ja jaumlrjestaumlauml paketin ympaumlristoumloumln jossa integraatiotestejauml

voidaan ajaa jos tarpeellista

-verify tarkistaa onko paketti validi ja taumlyttaumlaumlkouml se laatukriteerit

-install asentaa paketin paikalliseen tietovarastoon muiden paikallisten projektien

kaumlyttoumloumln tai paikallisten projektien riippuvuudeksi

-deploy kopioi lopullisen paketin ulkoiseen tietovarastoon jaettavaksi muille kehittaumljil-

le ja projekteille Tehdaumlaumln integraatio- tai julkaisuympaumlristoumlssauml

On vielauml kaksi muuta mainitsemisen arvoista Maven-elinkaarta jotka eivaumlt sisaumllly yllauml

listattuun oletuselinkaareen Naumlitauml ovat

18

-clean poistaa aikaisempien koontien yhteydessauml luodut artifaktit

-site generoi verkkodokumentaation kyseiselle projektille

Jokainen vaihe sisaumlltaumlauml sarjan suoritettavia kohteita joiden ajaminen riippuu projektin

paketointityypistauml Jos projektin tyyppi on JAR niin package ajaa kohteen jarjar Vas-

taavasti WAR -tyyppisen projektin package -vaihe suorittaa kohteen warwar

34 Koonti ja kaumlyttoumloumlnotto

Ohjelmiston saattamista laumlhdekoodista loppukaumlyttaumljaumllle kaumlyttoumlkelpoiseen muotoon kut-

sutaan koonniksi Laumlhdekoodin kaumlaumlntaumlmisen lisaumlksi koonti voi sisaumlltaumlauml monia muita vai-

heita Aleksi Lukkarinen on opinnaumlytetyoumlssaumlaumln listannut esimerkkejauml erilaisista koon-

neista seuraavasti [Aleksi Lukkarinen opinnaumlytetyouml]

-ohjelmointikielisen laumlhdekoodin sekauml resurssien automatisoitua luomista

-eri ohjelmointikielillauml tuotetun laumlhdekoodin kaumlaumlntaumlmistauml kone- jatai vaumllikielille

-vaumlli- tai konekielisen ohjelmakoodin jaumllkikaumlsittelyauml esimerkiksi testauksen aspektioh-

jelmoinnin tai koodin tarkoituksellisen sotkemisen vuoksi

-sovelluksen testausta (esimerkiksi toimivuus tietoturvallisuus suorituskyky rakenteel-

linen ja koodaustekninen laatu sekauml kaumlyttoumltarkoitustaan vastaavuus)

-dokumentaation koontia (kuten varsinaisen sovelluksen koonti)

-koontituotteiden paketointia sekauml mahdollisten fyysisten jakelumedioiden luontia toi-

mivuus- ja virustarkistuksineen

-ohjelmistomoduulien integrointia

-palautteen antamista koonnin tuloksista

Lukkarinen jaumlsentelee opinnaumlytetyoumlssaumlaumln sovelluksen jakeluun ja kaumlyttoumloumlnottoon sisaumll-

tyviksi asioiksi

-Sovellusta suorittavien ja tukevien palvelinympaumlristoumljen luominen ja paumlivittaumlminen

-Sovelluksen sekauml sen kaumlyttaumlmien ohjelmistokomponenttien siirtaumlminen ja maumlaumlrittaumlmi-

nen esimerkiksi testaus- laadunvarmistus- esittely-koulutus- sekauml tuotantoympaumlris-

toumlihin Kohdeympaumlristoumlissauml olevat vanhat versiot on mahdollisesti paumlivitettaumlvauml jollei

uusia versiota asenneta niiden rinnalle

19

-Uusien tietokantojen luominen sekauml vanhojen paumlivittaumlminen uutta sovellusversiota

vastaaviksi

-Kirjanpidollisen materiaalin tuottaminen ja yllaumlpitaumlminen

-Palautteen antaminen jakelu- ja kaumlyttoumloumlnottoprosessin onnistumisesta

Taumlmaumln luvun tarkoitus oli perehdyttaumlauml lukija ymmaumlrtaumlmaumlaumln koontiprosessia koontiku-

vaus-esimerkkien avulla Koontiprosessin ymmaumlrtaumlminen on vaumllttaumlmaumltoumlntauml seuraavan

luvun ymmaumlrtaumlmiseen jossa perehdytaumlaumln koontiympaumlristouml -kaumlsitteeseen

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant

Taumlssauml luvussa luodaan nopea katsaus koonti- ja kaumlyttoumloumlnottoprosessien automatisoimi-

seen tutustutaan jatkuvaan integraatioon sekauml sovellukseen Jenkins CI

Lisaumlksi tutustutaan projektihallintaohjelmaan Agilefant Agilefant on yksi monipuoli-

simmista kevyistauml vapaan laumlhdekoodin projektinhallintasovelluksista ja se soveltuu

niin pieniin kuin suuriinkin projekteihin

Naumlmauml sovellukset esitellaumlaumln pohjustuksena lukuja 5 ja 6 varten joissa tutustutaan

koontiympaumlristoumln tarkkailuun

41 Jatkuva integraatio

Jatkuva integraatio (Continuous Integration CI) on modernin sovelluskehityksen kul-

makivi Itse asiassa se on mullistanut sovelluskehityksen Kun jatkuva integraatio ote-

taan kaumlyttoumloumln organisaatiossa se muuttaa radikaalisti sitauml miten tyoumlryhmauml ymmaumlrtaumlauml

koko kehitysprosessin Jatkuvalla integraatiolla on potentiaalia laukaista sarja paran-

nuksia organisaation tuotteen kehitysprosessiin Se alkaa yksinkertaisesta automaatti-

sesta koonnista kehittyen systeemiksi joka automaattisesti saattaa tuotteen tuotan-

toon Hyvauml CI-infrastruktuuri mahdollistaa virheiden helpon sekauml nopean huomaamisen

ja tarjoaa kojelaudan projektin hyvinvoinnin ja muiden statistiikkojen seuraamiseen

sekauml kehittaumljille ettauml muille projektin osapuolille Jenkins The Definite Guiden mukaan

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 7: Joakim Sandqvist - Theseus

1

1 Johdanto

Taumlssauml opinnaumlytetyoumlssauml esitellaumlaumln Metropolia Ammattikorkeakoulun Ohjelmistotuontato-

projekti-kurssin kaumlytoumlssauml oleva kehitysympaumlristouml Taumlmaumln kehitysympaumlristoumln esittelemi-

sen tyoumlympaumlristoumlineen palvelimineen ja palvelinsovelluksineen on tarkoitus toimia

suuntaa antavana materiaalina niin pienten kuin suurienkin ohjelmistoprojektien koon-

tiympaumlristoumljen ja informatiivisten kehitysympaumlristoumljen rakentamiseen

Metropolia Ammattikorkeakoulun opiskelijat tekevaumlt Ohjelmistotuotantoprojekti-

kurssilla asiakkaan tilaaman ohjelmistotuotteen Opiskelijat suunnittelevat ja ohjelmoi-

vat tuotteen alusta loppuun Opiskelijoilla on kaumlytoumlssaumlaumln moderni kehitysympaumlristouml

jota kehitetaumlaumln entisestaumlaumln koko ajan Kehitysympaumlristouml koostuu tyoumltilojen laiteratkai-

suista tyoumlasemien sovelluksista sekauml palvelin- ja palvelinsovellusinfrastruktuurista

Taumlssauml dokumentissa tullaan esittelemaumlaumln opinnaumlytetyoumlssauml ohjelmoitu Metropolian Oh-

jelmistotuotantoprojekti-kurssin kaumlyttoumloumln tarkoitettu koontiympaumlristoumln monitorointi

sovellus rdquoKoontardquo Sovelluksen tarkoitus on antaa kurssin tyoumlryhmille reaaliaikaista pa-

lautetta ohjelmistoprojektin koonnin tilasta

Luvussa 2 tutustutaan ohjelmistotuotantoprojekti-kurssin sisaumlltoumloumln kehitysympaumlristoumloumln

sekauml tyoumltiloihin Taumlmaumln jaumllkeen luvussa 3 perehdytaumlaumln ohjelmiston kokoamiseen kaumly-

maumlllauml laumlpi erilaisia koontiprosesseja eri koontityoumlkaluilla

Luvussa 4 kerrotaan jatkuvasta integraatiosta sekauml koontiympaumlristoumlstauml Lisaumlksi esitel-

laumlaumln sovellukset Jenkins CI sekauml Agilefant jotka liittyvaumlt vahvasti lukujen 5 ja 6 aihee-

seen koontiympaumlristoumln tarkkailu

Lopuksi luvussa 6 esitellaumlaumln opinnaumlytetyoumlssauml tehty Java-sovellus rdquoKoontardquo Taumlssauml lu-

vussa kaumlydaumlaumln laumlpi hieman sovelluksen ohjelmointiprosessia ja perehdytaumlaumln sovelluk-

sen toiminnallisuuteen sekauml arkkitehtuuriin yksityiskohtaisesti

2

2 Ohjelmistotuotantoprojekti -kurssi

Taumlssauml luvussa perehdytaumlaumln Metropolia Ammattikorkeakoulun Ohjelmistotuotantoprojek-

ti-kurssiin Luvun tarkoitus on antaa lukijalle hyvauml yleiskuva kurssin sisaumllloumlstauml tyoumltilois-

ta sekauml kehitysympaumlristoumlstauml

21 Ohjelmistotuotantoprojekti-kurssin yleiskuvaus

Opiskelijat paumlaumlsevaumlt soveltamaan kurssilla useita aiemmilla tietotekniikan kursseilla

opittuja tietoja ja taitoja Tyouml on projektiluontoinen Kuhunkin ryhmaumlaumln kuuluu 4-6

opiskelijaa ja ryhmiauml on yhteensauml 2-4 Projekti kestaumlauml kahden periodin ajan ja sen

kokonaistyoumlmaumlaumlrauml on noin 800-1200 tyoumltuntia

Ohjelmiston kehittaumlmiseen kaumlytetaumlaumln Scrum-ketteraumlauml menetelmaumlauml Scrumin tyoumlvaiheet

koostuvat sprinteistauml joita taumlssauml projektissa on viisi kappaletta Jokaista sprinttiauml edel-

taumlauml aloituspalaveri jossa sovitaan kyseisen sprintin tehtaumlvaumlt ja tavoite Ydinroolit

Scrumissa ovat tuotteen omistaja tiimi sekauml Scrum Master Kurssin tyoumlryhmien Scrum

Mastereina toimivat opettajat Tiimit koostuvat kurssin tyoumlryhmistauml ja tuotteen immate-

riaalioikeudet omistaa Metropolia Oy joka puolestaan antaa tuotteen kaumlyttoumloikeudet

projektiin osallistuneille tahoille Taumlmauml on toimintapa yleensauml mutta asiakkaasta riip-

puen tehdaumlaumln erilaisia sopimuksia

Jokainen kurssin ryhmauml maumlaumlrittelee suunnittelee toteuttaa testaa sekauml dokumentoi

suurehkon ohjelmiston Jokaisella projektilla on oma asiakas joko oikea yritys tai opet-

taja joka edustaa tyoumln tilaajaa Asiakas on kaumlytettaumlvissauml kunkin sprintin aloituspalave-

rissa toiminnallisten vaatimusten maumlaumlrittelyauml varten Kullakin ryhmaumlllauml on myoumls ohjaa-

ja jonka tehtaumlvaumlnauml on auttaa tyoumln kaumlynnistaumlmisessauml sekauml toimiminen Scrum Masteri-

na Ohjaajat eivaumlt varsinaisesti osallistu tiimin tyoumlskentelyyn

22 Ohjelmistotuotantoprojekti-kurssin kehitysympaumlristoumln yleiskuvaus

Kurssin viimeisimpiauml kehitysympaumlristoumlparannuksia on Aleksi Lukkarisen opinnaumlytetyouml-

naumlaumln tekemauml rdquoopetuskaumlyttoumloumln soveltuva virtuaalikonepohjainen kehitysympaumlristouml

3

jonka avulla innovaatioprojekteja toteuttavat opiskelijat voivat tyoumlskennellauml jatkuvan

integraation ja kaumlyttoumloumlnoton periaatteiden mukaisestirdquo [Lukkarinen 2011 tiivistelmauml]

Uusimmat parannukset kurssin tyouml- ja kehitysympaumlristoumloumln ovat taumlhaumln opinnaumlytetyoumlhoumln

kuuluva sovellus rdquoKoontardquo johon palataan vielauml taumlmaumln dokumentin loppupuolella sekauml

kurssin tyoumltiloihin tehdyt uudet laitehankinnat

Katselmus kehitysympaumlristoumloumln aloitetaan esittelemaumlllauml kurssin uudet tyoumltilat Taumlmaumln

jaumllkeen perehdytaumlaumln kurssin palvelininfrastruktuuriin

221 Kurssin tyoumltilat

Tyoumltilat ja viihtyvyys ovat olennainen osa ryhmaumlkeskeistauml tyoumlntekoa On taumlrkeaumlauml ettauml

kehitysryhmaumlllauml on tarpeeksi tilaa tyoumlskennellauml ja ryhmaumln sisaumlinen kommunikaatio toi-

mii mahdollisimman helposti Tyoumltilat liittyvaumlt myoumls olennaisesti koontiympaumlristoumln tark-

kailuun jota taumlssauml opinnaumlytetyoumlssauml kaumlsitellaumlaumln myoumlhemmin

Joulukuussa 2011 Metropolia teki uusia laitehankintoja Bulevardin toimipisteeseen Oh-

jelmistotuotantoprojekti-kurssin tyoumltiloihin Ensisijaisesti jokaisen kurssiryhmaumln tyoumltiloi-

hin oli saatava naumlyttouml jossa ajettaisiin taumlssauml opinnaumlytetyoumlssauml tehtyauml koontiympaumlristoumln

tarkkailuun soveltuvaa ohjelmaa rdquoKoontardquo

Taumlssauml luvussa kaumlydaumlaumln laumlpi kurssin tyoumltiloihin hankitut laitteet ja esitellaumlaumln tyoumltilat ko-

konaisuudessaan mukaan lukien laitteet jotka jaumlivaumlt kaumlyttoumloumln vanhasta laitekokoon-

panosta

Kuvassa 1 on esitelty yhden ryhmaumln tyoumltila Kyseisen ryhmaumln tyoumltilaan kuuluu kolme

tussitaulua joista yksi laumlhiprojektorin alla oleva toimii myoumls projektointipintana laumlhi-

projektorille Ryhmaumlllauml on kaumlytoumlssaumlaumln kuusi kannettavaa tietokonetta Tietokoneet sekauml

laumlhiprojektori ovat kiinni HDMI-valitsimessa Kuvan vasemmassa ylaumlnurkassa on mini-

tietokone sekauml naumlyttouml Minitietokone ja naumlyttouml on varattu koontiympaumlristoumln tarkkailuun

(luku 4) Ryhmauml naumlkee laitteesta ohjelmistoprojektinsa tilan reaaliajassa ja pystyy rea-

goimaan projektin tilamuutoksiin nopeasti

4

Kuva 1 Yhden ryhmaumln tyoumltila

Yksi oleellisimmista uusista laitehankinnoista on laumlhiprojektori (kuva 2) Jokaisella kurs-

sin ryhmaumlllauml on kaumlytoumlssaumlaumln yksi laumlhiprojektori Toisin kuin perinteinen projektori laumlhi-

projektori saadaan asetettua seinaumllle suoraan projektorointikohteen ylaumlpuolelle Taumlten

se vie vaumlhemmaumln tilaa kuin normaali projektori ja oli hyvauml valinta uuteen laitekokoon-

panoon

Kuva 2 Hitachi CP-AW250NM

Tyoumltiloihin hankittiin 2000 mm x 1200 mm tussitaulut jotka toimivat laumlhiprojektorien

piirtoalueina sekauml vaihtoehtoisesti tussitauluina

5

Jokaiselle ryhmaumllle hankittiin 27-tuumaiset LG E2770V -malliset LED-naumlytoumlt Naumlmauml naumly-

toumlt on tarkoitettu vain koontiympaumlristoumln tarkkailua varten Ne kestaumlvaumlt pitkaumlkestoista

kaumlyttoumlauml ja voivat olla paumlaumlllauml youmltauml paumlivaumlauml ilman ettauml kuva palaa kiinni ruutuun Naumlytoumlt

on kiinnitetty seinaumlaumln kolmi-nivelisillauml Melicone Stile DR200 -mallisilla seinaumltelineillauml

joiden avulla naumlyttoumljen kaltevuutta ja sijaintia pystytaumlaumln saumlaumltaumlmaumlaumln

Ryhmille hankitut minitietokoneet (kuva 3) ovat kiinni yllauml esitetyissauml naumlytoumlissauml Minitie-

tokoneita hallitaan langattomalla hiirellauml sekauml naumlppaumlimistoumlllauml Perinteisen poumlytaumltietoko-

neen hankkimisen sijaan paumlaumldyttiin pienempaumlaumln vaihtoehtoon jotta tyoumlskentelytilaa

jaumlisi enemmaumln

Kuva 3 HP8200 USDT -minitietokone

Taumlrkeauml osa uutta laitekokoonpanoa on HDMI-valitsin (kuva 4) Valitsin on kytkettynauml

ryhmaumln laumlhiprojektoriin sekauml ryhmaumln jaumlsenten kaumlyttaumlmiin kannettaviin tietokoneisiin

Valitsimella on taumlrkeauml rooli ryhmien viikkopalavereissa ryhmaumln paumlivittaumlisessauml tyoumlsken-

telyssauml sekauml kehitysryhmaumln ja asiakkaan vaumllisissauml tapaamisissa Valitsin mahdollistaa

sujuvamman kommunikaation ryhmaumln jaumlsenten vaumllillauml Kurssiryhmien kehittaumljaumlt saavat

nappia painamalla oman kannettavan tietokoneensa naumlkymaumln laumlhiprojektoriin

6

Kuva 4 Kramer VS-81H HDMI -valitsin

222 Kurssin palvelimet

Kurssin ryhmaumlkohtaiset palvelimet kevaumlaumlllauml 2012 ovat koontipalvelin testi- ja tuotanto-

sovelluspalvelimet sekauml testi- ja tuotantotietokantapalvelimet (kuva 5) Testipalvelimet

toimivat ryhmaumln omana hiekkalaatikkona Kehitysympaumlristoumln palvelininfrastruktuuri

koostuu kokonaisuudessaan seuraavassa kuvassa esitellyistauml palvelimista

Kuva 5 Kehitysympaumlristoumln palvelininfrastruktuuri

7

Seuraavaksi kaumlydaumlaumln laumlpi palvelimet yksitellen Kerrotaan mitauml sovelluksia kuhunkin

palvelimeen on asennettu ja mitauml ovat kunkin palvelimen tehtaumlvaumlt

Palvelimista koontiympaumlristoumln (luvut 34 4) kannalta oleellisimmassa roolissa on koon-

tipalvelin Jokaisella ryhmaumlllauml on oma koontipalvelimensa jossa ajetaan Jenkins CI -

sovellusta Jenkins CI on vastuussa projektien automaattisesta koonnista ja haumllyttaumlauml

ryhmaumllle projektin koonnin epaumlonnistuessa Jenkins CIstauml kerrotaan lisaumlauml luvussa 4

Tuotanto- ja testipalvelimia on kaksi kappaletta jokaista ryhmaumlauml kohti Tuotantoympauml-

ristoumloumln kuuluvat tuotantosovelluspalvelin sekauml tuotantotietokantapalvelin Tuotantotie-

tokantapalvelin sisaumlltaumlauml ryhmaumlkohtaiset tietokannat Tuotantosovelluspalvelin sisaumlltaumlauml

ryhmaumlkohtaiset palvelut kuten Phpn ja Javan Vastaavasti testiympaumlristoumloumln kuuluvat

testisovelluspalvelin ja testitietokantapalvelin joilla on sama toiminnallisuus kuin tuo-

tantoympaumlristoumln palvelimilla

Ryhmien kaumlytoumlssauml oleva testiympaumlristouml mahdollistaa esimerkiksi palvelinkonfiguraatioi-

den riskittoumlmaumln testaamisen ennen muutosten kaumlyttoumloumlnottoa tuotantoympaumlristoumln puo-

lella Tuotanto -ja testipalvelimet ovat virtualisoituja Palvelimien virtualisointi mahdol-

listaa palvelimen tilan tallennuksen Palvelinten oletustilat (snapshot) voidaan halutessa

ladata muistista palvelimen korruptoituessa konfiguraatiotestaamisen yhteydessauml

Jokaisella ryhmaumlllauml on siis kaumlytoumlssaumlaumln viisi ryhmaumlkohtaista palvelinta koonti- tuotanto-

sovellus- tuotantotietokanta- testisovellus- sekauml testitietokantapalvelin Taumlmaumln lisaumlksi

ryhmillauml on kaumlytoumlssaumlaumln kolme yleiskaumlyttoumlistauml palvelinta joista kerrotaan seuraavaksi

Naumlmauml palvelimet ovat versionhallinta- projektinhallinta- sekauml varmuuskopiopalvelin

Versionhallintapalvelimella sijaitsevat ryhmien kaumlytoumlssauml olevat kaksi tietovarastoa Tois-

ta tietovarastoa kaumlytetaumlaumln laumlhdekoodin taltioimiseen ja toista tietovarastoa oheistuot-

teiden kuten dokumentaation taltioimiseen Opiskelijaryhmien tietovarastojen lisaumlksi

palvelimella on innodev-tietovarasto ympaumlristoumln yllaumlpitoa ja kehitystauml varten Kuvassa 6

on esitelty esimerkki eraumlaumln ohjelmistoprojektin tietovaraston hakemistorakenteesta

8

Kuva 6 Esimerkki opiskelijaryhmaumln tietovaraston hakemistorakenteesta

Projektinhallintapalvelin sisaumlltaumlauml Agilefant-sovelluksen josta ajetaan yhtauml instanssia

kullekin kurssin ryhmaumllle Agilefant on projektinhallintasovellus joka soveltuu hyvin

ketteraumln kehityksen tarpeisiin Sitauml kaumlytetaumlaumln ryhmaumln tyoumltuntien merkkaamiseen ja

projektin kehityksen valvomiseen Agilefantista kerrotaan tarkemmin luvussa 4

Kurssiryhmien kaumlytoumlssauml olevalle varmuuskopiopalvelimelle on tarkoitus kopioida var-

muuskopiota projektinhallinta- ja versionhallintapalvelimien tiloista Varmuuskopiointi ei

ole automatisoitua jonka takia palvelimen kaumlyttoumlmaumlaumlrauml on jaumlaumlnyt pieneksi

3 Ohjelmiston kokoaminen

Ohjelmiston kokoaminen tarkoittaa yksinkertaisimmillaan ohjelmistokoodin kaumlaumlntaumlmistauml

ajettavaan muotoon Jos ohjelmisto on iso ja sen rakenne on modulaarinen voi kehit-

taumljaumlllauml olla tarve jakaa ohjelmiston kokoaminen useisiin operaatioihin joilla on keskinaumli-

siauml riippuvuuksia

Taumlssauml luvussa tutustutaan eri tapoihin toteuttaa ohjelmiston koonti Ensin perehdytaumlaumln

makefileen ja tutustutaan ohjelmiston kokoamiseen makefile-esimerkkien avulla Tauml-

9

maumln jaumllkeen perehdytaumlaumln modernimpiin koontisovelluksiin Ant ja Maven Naumlmauml luvut

ovat tarpeellisia koontiprosessin ymmaumlrtaumlmisen kannalta

31 Makefile

Makefile on tiedosto jota Unix-komento Make kaumlyttaumlauml ohjelman kokoamiseen Makefile

kuvaa ohjelman laumlhdekooditiedostojen vaumlliset riippuvuudet ja sisaumlltaumlauml ohjeet ohjelmis-

ton kaumlaumlntaumlmiseen Kaumlaumlntaumlmisen lisaumlksi makefileen voi sisaumlllyttaumlauml mitauml vain Unix-

komentoja ja siitauml voi kaumlynnistaumlauml testejauml

Otetaan esimerkkitapaus jossa C-kieliseen ohjelmistoon kuuluu 3 tiedostoa

tiedosto1c

tiedosto2c

tiedosto1h

Ilman makefileauml ohjelma kaumlaumlnnettaumlisiin Unix-komentoriviltauml seuraavanlaisesti

gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Esimerkissauml ndashI optio kertoo kaumlaumlntaumljaumllle ettauml sen tulee etsiauml header-tiedostot tyoumlkansi-

osta Gcc-kaumlaumlntaumljauml kaumlaumlntaumlauml tiedostot ja luo sovellusohjelman rdquoesimerkkirdquo Taumlmauml laumlhes-

tymistapa ohjelmiston kaumlaumlntaumlmiseen tulee vaivalloiseksi viimeistaumlaumln siinauml vaiheessa

kun projektiin lisaumltaumlaumln tiedostoja kaumlaumlntaumlmiskomento muuttuu ja se on haettava ko-

mentorivihistoriasta tai kirjoitettava uudestaan Makefilen tekeminen ratkaisee taumlmaumln

ongelman [A Simple Makefile Tutorial]

Esimerkki makefilestauml naumlyttaumlauml taumlltauml

1 esimerkki tiedosto1c tiedosto2c

2 gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Jos yllauml olevat rivit kirjoitetaan rdquoMakefilerdquo- tai rdquomakefilerdquo-nimiseen tiedostoon ja kirjoi-

tetaan komentoriville rdquomakerdquo niin suoritetaan makefileen kirjoitettu komento (rivi 2)

Make ilman optioita suorittaa automaattisesti makefilen ensimmaumlisen kohteen (target)

joka taumlssauml tapauksessa on nimeltaumlaumln rdquoesimerkkirdquo Rivillauml 1 olevat tiedosto1c ja tiedos-

to2c kertoo makelle ettauml naumliden tiedostojen olemassaolo vaaditaan kohteen suoritta-

10

miseen Korostetaan ettauml make vaatii tabulaattorin kaumlytoumln ennen jokaista komentoa

(rivi 2) [A Simple Makefile Tutorial]

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 esimerkki tiedosto1o tiedosto2o

5 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

Edellisen esimerkin riveille 1 ja 2 on lisaumltty muuttujat rdquoKAANTAJArdquo ja rdquoOPTIOTrdquo Naumliden

muuttujien muuttaminen vaikuttaa koko tiedostoon ndash taumlssauml tapauksessa ainoastaan

riviin 5

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 all esimerkki

5

6 esimerkki tiedosto1o tiedosto2o

7 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

8

9 tiedosto1o tiedosto1c

10 gcc -c tiedosto1c

11 12 tiedosto2o tiedosto2c

13 gcc -c tiedosto2c

14 15 clean

16 rm -rf o esimerkki

Edellinen esimerkki koostuu viidestauml eri kohteesta

Ensimmaumlinen kohde rdquoallrdquo suoritetaan kun Make ajetaan ilman optioita Jotta rdquoallrdquo voi-

taisiin suorittaa pitaumlauml suorittaa ensin rdquoesimerkkirdquo (rivi 6) koska rdquoallrdquo on riippuvainen

kohteesta rdquoesimerkkirdquo

Seuraavaa kohdetta rdquoesimerkkirdquo ei voi kuitenkaan suorittaa ennen kuin Make on tar-

kastanut tiedostojen rdquotiedosto1ordquo ja rdquotiedosto2ordquo aikaleimat jos aikaleimat ovat van-

hentuneet eli tiedostot ovat muuttuneet on ajettava kohteet rdquotiedosto1ordquo sekauml rdquotie-

dosto2ordquo Naumlmauml kohteet ajettuaan voi Make siirtyauml suorittamaan kohdetta rdquoesimerkkirdquo

ja taumlmaumln jaumllkeen kohdetta rdquoallrdquo jolla ei ole toteutusta

11

Kohteella rdquocleanrdquo ei ole riippuvuuksia Taumlllaista kohdetta kutsutaan komentorivillauml ko-

mennolla rdquomake cleanrdquo Rivillauml 16 oleva komento poistaa kaikki tyoumlhakemistossa sijait-

sevat rdquoordquo-paumlaumltteiset tiedostot sekauml sovellusohjelman rdquoesimerkkirdquo

Viimeisin makefile-esimerkki on yksinkertainen ohjelmiston koonti vaikka se vaikuttaa

pelkaumlstaumlaumln ohjelman kaumlaumlntaumlmiseltauml Jos yllauml olevaa esimerkkiauml haluttaisiin kehittaumlauml li-

saumlauml voitaisiin siihen lisaumltauml esimerkiksi kohde joka hakee laumlhdekoodin tietovarastosta ja

poistaa paikalliset laumlhdekoodit kovalevyltauml ohjelman kaumlaumlntaumlmisen jaumllkeen

32 Ant

Luvussa 31 tutustuttiin makefileen joka on Maken koontikuvaustiedosto Taumlssauml luvus-

sa perehdytaumlaumln koontityoumlkalu Antin kaumlyttaumlmaumlaumln Xml-muotoiseen koontikuvaukseen

Apache Ant on Java kirjasto- ja komentorivityoumlkalu jonka tehtaumlvaumlnauml on ajaa prosesseja

jotka on kuvattu koontitiedostoissa rdquokohteinardquo joilla on keskinaumlisiauml riippuvaisuuksia

Ant on paumlaumlasiallisesti Java-sovellusten koontisovellus mutta sitauml voidaan kaumlyttaumlauml myoumls

C -ja C++ -ohjelmistojen kokoamiseen Taumlssauml luvussa on esimerkki Java-ohjelmiston

koonnista

Antin kaumlyttaumljaumlt voivat kehittaumlauml omia rdquoantlibsrdquo-kirjastoja joihin sisaumlltyy omia tehtaumlviauml

(tasks) ja tyyppejauml (types) Kaumlyttaumljille tarjotaan myoumls suuri maumlaumlrauml valmiiksi tehtyjauml

kaupallisia tai avoimia rdquoantlibsrdquo kirjastoja [Apache Ant Welcome]

Ant-koontitiedosto koostuu neljaumlstauml eri elementistauml projects targets tasks ja proper-

ties

Koontitiedostossa kuvatulla projektilla on kolme attribuuttia name default sekauml base-

dir Name kuvaa projektin nimeauml ja eikauml sitauml ole pakko maumlaumlritellauml Default kuvaa koon-

titiedoston oletuskohdetta (default target) jota kutsutaan kun kohdetta ei erikseen

anneta kokoamiskomennossa Basedir maumlaumlrittelee projektin tyoumlhakemiston jota kaumlyte-

taumlaumln hakemistopolkujen selvittaumlmiseksi Taumlmaumlkaumlaumln attribuutti ei ole pakollinen Jos

basedir-atribuuttia ei maumlaumlritellauml kaumlytetaumlaumln tyoumlhakemistona samaa hakemistoa jossa

koontitiedosto sijaitsee

12

Kohteilla (targets) on riippuvuuksia muista kohteista Kuten makefilessauml voidaan koh-

teiden vaumllille rakentaa riippuvuuksia ja luoda ohjelmiston kokoamisen kannalta jaumlrkevauml

riippuvaisuuksien verkosto

Tehtaumlvaumlt (tasks) ovat suoritettavia koodirivejauml Tehtaumlvillauml voi olla useita attribuutteja

kuten tulevasta esimerkissauml naumlhdaumlaumln

Ominaisuuksilla (properties) voidaan antaa oikoteitauml (shortcuts) komentoihin tai merk-

kijonoihin joita kaumlytetaumlaumln usein koontitiedostossa Ominaisuudella on nimi- sekauml arvo-

attribuutti [Apache Ant Using Apache Ant]

1 ltproject name=MyProject default=dist basedir=gt

2 ltdescriptiongt

3 Yksinkertainen koontikuvaustiedosto

4 ltdescriptiongt

5 lt--Asetetaan julkiset ominaisuudet --gt

6 ltproperty name=src location=srcgt

7 ltproperty name=build location=buildgt

8 ltproperty name=dist location=distgt

9

10 lttarget name=initgt

11 ltmdashLuodaan aikaleima --gt

12 lttstampgt

13 ltmdashLuodaan hakemistorakenne ldquocompilerdquo tehtaumlvaumllle --gt

14 ltmkdir dir=$buildgt

15 lttargetgt

16 17 lttarget name=compile depends=initgt

18 lt--Kaumlaumlnnetaumlaumln Java-koodi $srcstauml into $buildiin --gt

19 ltjavac srcdir=$src destdir=$buildgt

20 lttargetgt

21 22 lttarget name=dist depends=compile

23 description=Generoidaan distribuutio gt

24 lt--Luodaan distribuutio kansio --gt

25 ltmkdir dir=$distlibgt

26 27 lt-- Laitetaan $build sisaumlltouml MyProject-$DSTAMPjarriin --gt

28 ltjar jarfile=$distlibMyProject $DSTAMPjar basedir=$buildgt

29 lttargetgt

30 31 lttarget name=clean

32 description=clean up gt

33 ltmdashPoistetaan $build ja $dist hakemistot --gt

34 ltdelete dir=$buildgt

13

35 ltdelete dir=$distgt

36 lttargetgt

37 ltprojectgt

[Apache Ant Using Apache Ant Example Buildfile]

Edelliseen koontikuvaukseen on maumlaumlritelty projekti jonka nimi on ldquoMyProjectrdquo Kun

tutustutaan koonnin kuvaukseen huomataan ettauml koontitiedoston projektin oletuskoh-

teella rdquodistrdquo on riippuvuus kohteeseen rdquocompilerdquo jolla on riippuvuus kohteeseen rdquoinitrdquo

Initillauml ei ole riippuvaisuuksia Taumlten ensimmaumlinen koonnin yhteydessauml ajettava kohde

onkin rdquoinitrdquo eikauml rdquodistrdquo vaikka rdquodistrdquo on koontikuvauksen oletuskohde Voidaan sanoa

ettauml koonnin paumlaumlmaumlaumlrauml on suorittaa kohde rdquodistrdquo ja paumlaumlmaumlaumlraumln saavuttamiseksi on

suoritettava kohteita joista taumlmauml on riippuvainen Riippuvuudet toimivat samalla peri-

aatteella kuin aikaisemmissa makefile-esimerkeissauml

Ohjelmiston kokoamisen yhteydessauml halutaan edellisessauml esimerkissauml saada ohjelmisto

jakeluun Jotta ohjelmisto saataisiin jakeluun on se ensin kaumlaumlnnettaumlvauml ja sitauml ennen on

luotava ohjelmiston hakemistorakenne

Jos halutaan kehittaumlauml esimerkin koontikuvausta voidaan esimerkiksi suorittaa verk-

kosivujen paumlivitystehtaumlvauml yhden kohteen sisaumlllauml ja asettaa se riippuvaiseksi kohteesta

rdquodistrdquo Naumlin ohjelmasta saadaan paumlivitetty versio jakeluun ja verkkosivuille tulee taumlstauml

automaattinen ilmoitus ohjelmiston kaumlyttaumljille

33 Maven

Luvussa 32 tutustuttiin Anttiin joka on natiivi koontityoumlkalu Seuraavaksi tutustutaan

koonti- ja projektinhallintasovellukseen Maveniin jolla voidaan kuvata koontiprosessin

lisaumlksi myoumls projektin rakenne Maven rohkaisee kaumlyttaumlmaumlaumln parhaita kaumlytaumlntoumljauml (best

practises) joita kaumlyttaumlmaumlllauml ohjelmistoprojektista toiseen siirtyessauml oppimiskynnys

uuden koontikuvauksen ymmaumlrtaumlmiseen pienenee [Maven vs Ant or Ant vs Maven]

Maven on kaumlytoumlssauml Metropolian Ohjelmistotuotantoprojekti-kurssin ohjelmistoprojekti-

en koontityoumlkaluna

Apache Maven on ohjelmistoprojektin hallintatyoumlkalu Se perustuu projekti-olio-malli -

konseptiin (Project Object Model POM) Maven kykenee kokoamaan projektin testaa-

14

maan projektin antamaan kaumlyttaumljaumllle palautetta dokumentoimaan kokoamisen ja te-

kemaumlaumln useita muita tehtaumlviauml erillisillauml Mavenin tarjoamilla lisaumlosilla (plug-ins) [Apache

Maven Project Welcome to Apache Maven]

POM on XML-tiedosto joka sisaumlltaumlauml informaatiota projektista ja yksityiskohtaisen konfi-

guraation jota Maven kaumlyttaumlauml projektin kokoamiseen POM kostuu kohteista (goals)

jotka on maumlaumlritelty pomxml -tiedostossa Kun suoritetaan erillinen tehtaumlvauml tai kohde

Maven etsii POMmia tyoumlhakemistosta lukee POMmin hakee tarvittavan konfiguraati-

on ja suorittaa kohteen

Eraumlitauml POMissa maumlaumlriteltaumlviauml konfiguraatioita ovat projektin riippuvuudet kaumlytettaumlvaumlt

lisaumlosat ajettavat kohteet ja koontiprofiilit POMiin voi maumlaumlritellauml muutakin tietoa ku-

ten projektin version kehittaumljaumlt ja postituslistat [Apache Maven Project Introduction

to the POM]

Maven on Java-tyoumlkalu joten Java taumlytyy olla asennettuna Mavenia ajavalle koneelle

Taumlmauml luku perustuu Apachen verkkosivuilla sijaitsevaan Mavenin kaumlyttoumlohjeeseen

[Apache Maven Project Maven in 5 Minutes] Seuraavaksi luetellaan eri vaiheet Ma-

ven-projektin luomiseksi

Ensin on ladattava Maven ja kaumlytaumlvauml laumlpi asennusohjeet jotka loumlytyvaumlt osoitteesta

[httpmavenapacheorgdownloadhtmlInstallation] Taumlmaumln jaumllkeen on avattava

terminaali tai komentokehote ja kirjoitettava

mvn --version

Taumlmaumln tulostaa asennetun Mavenin ja Javan versio Esimerkiksi

1 Apache Maven 303 (r1075438 2011-02-28 183109+0100)

2 Maven home Dapache-maven-303bin

3 Java version 160_25 vendor Sun Microsystems Inc

4 Java home EProgram FilesJavajdk160_25jre

5 Default locale nl_NL platform encoding Cp1252

6 OS name windows 7 version 61 arch amd64 family windows

Maven-projekti luodaan ajamalla terminaalissa Maven kohde (goal)

15

mvn archetypegenerate -DgroupId=commycompanyapp -DartifactId=my-app -

DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Ensimmaumlisellauml ajolla taumlmauml komento lataa tarvittavat Maven lisaumlosat ja muita tiedostoja

paikalliseen tietovarastoon Huomataan ettauml rdquogeneraterdquo kohde loi rdquoartifactIdrdquonauml anne-

tun hakemiston

Kirjoitetaan komentoriville

cd my-app

Taumlmaumln kansion alta loumlytyy Mavenin standardi projektirakenne

my-app

|-- pomxml

`-- src

|-- main

| `-- java

| `-- com

| `-- mycompany

| `-- app

| `-- Appjava

`-- test

`-- java

`-- com

`-- mycompany

`-- app

`-- AppTestjava

Yllauml kuvatussa hakemistorakenteessa oleva rdquosrcmainjavardquo-hakemisto sisaumlltaumlauml projek-

tin laumlhdekoodin Vastaavasti rdquosrctestjavardquo-hakemisto sisaumlltaumlauml testien laumlhdekoodin

Pomxml-tiedosto kuvaa projektin konfiguraatiota ja sisaumlltaumlauml projektin kokoamisohjeet

Esimerkkiprojektin POM naumlyttaumlauml taumlltauml

1 ltpro-

ject xmlns=httpmavenapacheorgPOM400 xmlnsxsi=httpwwww3org20

01XMLSchema-instance

2 xsischemaLocation=httpmavenapacheorgPOM400 httpmavenapacheorg

xsdmaven-400xsdgt

3 ltmodelVersiongt400ltmodelVersiongt

4

5 ltgroupIdgtcommycompanyappltgroupIdgt

6 ltartifactIdgtmy-appltartifactIdgt

16

7 ltversiongt10-SNAPSHOTltversiongt

8 ltpackaginggtjarltpackaginggt

9

10 ltnamegtMaven Quick Start Archetypeltnamegt

11 lturlgthttpmavenapacheorglturlgt

12 13 ltdependenciesgt

14 ltdependencygt

15 ltgroupIdgtjunitltgroupIdgt

16 ltartifactIdgtjunitltartifactIdgt

17 ltversiongt482ltversiongt

18 ltscopegttestltscopegt

19 ltdependencygt

20 ltdependenciesgt

21 ltprojectgt

POM-tiedosto on Maven-projektin konfiguraation ydin Se sisaumlltaumlauml suurimman osan

informaatiosta joka vaaditaan projektin kokoamiseen halutulla tavalla

Aikaisemmassa esimerkissauml ajettiin Mavenin kohde (goal) archetypegenerate ja an-

nettiin sille parametreja Etuliite archetype on lisaumlosa joka sisaumlltaumlauml kohteen generate

Taumltauml voi verrata Antin tehtaumlvaumlaumln Taumlmauml kohde loi yksinkertaisen projektin joka perus-

tuu arkkityyppiin Yleisesti Mavenin lisaumlosat koostuvat kohteista joilla on yhteinen paumlauml-

tarkoitus Esimerkki taumlllaisesta lisaumlosasta on jboss-maven-plugin jonka tehtaumlvaumlnauml on

kaumlsitellauml erinaumlisiauml Jboss-komponentteja (items)

Maven-projekti kootaan komentoriviltauml seuraavanlaisesti

mvn package

Komentorivi tulostaa eri komentoja tulostus loppuu seuraavanlaisesti

[INFO] --------------------------

[INFO] BUILD SUCCESSFUL

[INFO] --------------------------

[INFO] Total time 2 seconds

[INFO] Finished at Thu Jul 07 213452 CEST 2011

[INFO] Final Memory 3M6M

[INFO] --------------------------

Toisin kuin ensimmaumliseksi suoritetussa komennossa (archetypegenerate) huomataan

taumlllauml kertaa kaumlytetty komento package on vain yksi sana Taumlllaista komentoa kutsutaan

17

kohteen (goal) sijaan vaiheeksi (phase) Vaihe on yksi askel koonnin elinkaaressa

(build lifecycle) joka on jaumlrjestetty sarja eri vaiheita Jos esimerkiksi ajetaan vaiheen

compile Maven itseasiassa suorittaa sarjan vaiheita

1 validate

2 generate-sources

3 process-sources

4 generate-resources

5 process-resources

6 compile

Compilen ajamisen jaumllkeen voidaan testata kaumlaumlnnettyauml JARia seuraavalla komennolla

java -cp targetmy-app-10-SNAPSHOTjar commycompanyappApp

Taumlmauml komento tulostaa

Hello World

Kaumlydaumlaumln laumlpi vielauml eri Mavenin yleisimmaumlt oletuselinkaaressa kaumlytetyt vaiheet Naumlitauml

ovat

-validate varmistaa ettauml projekti on ehjauml ja kaikki tarvittava tieto on saatavilla

-compile kaumlaumlntaumlauml projektin laumlhdekoodin

-test testaa kaumlaumlnnetyn laumlhdekoodin kaumlyttaumlen sopivaa yksikkoumltestikehystauml Naumliden

testien ei tulisi vaatia vaiheita package tai deploy

-package paketoi kaumlaumlnnetyn koodin sen jaettavaan muotoon esimerkiksi JARriksi

-integration-test prosessoi ja jaumlrjestaumlauml paketin ympaumlristoumloumln jossa integraatiotestejauml

voidaan ajaa jos tarpeellista

-verify tarkistaa onko paketti validi ja taumlyttaumlaumlkouml se laatukriteerit

-install asentaa paketin paikalliseen tietovarastoon muiden paikallisten projektien

kaumlyttoumloumln tai paikallisten projektien riippuvuudeksi

-deploy kopioi lopullisen paketin ulkoiseen tietovarastoon jaettavaksi muille kehittaumljil-

le ja projekteille Tehdaumlaumln integraatio- tai julkaisuympaumlristoumlssauml

On vielauml kaksi muuta mainitsemisen arvoista Maven-elinkaarta jotka eivaumlt sisaumllly yllauml

listattuun oletuselinkaareen Naumlitauml ovat

18

-clean poistaa aikaisempien koontien yhteydessauml luodut artifaktit

-site generoi verkkodokumentaation kyseiselle projektille

Jokainen vaihe sisaumlltaumlauml sarjan suoritettavia kohteita joiden ajaminen riippuu projektin

paketointityypistauml Jos projektin tyyppi on JAR niin package ajaa kohteen jarjar Vas-

taavasti WAR -tyyppisen projektin package -vaihe suorittaa kohteen warwar

34 Koonti ja kaumlyttoumloumlnotto

Ohjelmiston saattamista laumlhdekoodista loppukaumlyttaumljaumllle kaumlyttoumlkelpoiseen muotoon kut-

sutaan koonniksi Laumlhdekoodin kaumlaumlntaumlmisen lisaumlksi koonti voi sisaumlltaumlauml monia muita vai-

heita Aleksi Lukkarinen on opinnaumlytetyoumlssaumlaumln listannut esimerkkejauml erilaisista koon-

neista seuraavasti [Aleksi Lukkarinen opinnaumlytetyouml]

-ohjelmointikielisen laumlhdekoodin sekauml resurssien automatisoitua luomista

-eri ohjelmointikielillauml tuotetun laumlhdekoodin kaumlaumlntaumlmistauml kone- jatai vaumllikielille

-vaumlli- tai konekielisen ohjelmakoodin jaumllkikaumlsittelyauml esimerkiksi testauksen aspektioh-

jelmoinnin tai koodin tarkoituksellisen sotkemisen vuoksi

-sovelluksen testausta (esimerkiksi toimivuus tietoturvallisuus suorituskyky rakenteel-

linen ja koodaustekninen laatu sekauml kaumlyttoumltarkoitustaan vastaavuus)

-dokumentaation koontia (kuten varsinaisen sovelluksen koonti)

-koontituotteiden paketointia sekauml mahdollisten fyysisten jakelumedioiden luontia toi-

mivuus- ja virustarkistuksineen

-ohjelmistomoduulien integrointia

-palautteen antamista koonnin tuloksista

Lukkarinen jaumlsentelee opinnaumlytetyoumlssaumlaumln sovelluksen jakeluun ja kaumlyttoumloumlnottoon sisaumll-

tyviksi asioiksi

-Sovellusta suorittavien ja tukevien palvelinympaumlristoumljen luominen ja paumlivittaumlminen

-Sovelluksen sekauml sen kaumlyttaumlmien ohjelmistokomponenttien siirtaumlminen ja maumlaumlrittaumlmi-

nen esimerkiksi testaus- laadunvarmistus- esittely-koulutus- sekauml tuotantoympaumlris-

toumlihin Kohdeympaumlristoumlissauml olevat vanhat versiot on mahdollisesti paumlivitettaumlvauml jollei

uusia versiota asenneta niiden rinnalle

19

-Uusien tietokantojen luominen sekauml vanhojen paumlivittaumlminen uutta sovellusversiota

vastaaviksi

-Kirjanpidollisen materiaalin tuottaminen ja yllaumlpitaumlminen

-Palautteen antaminen jakelu- ja kaumlyttoumloumlnottoprosessin onnistumisesta

Taumlmaumln luvun tarkoitus oli perehdyttaumlauml lukija ymmaumlrtaumlmaumlaumln koontiprosessia koontiku-

vaus-esimerkkien avulla Koontiprosessin ymmaumlrtaumlminen on vaumllttaumlmaumltoumlntauml seuraavan

luvun ymmaumlrtaumlmiseen jossa perehdytaumlaumln koontiympaumlristouml -kaumlsitteeseen

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant

Taumlssauml luvussa luodaan nopea katsaus koonti- ja kaumlyttoumloumlnottoprosessien automatisoimi-

seen tutustutaan jatkuvaan integraatioon sekauml sovellukseen Jenkins CI

Lisaumlksi tutustutaan projektihallintaohjelmaan Agilefant Agilefant on yksi monipuoli-

simmista kevyistauml vapaan laumlhdekoodin projektinhallintasovelluksista ja se soveltuu

niin pieniin kuin suuriinkin projekteihin

Naumlmauml sovellukset esitellaumlaumln pohjustuksena lukuja 5 ja 6 varten joissa tutustutaan

koontiympaumlristoumln tarkkailuun

41 Jatkuva integraatio

Jatkuva integraatio (Continuous Integration CI) on modernin sovelluskehityksen kul-

makivi Itse asiassa se on mullistanut sovelluskehityksen Kun jatkuva integraatio ote-

taan kaumlyttoumloumln organisaatiossa se muuttaa radikaalisti sitauml miten tyoumlryhmauml ymmaumlrtaumlauml

koko kehitysprosessin Jatkuvalla integraatiolla on potentiaalia laukaista sarja paran-

nuksia organisaation tuotteen kehitysprosessiin Se alkaa yksinkertaisesta automaatti-

sesta koonnista kehittyen systeemiksi joka automaattisesti saattaa tuotteen tuotan-

toon Hyvauml CI-infrastruktuuri mahdollistaa virheiden helpon sekauml nopean huomaamisen

ja tarjoaa kojelaudan projektin hyvinvoinnin ja muiden statistiikkojen seuraamiseen

sekauml kehittaumljille ettauml muille projektin osapuolille Jenkins The Definite Guiden mukaan

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 8: Joakim Sandqvist - Theseus

2

2 Ohjelmistotuotantoprojekti -kurssi

Taumlssauml luvussa perehdytaumlaumln Metropolia Ammattikorkeakoulun Ohjelmistotuotantoprojek-

ti-kurssiin Luvun tarkoitus on antaa lukijalle hyvauml yleiskuva kurssin sisaumllloumlstauml tyoumltilois-

ta sekauml kehitysympaumlristoumlstauml

21 Ohjelmistotuotantoprojekti-kurssin yleiskuvaus

Opiskelijat paumlaumlsevaumlt soveltamaan kurssilla useita aiemmilla tietotekniikan kursseilla

opittuja tietoja ja taitoja Tyouml on projektiluontoinen Kuhunkin ryhmaumlaumln kuuluu 4-6

opiskelijaa ja ryhmiauml on yhteensauml 2-4 Projekti kestaumlauml kahden periodin ajan ja sen

kokonaistyoumlmaumlaumlrauml on noin 800-1200 tyoumltuntia

Ohjelmiston kehittaumlmiseen kaumlytetaumlaumln Scrum-ketteraumlauml menetelmaumlauml Scrumin tyoumlvaiheet

koostuvat sprinteistauml joita taumlssauml projektissa on viisi kappaletta Jokaista sprinttiauml edel-

taumlauml aloituspalaveri jossa sovitaan kyseisen sprintin tehtaumlvaumlt ja tavoite Ydinroolit

Scrumissa ovat tuotteen omistaja tiimi sekauml Scrum Master Kurssin tyoumlryhmien Scrum

Mastereina toimivat opettajat Tiimit koostuvat kurssin tyoumlryhmistauml ja tuotteen immate-

riaalioikeudet omistaa Metropolia Oy joka puolestaan antaa tuotteen kaumlyttoumloikeudet

projektiin osallistuneille tahoille Taumlmauml on toimintapa yleensauml mutta asiakkaasta riip-

puen tehdaumlaumln erilaisia sopimuksia

Jokainen kurssin ryhmauml maumlaumlrittelee suunnittelee toteuttaa testaa sekauml dokumentoi

suurehkon ohjelmiston Jokaisella projektilla on oma asiakas joko oikea yritys tai opet-

taja joka edustaa tyoumln tilaajaa Asiakas on kaumlytettaumlvissauml kunkin sprintin aloituspalave-

rissa toiminnallisten vaatimusten maumlaumlrittelyauml varten Kullakin ryhmaumlllauml on myoumls ohjaa-

ja jonka tehtaumlvaumlnauml on auttaa tyoumln kaumlynnistaumlmisessauml sekauml toimiminen Scrum Masteri-

na Ohjaajat eivaumlt varsinaisesti osallistu tiimin tyoumlskentelyyn

22 Ohjelmistotuotantoprojekti-kurssin kehitysympaumlristoumln yleiskuvaus

Kurssin viimeisimpiauml kehitysympaumlristoumlparannuksia on Aleksi Lukkarisen opinnaumlytetyouml-

naumlaumln tekemauml rdquoopetuskaumlyttoumloumln soveltuva virtuaalikonepohjainen kehitysympaumlristouml

3

jonka avulla innovaatioprojekteja toteuttavat opiskelijat voivat tyoumlskennellauml jatkuvan

integraation ja kaumlyttoumloumlnoton periaatteiden mukaisestirdquo [Lukkarinen 2011 tiivistelmauml]

Uusimmat parannukset kurssin tyouml- ja kehitysympaumlristoumloumln ovat taumlhaumln opinnaumlytetyoumlhoumln

kuuluva sovellus rdquoKoontardquo johon palataan vielauml taumlmaumln dokumentin loppupuolella sekauml

kurssin tyoumltiloihin tehdyt uudet laitehankinnat

Katselmus kehitysympaumlristoumloumln aloitetaan esittelemaumlllauml kurssin uudet tyoumltilat Taumlmaumln

jaumllkeen perehdytaumlaumln kurssin palvelininfrastruktuuriin

221 Kurssin tyoumltilat

Tyoumltilat ja viihtyvyys ovat olennainen osa ryhmaumlkeskeistauml tyoumlntekoa On taumlrkeaumlauml ettauml

kehitysryhmaumlllauml on tarpeeksi tilaa tyoumlskennellauml ja ryhmaumln sisaumlinen kommunikaatio toi-

mii mahdollisimman helposti Tyoumltilat liittyvaumlt myoumls olennaisesti koontiympaumlristoumln tark-

kailuun jota taumlssauml opinnaumlytetyoumlssauml kaumlsitellaumlaumln myoumlhemmin

Joulukuussa 2011 Metropolia teki uusia laitehankintoja Bulevardin toimipisteeseen Oh-

jelmistotuotantoprojekti-kurssin tyoumltiloihin Ensisijaisesti jokaisen kurssiryhmaumln tyoumltiloi-

hin oli saatava naumlyttouml jossa ajettaisiin taumlssauml opinnaumlytetyoumlssauml tehtyauml koontiympaumlristoumln

tarkkailuun soveltuvaa ohjelmaa rdquoKoontardquo

Taumlssauml luvussa kaumlydaumlaumln laumlpi kurssin tyoumltiloihin hankitut laitteet ja esitellaumlaumln tyoumltilat ko-

konaisuudessaan mukaan lukien laitteet jotka jaumlivaumlt kaumlyttoumloumln vanhasta laitekokoon-

panosta

Kuvassa 1 on esitelty yhden ryhmaumln tyoumltila Kyseisen ryhmaumln tyoumltilaan kuuluu kolme

tussitaulua joista yksi laumlhiprojektorin alla oleva toimii myoumls projektointipintana laumlhi-

projektorille Ryhmaumlllauml on kaumlytoumlssaumlaumln kuusi kannettavaa tietokonetta Tietokoneet sekauml

laumlhiprojektori ovat kiinni HDMI-valitsimessa Kuvan vasemmassa ylaumlnurkassa on mini-

tietokone sekauml naumlyttouml Minitietokone ja naumlyttouml on varattu koontiympaumlristoumln tarkkailuun

(luku 4) Ryhmauml naumlkee laitteesta ohjelmistoprojektinsa tilan reaaliajassa ja pystyy rea-

goimaan projektin tilamuutoksiin nopeasti

4

Kuva 1 Yhden ryhmaumln tyoumltila

Yksi oleellisimmista uusista laitehankinnoista on laumlhiprojektori (kuva 2) Jokaisella kurs-

sin ryhmaumlllauml on kaumlytoumlssaumlaumln yksi laumlhiprojektori Toisin kuin perinteinen projektori laumlhi-

projektori saadaan asetettua seinaumllle suoraan projektorointikohteen ylaumlpuolelle Taumlten

se vie vaumlhemmaumln tilaa kuin normaali projektori ja oli hyvauml valinta uuteen laitekokoon-

panoon

Kuva 2 Hitachi CP-AW250NM

Tyoumltiloihin hankittiin 2000 mm x 1200 mm tussitaulut jotka toimivat laumlhiprojektorien

piirtoalueina sekauml vaihtoehtoisesti tussitauluina

5

Jokaiselle ryhmaumllle hankittiin 27-tuumaiset LG E2770V -malliset LED-naumlytoumlt Naumlmauml naumly-

toumlt on tarkoitettu vain koontiympaumlristoumln tarkkailua varten Ne kestaumlvaumlt pitkaumlkestoista

kaumlyttoumlauml ja voivat olla paumlaumlllauml youmltauml paumlivaumlauml ilman ettauml kuva palaa kiinni ruutuun Naumlytoumlt

on kiinnitetty seinaumlaumln kolmi-nivelisillauml Melicone Stile DR200 -mallisilla seinaumltelineillauml

joiden avulla naumlyttoumljen kaltevuutta ja sijaintia pystytaumlaumln saumlaumltaumlmaumlaumln

Ryhmille hankitut minitietokoneet (kuva 3) ovat kiinni yllauml esitetyissauml naumlytoumlissauml Minitie-

tokoneita hallitaan langattomalla hiirellauml sekauml naumlppaumlimistoumlllauml Perinteisen poumlytaumltietoko-

neen hankkimisen sijaan paumlaumldyttiin pienempaumlaumln vaihtoehtoon jotta tyoumlskentelytilaa

jaumlisi enemmaumln

Kuva 3 HP8200 USDT -minitietokone

Taumlrkeauml osa uutta laitekokoonpanoa on HDMI-valitsin (kuva 4) Valitsin on kytkettynauml

ryhmaumln laumlhiprojektoriin sekauml ryhmaumln jaumlsenten kaumlyttaumlmiin kannettaviin tietokoneisiin

Valitsimella on taumlrkeauml rooli ryhmien viikkopalavereissa ryhmaumln paumlivittaumlisessauml tyoumlsken-

telyssauml sekauml kehitysryhmaumln ja asiakkaan vaumllisissauml tapaamisissa Valitsin mahdollistaa

sujuvamman kommunikaation ryhmaumln jaumlsenten vaumllillauml Kurssiryhmien kehittaumljaumlt saavat

nappia painamalla oman kannettavan tietokoneensa naumlkymaumln laumlhiprojektoriin

6

Kuva 4 Kramer VS-81H HDMI -valitsin

222 Kurssin palvelimet

Kurssin ryhmaumlkohtaiset palvelimet kevaumlaumlllauml 2012 ovat koontipalvelin testi- ja tuotanto-

sovelluspalvelimet sekauml testi- ja tuotantotietokantapalvelimet (kuva 5) Testipalvelimet

toimivat ryhmaumln omana hiekkalaatikkona Kehitysympaumlristoumln palvelininfrastruktuuri

koostuu kokonaisuudessaan seuraavassa kuvassa esitellyistauml palvelimista

Kuva 5 Kehitysympaumlristoumln palvelininfrastruktuuri

7

Seuraavaksi kaumlydaumlaumln laumlpi palvelimet yksitellen Kerrotaan mitauml sovelluksia kuhunkin

palvelimeen on asennettu ja mitauml ovat kunkin palvelimen tehtaumlvaumlt

Palvelimista koontiympaumlristoumln (luvut 34 4) kannalta oleellisimmassa roolissa on koon-

tipalvelin Jokaisella ryhmaumlllauml on oma koontipalvelimensa jossa ajetaan Jenkins CI -

sovellusta Jenkins CI on vastuussa projektien automaattisesta koonnista ja haumllyttaumlauml

ryhmaumllle projektin koonnin epaumlonnistuessa Jenkins CIstauml kerrotaan lisaumlauml luvussa 4

Tuotanto- ja testipalvelimia on kaksi kappaletta jokaista ryhmaumlauml kohti Tuotantoympauml-

ristoumloumln kuuluvat tuotantosovelluspalvelin sekauml tuotantotietokantapalvelin Tuotantotie-

tokantapalvelin sisaumlltaumlauml ryhmaumlkohtaiset tietokannat Tuotantosovelluspalvelin sisaumlltaumlauml

ryhmaumlkohtaiset palvelut kuten Phpn ja Javan Vastaavasti testiympaumlristoumloumln kuuluvat

testisovelluspalvelin ja testitietokantapalvelin joilla on sama toiminnallisuus kuin tuo-

tantoympaumlristoumln palvelimilla

Ryhmien kaumlytoumlssauml oleva testiympaumlristouml mahdollistaa esimerkiksi palvelinkonfiguraatioi-

den riskittoumlmaumln testaamisen ennen muutosten kaumlyttoumloumlnottoa tuotantoympaumlristoumln puo-

lella Tuotanto -ja testipalvelimet ovat virtualisoituja Palvelimien virtualisointi mahdol-

listaa palvelimen tilan tallennuksen Palvelinten oletustilat (snapshot) voidaan halutessa

ladata muistista palvelimen korruptoituessa konfiguraatiotestaamisen yhteydessauml

Jokaisella ryhmaumlllauml on siis kaumlytoumlssaumlaumln viisi ryhmaumlkohtaista palvelinta koonti- tuotanto-

sovellus- tuotantotietokanta- testisovellus- sekauml testitietokantapalvelin Taumlmaumln lisaumlksi

ryhmillauml on kaumlytoumlssaumlaumln kolme yleiskaumlyttoumlistauml palvelinta joista kerrotaan seuraavaksi

Naumlmauml palvelimet ovat versionhallinta- projektinhallinta- sekauml varmuuskopiopalvelin

Versionhallintapalvelimella sijaitsevat ryhmien kaumlytoumlssauml olevat kaksi tietovarastoa Tois-

ta tietovarastoa kaumlytetaumlaumln laumlhdekoodin taltioimiseen ja toista tietovarastoa oheistuot-

teiden kuten dokumentaation taltioimiseen Opiskelijaryhmien tietovarastojen lisaumlksi

palvelimella on innodev-tietovarasto ympaumlristoumln yllaumlpitoa ja kehitystauml varten Kuvassa 6

on esitelty esimerkki eraumlaumln ohjelmistoprojektin tietovaraston hakemistorakenteesta

8

Kuva 6 Esimerkki opiskelijaryhmaumln tietovaraston hakemistorakenteesta

Projektinhallintapalvelin sisaumlltaumlauml Agilefant-sovelluksen josta ajetaan yhtauml instanssia

kullekin kurssin ryhmaumllle Agilefant on projektinhallintasovellus joka soveltuu hyvin

ketteraumln kehityksen tarpeisiin Sitauml kaumlytetaumlaumln ryhmaumln tyoumltuntien merkkaamiseen ja

projektin kehityksen valvomiseen Agilefantista kerrotaan tarkemmin luvussa 4

Kurssiryhmien kaumlytoumlssauml olevalle varmuuskopiopalvelimelle on tarkoitus kopioida var-

muuskopiota projektinhallinta- ja versionhallintapalvelimien tiloista Varmuuskopiointi ei

ole automatisoitua jonka takia palvelimen kaumlyttoumlmaumlaumlrauml on jaumlaumlnyt pieneksi

3 Ohjelmiston kokoaminen

Ohjelmiston kokoaminen tarkoittaa yksinkertaisimmillaan ohjelmistokoodin kaumlaumlntaumlmistauml

ajettavaan muotoon Jos ohjelmisto on iso ja sen rakenne on modulaarinen voi kehit-

taumljaumlllauml olla tarve jakaa ohjelmiston kokoaminen useisiin operaatioihin joilla on keskinaumli-

siauml riippuvuuksia

Taumlssauml luvussa tutustutaan eri tapoihin toteuttaa ohjelmiston koonti Ensin perehdytaumlaumln

makefileen ja tutustutaan ohjelmiston kokoamiseen makefile-esimerkkien avulla Tauml-

9

maumln jaumllkeen perehdytaumlaumln modernimpiin koontisovelluksiin Ant ja Maven Naumlmauml luvut

ovat tarpeellisia koontiprosessin ymmaumlrtaumlmisen kannalta

31 Makefile

Makefile on tiedosto jota Unix-komento Make kaumlyttaumlauml ohjelman kokoamiseen Makefile

kuvaa ohjelman laumlhdekooditiedostojen vaumlliset riippuvuudet ja sisaumlltaumlauml ohjeet ohjelmis-

ton kaumlaumlntaumlmiseen Kaumlaumlntaumlmisen lisaumlksi makefileen voi sisaumlllyttaumlauml mitauml vain Unix-

komentoja ja siitauml voi kaumlynnistaumlauml testejauml

Otetaan esimerkkitapaus jossa C-kieliseen ohjelmistoon kuuluu 3 tiedostoa

tiedosto1c

tiedosto2c

tiedosto1h

Ilman makefileauml ohjelma kaumlaumlnnettaumlisiin Unix-komentoriviltauml seuraavanlaisesti

gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Esimerkissauml ndashI optio kertoo kaumlaumlntaumljaumllle ettauml sen tulee etsiauml header-tiedostot tyoumlkansi-

osta Gcc-kaumlaumlntaumljauml kaumlaumlntaumlauml tiedostot ja luo sovellusohjelman rdquoesimerkkirdquo Taumlmauml laumlhes-

tymistapa ohjelmiston kaumlaumlntaumlmiseen tulee vaivalloiseksi viimeistaumlaumln siinauml vaiheessa

kun projektiin lisaumltaumlaumln tiedostoja kaumlaumlntaumlmiskomento muuttuu ja se on haettava ko-

mentorivihistoriasta tai kirjoitettava uudestaan Makefilen tekeminen ratkaisee taumlmaumln

ongelman [A Simple Makefile Tutorial]

Esimerkki makefilestauml naumlyttaumlauml taumlltauml

1 esimerkki tiedosto1c tiedosto2c

2 gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Jos yllauml olevat rivit kirjoitetaan rdquoMakefilerdquo- tai rdquomakefilerdquo-nimiseen tiedostoon ja kirjoi-

tetaan komentoriville rdquomakerdquo niin suoritetaan makefileen kirjoitettu komento (rivi 2)

Make ilman optioita suorittaa automaattisesti makefilen ensimmaumlisen kohteen (target)

joka taumlssauml tapauksessa on nimeltaumlaumln rdquoesimerkkirdquo Rivillauml 1 olevat tiedosto1c ja tiedos-

to2c kertoo makelle ettauml naumliden tiedostojen olemassaolo vaaditaan kohteen suoritta-

10

miseen Korostetaan ettauml make vaatii tabulaattorin kaumlytoumln ennen jokaista komentoa

(rivi 2) [A Simple Makefile Tutorial]

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 esimerkki tiedosto1o tiedosto2o

5 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

Edellisen esimerkin riveille 1 ja 2 on lisaumltty muuttujat rdquoKAANTAJArdquo ja rdquoOPTIOTrdquo Naumliden

muuttujien muuttaminen vaikuttaa koko tiedostoon ndash taumlssauml tapauksessa ainoastaan

riviin 5

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 all esimerkki

5

6 esimerkki tiedosto1o tiedosto2o

7 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

8

9 tiedosto1o tiedosto1c

10 gcc -c tiedosto1c

11 12 tiedosto2o tiedosto2c

13 gcc -c tiedosto2c

14 15 clean

16 rm -rf o esimerkki

Edellinen esimerkki koostuu viidestauml eri kohteesta

Ensimmaumlinen kohde rdquoallrdquo suoritetaan kun Make ajetaan ilman optioita Jotta rdquoallrdquo voi-

taisiin suorittaa pitaumlauml suorittaa ensin rdquoesimerkkirdquo (rivi 6) koska rdquoallrdquo on riippuvainen

kohteesta rdquoesimerkkirdquo

Seuraavaa kohdetta rdquoesimerkkirdquo ei voi kuitenkaan suorittaa ennen kuin Make on tar-

kastanut tiedostojen rdquotiedosto1ordquo ja rdquotiedosto2ordquo aikaleimat jos aikaleimat ovat van-

hentuneet eli tiedostot ovat muuttuneet on ajettava kohteet rdquotiedosto1ordquo sekauml rdquotie-

dosto2ordquo Naumlmauml kohteet ajettuaan voi Make siirtyauml suorittamaan kohdetta rdquoesimerkkirdquo

ja taumlmaumln jaumllkeen kohdetta rdquoallrdquo jolla ei ole toteutusta

11

Kohteella rdquocleanrdquo ei ole riippuvuuksia Taumlllaista kohdetta kutsutaan komentorivillauml ko-

mennolla rdquomake cleanrdquo Rivillauml 16 oleva komento poistaa kaikki tyoumlhakemistossa sijait-

sevat rdquoordquo-paumlaumltteiset tiedostot sekauml sovellusohjelman rdquoesimerkkirdquo

Viimeisin makefile-esimerkki on yksinkertainen ohjelmiston koonti vaikka se vaikuttaa

pelkaumlstaumlaumln ohjelman kaumlaumlntaumlmiseltauml Jos yllauml olevaa esimerkkiauml haluttaisiin kehittaumlauml li-

saumlauml voitaisiin siihen lisaumltauml esimerkiksi kohde joka hakee laumlhdekoodin tietovarastosta ja

poistaa paikalliset laumlhdekoodit kovalevyltauml ohjelman kaumlaumlntaumlmisen jaumllkeen

32 Ant

Luvussa 31 tutustuttiin makefileen joka on Maken koontikuvaustiedosto Taumlssauml luvus-

sa perehdytaumlaumln koontityoumlkalu Antin kaumlyttaumlmaumlaumln Xml-muotoiseen koontikuvaukseen

Apache Ant on Java kirjasto- ja komentorivityoumlkalu jonka tehtaumlvaumlnauml on ajaa prosesseja

jotka on kuvattu koontitiedostoissa rdquokohteinardquo joilla on keskinaumlisiauml riippuvaisuuksia

Ant on paumlaumlasiallisesti Java-sovellusten koontisovellus mutta sitauml voidaan kaumlyttaumlauml myoumls

C -ja C++ -ohjelmistojen kokoamiseen Taumlssauml luvussa on esimerkki Java-ohjelmiston

koonnista

Antin kaumlyttaumljaumlt voivat kehittaumlauml omia rdquoantlibsrdquo-kirjastoja joihin sisaumlltyy omia tehtaumlviauml

(tasks) ja tyyppejauml (types) Kaumlyttaumljille tarjotaan myoumls suuri maumlaumlrauml valmiiksi tehtyjauml

kaupallisia tai avoimia rdquoantlibsrdquo kirjastoja [Apache Ant Welcome]

Ant-koontitiedosto koostuu neljaumlstauml eri elementistauml projects targets tasks ja proper-

ties

Koontitiedostossa kuvatulla projektilla on kolme attribuuttia name default sekauml base-

dir Name kuvaa projektin nimeauml ja eikauml sitauml ole pakko maumlaumlritellauml Default kuvaa koon-

titiedoston oletuskohdetta (default target) jota kutsutaan kun kohdetta ei erikseen

anneta kokoamiskomennossa Basedir maumlaumlrittelee projektin tyoumlhakemiston jota kaumlyte-

taumlaumln hakemistopolkujen selvittaumlmiseksi Taumlmaumlkaumlaumln attribuutti ei ole pakollinen Jos

basedir-atribuuttia ei maumlaumlritellauml kaumlytetaumlaumln tyoumlhakemistona samaa hakemistoa jossa

koontitiedosto sijaitsee

12

Kohteilla (targets) on riippuvuuksia muista kohteista Kuten makefilessauml voidaan koh-

teiden vaumllille rakentaa riippuvuuksia ja luoda ohjelmiston kokoamisen kannalta jaumlrkevauml

riippuvaisuuksien verkosto

Tehtaumlvaumlt (tasks) ovat suoritettavia koodirivejauml Tehtaumlvillauml voi olla useita attribuutteja

kuten tulevasta esimerkissauml naumlhdaumlaumln

Ominaisuuksilla (properties) voidaan antaa oikoteitauml (shortcuts) komentoihin tai merk-

kijonoihin joita kaumlytetaumlaumln usein koontitiedostossa Ominaisuudella on nimi- sekauml arvo-

attribuutti [Apache Ant Using Apache Ant]

1 ltproject name=MyProject default=dist basedir=gt

2 ltdescriptiongt

3 Yksinkertainen koontikuvaustiedosto

4 ltdescriptiongt

5 lt--Asetetaan julkiset ominaisuudet --gt

6 ltproperty name=src location=srcgt

7 ltproperty name=build location=buildgt

8 ltproperty name=dist location=distgt

9

10 lttarget name=initgt

11 ltmdashLuodaan aikaleima --gt

12 lttstampgt

13 ltmdashLuodaan hakemistorakenne ldquocompilerdquo tehtaumlvaumllle --gt

14 ltmkdir dir=$buildgt

15 lttargetgt

16 17 lttarget name=compile depends=initgt

18 lt--Kaumlaumlnnetaumlaumln Java-koodi $srcstauml into $buildiin --gt

19 ltjavac srcdir=$src destdir=$buildgt

20 lttargetgt

21 22 lttarget name=dist depends=compile

23 description=Generoidaan distribuutio gt

24 lt--Luodaan distribuutio kansio --gt

25 ltmkdir dir=$distlibgt

26 27 lt-- Laitetaan $build sisaumlltouml MyProject-$DSTAMPjarriin --gt

28 ltjar jarfile=$distlibMyProject $DSTAMPjar basedir=$buildgt

29 lttargetgt

30 31 lttarget name=clean

32 description=clean up gt

33 ltmdashPoistetaan $build ja $dist hakemistot --gt

34 ltdelete dir=$buildgt

13

35 ltdelete dir=$distgt

36 lttargetgt

37 ltprojectgt

[Apache Ant Using Apache Ant Example Buildfile]

Edelliseen koontikuvaukseen on maumlaumlritelty projekti jonka nimi on ldquoMyProjectrdquo Kun

tutustutaan koonnin kuvaukseen huomataan ettauml koontitiedoston projektin oletuskoh-

teella rdquodistrdquo on riippuvuus kohteeseen rdquocompilerdquo jolla on riippuvuus kohteeseen rdquoinitrdquo

Initillauml ei ole riippuvaisuuksia Taumlten ensimmaumlinen koonnin yhteydessauml ajettava kohde

onkin rdquoinitrdquo eikauml rdquodistrdquo vaikka rdquodistrdquo on koontikuvauksen oletuskohde Voidaan sanoa

ettauml koonnin paumlaumlmaumlaumlrauml on suorittaa kohde rdquodistrdquo ja paumlaumlmaumlaumlraumln saavuttamiseksi on

suoritettava kohteita joista taumlmauml on riippuvainen Riippuvuudet toimivat samalla peri-

aatteella kuin aikaisemmissa makefile-esimerkeissauml

Ohjelmiston kokoamisen yhteydessauml halutaan edellisessauml esimerkissauml saada ohjelmisto

jakeluun Jotta ohjelmisto saataisiin jakeluun on se ensin kaumlaumlnnettaumlvauml ja sitauml ennen on

luotava ohjelmiston hakemistorakenne

Jos halutaan kehittaumlauml esimerkin koontikuvausta voidaan esimerkiksi suorittaa verk-

kosivujen paumlivitystehtaumlvauml yhden kohteen sisaumlllauml ja asettaa se riippuvaiseksi kohteesta

rdquodistrdquo Naumlin ohjelmasta saadaan paumlivitetty versio jakeluun ja verkkosivuille tulee taumlstauml

automaattinen ilmoitus ohjelmiston kaumlyttaumljille

33 Maven

Luvussa 32 tutustuttiin Anttiin joka on natiivi koontityoumlkalu Seuraavaksi tutustutaan

koonti- ja projektinhallintasovellukseen Maveniin jolla voidaan kuvata koontiprosessin

lisaumlksi myoumls projektin rakenne Maven rohkaisee kaumlyttaumlmaumlaumln parhaita kaumlytaumlntoumljauml (best

practises) joita kaumlyttaumlmaumlllauml ohjelmistoprojektista toiseen siirtyessauml oppimiskynnys

uuden koontikuvauksen ymmaumlrtaumlmiseen pienenee [Maven vs Ant or Ant vs Maven]

Maven on kaumlytoumlssauml Metropolian Ohjelmistotuotantoprojekti-kurssin ohjelmistoprojekti-

en koontityoumlkaluna

Apache Maven on ohjelmistoprojektin hallintatyoumlkalu Se perustuu projekti-olio-malli -

konseptiin (Project Object Model POM) Maven kykenee kokoamaan projektin testaa-

14

maan projektin antamaan kaumlyttaumljaumllle palautetta dokumentoimaan kokoamisen ja te-

kemaumlaumln useita muita tehtaumlviauml erillisillauml Mavenin tarjoamilla lisaumlosilla (plug-ins) [Apache

Maven Project Welcome to Apache Maven]

POM on XML-tiedosto joka sisaumlltaumlauml informaatiota projektista ja yksityiskohtaisen konfi-

guraation jota Maven kaumlyttaumlauml projektin kokoamiseen POM kostuu kohteista (goals)

jotka on maumlaumlritelty pomxml -tiedostossa Kun suoritetaan erillinen tehtaumlvauml tai kohde

Maven etsii POMmia tyoumlhakemistosta lukee POMmin hakee tarvittavan konfiguraati-

on ja suorittaa kohteen

Eraumlitauml POMissa maumlaumlriteltaumlviauml konfiguraatioita ovat projektin riippuvuudet kaumlytettaumlvaumlt

lisaumlosat ajettavat kohteet ja koontiprofiilit POMiin voi maumlaumlritellauml muutakin tietoa ku-

ten projektin version kehittaumljaumlt ja postituslistat [Apache Maven Project Introduction

to the POM]

Maven on Java-tyoumlkalu joten Java taumlytyy olla asennettuna Mavenia ajavalle koneelle

Taumlmauml luku perustuu Apachen verkkosivuilla sijaitsevaan Mavenin kaumlyttoumlohjeeseen

[Apache Maven Project Maven in 5 Minutes] Seuraavaksi luetellaan eri vaiheet Ma-

ven-projektin luomiseksi

Ensin on ladattava Maven ja kaumlytaumlvauml laumlpi asennusohjeet jotka loumlytyvaumlt osoitteesta

[httpmavenapacheorgdownloadhtmlInstallation] Taumlmaumln jaumllkeen on avattava

terminaali tai komentokehote ja kirjoitettava

mvn --version

Taumlmaumln tulostaa asennetun Mavenin ja Javan versio Esimerkiksi

1 Apache Maven 303 (r1075438 2011-02-28 183109+0100)

2 Maven home Dapache-maven-303bin

3 Java version 160_25 vendor Sun Microsystems Inc

4 Java home EProgram FilesJavajdk160_25jre

5 Default locale nl_NL platform encoding Cp1252

6 OS name windows 7 version 61 arch amd64 family windows

Maven-projekti luodaan ajamalla terminaalissa Maven kohde (goal)

15

mvn archetypegenerate -DgroupId=commycompanyapp -DartifactId=my-app -

DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Ensimmaumlisellauml ajolla taumlmauml komento lataa tarvittavat Maven lisaumlosat ja muita tiedostoja

paikalliseen tietovarastoon Huomataan ettauml rdquogeneraterdquo kohde loi rdquoartifactIdrdquonauml anne-

tun hakemiston

Kirjoitetaan komentoriville

cd my-app

Taumlmaumln kansion alta loumlytyy Mavenin standardi projektirakenne

my-app

|-- pomxml

`-- src

|-- main

| `-- java

| `-- com

| `-- mycompany

| `-- app

| `-- Appjava

`-- test

`-- java

`-- com

`-- mycompany

`-- app

`-- AppTestjava

Yllauml kuvatussa hakemistorakenteessa oleva rdquosrcmainjavardquo-hakemisto sisaumlltaumlauml projek-

tin laumlhdekoodin Vastaavasti rdquosrctestjavardquo-hakemisto sisaumlltaumlauml testien laumlhdekoodin

Pomxml-tiedosto kuvaa projektin konfiguraatiota ja sisaumlltaumlauml projektin kokoamisohjeet

Esimerkkiprojektin POM naumlyttaumlauml taumlltauml

1 ltpro-

ject xmlns=httpmavenapacheorgPOM400 xmlnsxsi=httpwwww3org20

01XMLSchema-instance

2 xsischemaLocation=httpmavenapacheorgPOM400 httpmavenapacheorg

xsdmaven-400xsdgt

3 ltmodelVersiongt400ltmodelVersiongt

4

5 ltgroupIdgtcommycompanyappltgroupIdgt

6 ltartifactIdgtmy-appltartifactIdgt

16

7 ltversiongt10-SNAPSHOTltversiongt

8 ltpackaginggtjarltpackaginggt

9

10 ltnamegtMaven Quick Start Archetypeltnamegt

11 lturlgthttpmavenapacheorglturlgt

12 13 ltdependenciesgt

14 ltdependencygt

15 ltgroupIdgtjunitltgroupIdgt

16 ltartifactIdgtjunitltartifactIdgt

17 ltversiongt482ltversiongt

18 ltscopegttestltscopegt

19 ltdependencygt

20 ltdependenciesgt

21 ltprojectgt

POM-tiedosto on Maven-projektin konfiguraation ydin Se sisaumlltaumlauml suurimman osan

informaatiosta joka vaaditaan projektin kokoamiseen halutulla tavalla

Aikaisemmassa esimerkissauml ajettiin Mavenin kohde (goal) archetypegenerate ja an-

nettiin sille parametreja Etuliite archetype on lisaumlosa joka sisaumlltaumlauml kohteen generate

Taumltauml voi verrata Antin tehtaumlvaumlaumln Taumlmauml kohde loi yksinkertaisen projektin joka perus-

tuu arkkityyppiin Yleisesti Mavenin lisaumlosat koostuvat kohteista joilla on yhteinen paumlauml-

tarkoitus Esimerkki taumlllaisesta lisaumlosasta on jboss-maven-plugin jonka tehtaumlvaumlnauml on

kaumlsitellauml erinaumlisiauml Jboss-komponentteja (items)

Maven-projekti kootaan komentoriviltauml seuraavanlaisesti

mvn package

Komentorivi tulostaa eri komentoja tulostus loppuu seuraavanlaisesti

[INFO] --------------------------

[INFO] BUILD SUCCESSFUL

[INFO] --------------------------

[INFO] Total time 2 seconds

[INFO] Finished at Thu Jul 07 213452 CEST 2011

[INFO] Final Memory 3M6M

[INFO] --------------------------

Toisin kuin ensimmaumliseksi suoritetussa komennossa (archetypegenerate) huomataan

taumlllauml kertaa kaumlytetty komento package on vain yksi sana Taumlllaista komentoa kutsutaan

17

kohteen (goal) sijaan vaiheeksi (phase) Vaihe on yksi askel koonnin elinkaaressa

(build lifecycle) joka on jaumlrjestetty sarja eri vaiheita Jos esimerkiksi ajetaan vaiheen

compile Maven itseasiassa suorittaa sarjan vaiheita

1 validate

2 generate-sources

3 process-sources

4 generate-resources

5 process-resources

6 compile

Compilen ajamisen jaumllkeen voidaan testata kaumlaumlnnettyauml JARia seuraavalla komennolla

java -cp targetmy-app-10-SNAPSHOTjar commycompanyappApp

Taumlmauml komento tulostaa

Hello World

Kaumlydaumlaumln laumlpi vielauml eri Mavenin yleisimmaumlt oletuselinkaaressa kaumlytetyt vaiheet Naumlitauml

ovat

-validate varmistaa ettauml projekti on ehjauml ja kaikki tarvittava tieto on saatavilla

-compile kaumlaumlntaumlauml projektin laumlhdekoodin

-test testaa kaumlaumlnnetyn laumlhdekoodin kaumlyttaumlen sopivaa yksikkoumltestikehystauml Naumliden

testien ei tulisi vaatia vaiheita package tai deploy

-package paketoi kaumlaumlnnetyn koodin sen jaettavaan muotoon esimerkiksi JARriksi

-integration-test prosessoi ja jaumlrjestaumlauml paketin ympaumlristoumloumln jossa integraatiotestejauml

voidaan ajaa jos tarpeellista

-verify tarkistaa onko paketti validi ja taumlyttaumlaumlkouml se laatukriteerit

-install asentaa paketin paikalliseen tietovarastoon muiden paikallisten projektien

kaumlyttoumloumln tai paikallisten projektien riippuvuudeksi

-deploy kopioi lopullisen paketin ulkoiseen tietovarastoon jaettavaksi muille kehittaumljil-

le ja projekteille Tehdaumlaumln integraatio- tai julkaisuympaumlristoumlssauml

On vielauml kaksi muuta mainitsemisen arvoista Maven-elinkaarta jotka eivaumlt sisaumllly yllauml

listattuun oletuselinkaareen Naumlitauml ovat

18

-clean poistaa aikaisempien koontien yhteydessauml luodut artifaktit

-site generoi verkkodokumentaation kyseiselle projektille

Jokainen vaihe sisaumlltaumlauml sarjan suoritettavia kohteita joiden ajaminen riippuu projektin

paketointityypistauml Jos projektin tyyppi on JAR niin package ajaa kohteen jarjar Vas-

taavasti WAR -tyyppisen projektin package -vaihe suorittaa kohteen warwar

34 Koonti ja kaumlyttoumloumlnotto

Ohjelmiston saattamista laumlhdekoodista loppukaumlyttaumljaumllle kaumlyttoumlkelpoiseen muotoon kut-

sutaan koonniksi Laumlhdekoodin kaumlaumlntaumlmisen lisaumlksi koonti voi sisaumlltaumlauml monia muita vai-

heita Aleksi Lukkarinen on opinnaumlytetyoumlssaumlaumln listannut esimerkkejauml erilaisista koon-

neista seuraavasti [Aleksi Lukkarinen opinnaumlytetyouml]

-ohjelmointikielisen laumlhdekoodin sekauml resurssien automatisoitua luomista

-eri ohjelmointikielillauml tuotetun laumlhdekoodin kaumlaumlntaumlmistauml kone- jatai vaumllikielille

-vaumlli- tai konekielisen ohjelmakoodin jaumllkikaumlsittelyauml esimerkiksi testauksen aspektioh-

jelmoinnin tai koodin tarkoituksellisen sotkemisen vuoksi

-sovelluksen testausta (esimerkiksi toimivuus tietoturvallisuus suorituskyky rakenteel-

linen ja koodaustekninen laatu sekauml kaumlyttoumltarkoitustaan vastaavuus)

-dokumentaation koontia (kuten varsinaisen sovelluksen koonti)

-koontituotteiden paketointia sekauml mahdollisten fyysisten jakelumedioiden luontia toi-

mivuus- ja virustarkistuksineen

-ohjelmistomoduulien integrointia

-palautteen antamista koonnin tuloksista

Lukkarinen jaumlsentelee opinnaumlytetyoumlssaumlaumln sovelluksen jakeluun ja kaumlyttoumloumlnottoon sisaumll-

tyviksi asioiksi

-Sovellusta suorittavien ja tukevien palvelinympaumlristoumljen luominen ja paumlivittaumlminen

-Sovelluksen sekauml sen kaumlyttaumlmien ohjelmistokomponenttien siirtaumlminen ja maumlaumlrittaumlmi-

nen esimerkiksi testaus- laadunvarmistus- esittely-koulutus- sekauml tuotantoympaumlris-

toumlihin Kohdeympaumlristoumlissauml olevat vanhat versiot on mahdollisesti paumlivitettaumlvauml jollei

uusia versiota asenneta niiden rinnalle

19

-Uusien tietokantojen luominen sekauml vanhojen paumlivittaumlminen uutta sovellusversiota

vastaaviksi

-Kirjanpidollisen materiaalin tuottaminen ja yllaumlpitaumlminen

-Palautteen antaminen jakelu- ja kaumlyttoumloumlnottoprosessin onnistumisesta

Taumlmaumln luvun tarkoitus oli perehdyttaumlauml lukija ymmaumlrtaumlmaumlaumln koontiprosessia koontiku-

vaus-esimerkkien avulla Koontiprosessin ymmaumlrtaumlminen on vaumllttaumlmaumltoumlntauml seuraavan

luvun ymmaumlrtaumlmiseen jossa perehdytaumlaumln koontiympaumlristouml -kaumlsitteeseen

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant

Taumlssauml luvussa luodaan nopea katsaus koonti- ja kaumlyttoumloumlnottoprosessien automatisoimi-

seen tutustutaan jatkuvaan integraatioon sekauml sovellukseen Jenkins CI

Lisaumlksi tutustutaan projektihallintaohjelmaan Agilefant Agilefant on yksi monipuoli-

simmista kevyistauml vapaan laumlhdekoodin projektinhallintasovelluksista ja se soveltuu

niin pieniin kuin suuriinkin projekteihin

Naumlmauml sovellukset esitellaumlaumln pohjustuksena lukuja 5 ja 6 varten joissa tutustutaan

koontiympaumlristoumln tarkkailuun

41 Jatkuva integraatio

Jatkuva integraatio (Continuous Integration CI) on modernin sovelluskehityksen kul-

makivi Itse asiassa se on mullistanut sovelluskehityksen Kun jatkuva integraatio ote-

taan kaumlyttoumloumln organisaatiossa se muuttaa radikaalisti sitauml miten tyoumlryhmauml ymmaumlrtaumlauml

koko kehitysprosessin Jatkuvalla integraatiolla on potentiaalia laukaista sarja paran-

nuksia organisaation tuotteen kehitysprosessiin Se alkaa yksinkertaisesta automaatti-

sesta koonnista kehittyen systeemiksi joka automaattisesti saattaa tuotteen tuotan-

toon Hyvauml CI-infrastruktuuri mahdollistaa virheiden helpon sekauml nopean huomaamisen

ja tarjoaa kojelaudan projektin hyvinvoinnin ja muiden statistiikkojen seuraamiseen

sekauml kehittaumljille ettauml muille projektin osapuolille Jenkins The Definite Guiden mukaan

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 9: Joakim Sandqvist - Theseus

3

jonka avulla innovaatioprojekteja toteuttavat opiskelijat voivat tyoumlskennellauml jatkuvan

integraation ja kaumlyttoumloumlnoton periaatteiden mukaisestirdquo [Lukkarinen 2011 tiivistelmauml]

Uusimmat parannukset kurssin tyouml- ja kehitysympaumlristoumloumln ovat taumlhaumln opinnaumlytetyoumlhoumln

kuuluva sovellus rdquoKoontardquo johon palataan vielauml taumlmaumln dokumentin loppupuolella sekauml

kurssin tyoumltiloihin tehdyt uudet laitehankinnat

Katselmus kehitysympaumlristoumloumln aloitetaan esittelemaumlllauml kurssin uudet tyoumltilat Taumlmaumln

jaumllkeen perehdytaumlaumln kurssin palvelininfrastruktuuriin

221 Kurssin tyoumltilat

Tyoumltilat ja viihtyvyys ovat olennainen osa ryhmaumlkeskeistauml tyoumlntekoa On taumlrkeaumlauml ettauml

kehitysryhmaumlllauml on tarpeeksi tilaa tyoumlskennellauml ja ryhmaumln sisaumlinen kommunikaatio toi-

mii mahdollisimman helposti Tyoumltilat liittyvaumlt myoumls olennaisesti koontiympaumlristoumln tark-

kailuun jota taumlssauml opinnaumlytetyoumlssauml kaumlsitellaumlaumln myoumlhemmin

Joulukuussa 2011 Metropolia teki uusia laitehankintoja Bulevardin toimipisteeseen Oh-

jelmistotuotantoprojekti-kurssin tyoumltiloihin Ensisijaisesti jokaisen kurssiryhmaumln tyoumltiloi-

hin oli saatava naumlyttouml jossa ajettaisiin taumlssauml opinnaumlytetyoumlssauml tehtyauml koontiympaumlristoumln

tarkkailuun soveltuvaa ohjelmaa rdquoKoontardquo

Taumlssauml luvussa kaumlydaumlaumln laumlpi kurssin tyoumltiloihin hankitut laitteet ja esitellaumlaumln tyoumltilat ko-

konaisuudessaan mukaan lukien laitteet jotka jaumlivaumlt kaumlyttoumloumln vanhasta laitekokoon-

panosta

Kuvassa 1 on esitelty yhden ryhmaumln tyoumltila Kyseisen ryhmaumln tyoumltilaan kuuluu kolme

tussitaulua joista yksi laumlhiprojektorin alla oleva toimii myoumls projektointipintana laumlhi-

projektorille Ryhmaumlllauml on kaumlytoumlssaumlaumln kuusi kannettavaa tietokonetta Tietokoneet sekauml

laumlhiprojektori ovat kiinni HDMI-valitsimessa Kuvan vasemmassa ylaumlnurkassa on mini-

tietokone sekauml naumlyttouml Minitietokone ja naumlyttouml on varattu koontiympaumlristoumln tarkkailuun

(luku 4) Ryhmauml naumlkee laitteesta ohjelmistoprojektinsa tilan reaaliajassa ja pystyy rea-

goimaan projektin tilamuutoksiin nopeasti

4

Kuva 1 Yhden ryhmaumln tyoumltila

Yksi oleellisimmista uusista laitehankinnoista on laumlhiprojektori (kuva 2) Jokaisella kurs-

sin ryhmaumlllauml on kaumlytoumlssaumlaumln yksi laumlhiprojektori Toisin kuin perinteinen projektori laumlhi-

projektori saadaan asetettua seinaumllle suoraan projektorointikohteen ylaumlpuolelle Taumlten

se vie vaumlhemmaumln tilaa kuin normaali projektori ja oli hyvauml valinta uuteen laitekokoon-

panoon

Kuva 2 Hitachi CP-AW250NM

Tyoumltiloihin hankittiin 2000 mm x 1200 mm tussitaulut jotka toimivat laumlhiprojektorien

piirtoalueina sekauml vaihtoehtoisesti tussitauluina

5

Jokaiselle ryhmaumllle hankittiin 27-tuumaiset LG E2770V -malliset LED-naumlytoumlt Naumlmauml naumly-

toumlt on tarkoitettu vain koontiympaumlristoumln tarkkailua varten Ne kestaumlvaumlt pitkaumlkestoista

kaumlyttoumlauml ja voivat olla paumlaumlllauml youmltauml paumlivaumlauml ilman ettauml kuva palaa kiinni ruutuun Naumlytoumlt

on kiinnitetty seinaumlaumln kolmi-nivelisillauml Melicone Stile DR200 -mallisilla seinaumltelineillauml

joiden avulla naumlyttoumljen kaltevuutta ja sijaintia pystytaumlaumln saumlaumltaumlmaumlaumln

Ryhmille hankitut minitietokoneet (kuva 3) ovat kiinni yllauml esitetyissauml naumlytoumlissauml Minitie-

tokoneita hallitaan langattomalla hiirellauml sekauml naumlppaumlimistoumlllauml Perinteisen poumlytaumltietoko-

neen hankkimisen sijaan paumlaumldyttiin pienempaumlaumln vaihtoehtoon jotta tyoumlskentelytilaa

jaumlisi enemmaumln

Kuva 3 HP8200 USDT -minitietokone

Taumlrkeauml osa uutta laitekokoonpanoa on HDMI-valitsin (kuva 4) Valitsin on kytkettynauml

ryhmaumln laumlhiprojektoriin sekauml ryhmaumln jaumlsenten kaumlyttaumlmiin kannettaviin tietokoneisiin

Valitsimella on taumlrkeauml rooli ryhmien viikkopalavereissa ryhmaumln paumlivittaumlisessauml tyoumlsken-

telyssauml sekauml kehitysryhmaumln ja asiakkaan vaumllisissauml tapaamisissa Valitsin mahdollistaa

sujuvamman kommunikaation ryhmaumln jaumlsenten vaumllillauml Kurssiryhmien kehittaumljaumlt saavat

nappia painamalla oman kannettavan tietokoneensa naumlkymaumln laumlhiprojektoriin

6

Kuva 4 Kramer VS-81H HDMI -valitsin

222 Kurssin palvelimet

Kurssin ryhmaumlkohtaiset palvelimet kevaumlaumlllauml 2012 ovat koontipalvelin testi- ja tuotanto-

sovelluspalvelimet sekauml testi- ja tuotantotietokantapalvelimet (kuva 5) Testipalvelimet

toimivat ryhmaumln omana hiekkalaatikkona Kehitysympaumlristoumln palvelininfrastruktuuri

koostuu kokonaisuudessaan seuraavassa kuvassa esitellyistauml palvelimista

Kuva 5 Kehitysympaumlristoumln palvelininfrastruktuuri

7

Seuraavaksi kaumlydaumlaumln laumlpi palvelimet yksitellen Kerrotaan mitauml sovelluksia kuhunkin

palvelimeen on asennettu ja mitauml ovat kunkin palvelimen tehtaumlvaumlt

Palvelimista koontiympaumlristoumln (luvut 34 4) kannalta oleellisimmassa roolissa on koon-

tipalvelin Jokaisella ryhmaumlllauml on oma koontipalvelimensa jossa ajetaan Jenkins CI -

sovellusta Jenkins CI on vastuussa projektien automaattisesta koonnista ja haumllyttaumlauml

ryhmaumllle projektin koonnin epaumlonnistuessa Jenkins CIstauml kerrotaan lisaumlauml luvussa 4

Tuotanto- ja testipalvelimia on kaksi kappaletta jokaista ryhmaumlauml kohti Tuotantoympauml-

ristoumloumln kuuluvat tuotantosovelluspalvelin sekauml tuotantotietokantapalvelin Tuotantotie-

tokantapalvelin sisaumlltaumlauml ryhmaumlkohtaiset tietokannat Tuotantosovelluspalvelin sisaumlltaumlauml

ryhmaumlkohtaiset palvelut kuten Phpn ja Javan Vastaavasti testiympaumlristoumloumln kuuluvat

testisovelluspalvelin ja testitietokantapalvelin joilla on sama toiminnallisuus kuin tuo-

tantoympaumlristoumln palvelimilla

Ryhmien kaumlytoumlssauml oleva testiympaumlristouml mahdollistaa esimerkiksi palvelinkonfiguraatioi-

den riskittoumlmaumln testaamisen ennen muutosten kaumlyttoumloumlnottoa tuotantoympaumlristoumln puo-

lella Tuotanto -ja testipalvelimet ovat virtualisoituja Palvelimien virtualisointi mahdol-

listaa palvelimen tilan tallennuksen Palvelinten oletustilat (snapshot) voidaan halutessa

ladata muistista palvelimen korruptoituessa konfiguraatiotestaamisen yhteydessauml

Jokaisella ryhmaumlllauml on siis kaumlytoumlssaumlaumln viisi ryhmaumlkohtaista palvelinta koonti- tuotanto-

sovellus- tuotantotietokanta- testisovellus- sekauml testitietokantapalvelin Taumlmaumln lisaumlksi

ryhmillauml on kaumlytoumlssaumlaumln kolme yleiskaumlyttoumlistauml palvelinta joista kerrotaan seuraavaksi

Naumlmauml palvelimet ovat versionhallinta- projektinhallinta- sekauml varmuuskopiopalvelin

Versionhallintapalvelimella sijaitsevat ryhmien kaumlytoumlssauml olevat kaksi tietovarastoa Tois-

ta tietovarastoa kaumlytetaumlaumln laumlhdekoodin taltioimiseen ja toista tietovarastoa oheistuot-

teiden kuten dokumentaation taltioimiseen Opiskelijaryhmien tietovarastojen lisaumlksi

palvelimella on innodev-tietovarasto ympaumlristoumln yllaumlpitoa ja kehitystauml varten Kuvassa 6

on esitelty esimerkki eraumlaumln ohjelmistoprojektin tietovaraston hakemistorakenteesta

8

Kuva 6 Esimerkki opiskelijaryhmaumln tietovaraston hakemistorakenteesta

Projektinhallintapalvelin sisaumlltaumlauml Agilefant-sovelluksen josta ajetaan yhtauml instanssia

kullekin kurssin ryhmaumllle Agilefant on projektinhallintasovellus joka soveltuu hyvin

ketteraumln kehityksen tarpeisiin Sitauml kaumlytetaumlaumln ryhmaumln tyoumltuntien merkkaamiseen ja

projektin kehityksen valvomiseen Agilefantista kerrotaan tarkemmin luvussa 4

Kurssiryhmien kaumlytoumlssauml olevalle varmuuskopiopalvelimelle on tarkoitus kopioida var-

muuskopiota projektinhallinta- ja versionhallintapalvelimien tiloista Varmuuskopiointi ei

ole automatisoitua jonka takia palvelimen kaumlyttoumlmaumlaumlrauml on jaumlaumlnyt pieneksi

3 Ohjelmiston kokoaminen

Ohjelmiston kokoaminen tarkoittaa yksinkertaisimmillaan ohjelmistokoodin kaumlaumlntaumlmistauml

ajettavaan muotoon Jos ohjelmisto on iso ja sen rakenne on modulaarinen voi kehit-

taumljaumlllauml olla tarve jakaa ohjelmiston kokoaminen useisiin operaatioihin joilla on keskinaumli-

siauml riippuvuuksia

Taumlssauml luvussa tutustutaan eri tapoihin toteuttaa ohjelmiston koonti Ensin perehdytaumlaumln

makefileen ja tutustutaan ohjelmiston kokoamiseen makefile-esimerkkien avulla Tauml-

9

maumln jaumllkeen perehdytaumlaumln modernimpiin koontisovelluksiin Ant ja Maven Naumlmauml luvut

ovat tarpeellisia koontiprosessin ymmaumlrtaumlmisen kannalta

31 Makefile

Makefile on tiedosto jota Unix-komento Make kaumlyttaumlauml ohjelman kokoamiseen Makefile

kuvaa ohjelman laumlhdekooditiedostojen vaumlliset riippuvuudet ja sisaumlltaumlauml ohjeet ohjelmis-

ton kaumlaumlntaumlmiseen Kaumlaumlntaumlmisen lisaumlksi makefileen voi sisaumlllyttaumlauml mitauml vain Unix-

komentoja ja siitauml voi kaumlynnistaumlauml testejauml

Otetaan esimerkkitapaus jossa C-kieliseen ohjelmistoon kuuluu 3 tiedostoa

tiedosto1c

tiedosto2c

tiedosto1h

Ilman makefileauml ohjelma kaumlaumlnnettaumlisiin Unix-komentoriviltauml seuraavanlaisesti

gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Esimerkissauml ndashI optio kertoo kaumlaumlntaumljaumllle ettauml sen tulee etsiauml header-tiedostot tyoumlkansi-

osta Gcc-kaumlaumlntaumljauml kaumlaumlntaumlauml tiedostot ja luo sovellusohjelman rdquoesimerkkirdquo Taumlmauml laumlhes-

tymistapa ohjelmiston kaumlaumlntaumlmiseen tulee vaivalloiseksi viimeistaumlaumln siinauml vaiheessa

kun projektiin lisaumltaumlaumln tiedostoja kaumlaumlntaumlmiskomento muuttuu ja se on haettava ko-

mentorivihistoriasta tai kirjoitettava uudestaan Makefilen tekeminen ratkaisee taumlmaumln

ongelman [A Simple Makefile Tutorial]

Esimerkki makefilestauml naumlyttaumlauml taumlltauml

1 esimerkki tiedosto1c tiedosto2c

2 gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Jos yllauml olevat rivit kirjoitetaan rdquoMakefilerdquo- tai rdquomakefilerdquo-nimiseen tiedostoon ja kirjoi-

tetaan komentoriville rdquomakerdquo niin suoritetaan makefileen kirjoitettu komento (rivi 2)

Make ilman optioita suorittaa automaattisesti makefilen ensimmaumlisen kohteen (target)

joka taumlssauml tapauksessa on nimeltaumlaumln rdquoesimerkkirdquo Rivillauml 1 olevat tiedosto1c ja tiedos-

to2c kertoo makelle ettauml naumliden tiedostojen olemassaolo vaaditaan kohteen suoritta-

10

miseen Korostetaan ettauml make vaatii tabulaattorin kaumlytoumln ennen jokaista komentoa

(rivi 2) [A Simple Makefile Tutorial]

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 esimerkki tiedosto1o tiedosto2o

5 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

Edellisen esimerkin riveille 1 ja 2 on lisaumltty muuttujat rdquoKAANTAJArdquo ja rdquoOPTIOTrdquo Naumliden

muuttujien muuttaminen vaikuttaa koko tiedostoon ndash taumlssauml tapauksessa ainoastaan

riviin 5

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 all esimerkki

5

6 esimerkki tiedosto1o tiedosto2o

7 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

8

9 tiedosto1o tiedosto1c

10 gcc -c tiedosto1c

11 12 tiedosto2o tiedosto2c

13 gcc -c tiedosto2c

14 15 clean

16 rm -rf o esimerkki

Edellinen esimerkki koostuu viidestauml eri kohteesta

Ensimmaumlinen kohde rdquoallrdquo suoritetaan kun Make ajetaan ilman optioita Jotta rdquoallrdquo voi-

taisiin suorittaa pitaumlauml suorittaa ensin rdquoesimerkkirdquo (rivi 6) koska rdquoallrdquo on riippuvainen

kohteesta rdquoesimerkkirdquo

Seuraavaa kohdetta rdquoesimerkkirdquo ei voi kuitenkaan suorittaa ennen kuin Make on tar-

kastanut tiedostojen rdquotiedosto1ordquo ja rdquotiedosto2ordquo aikaleimat jos aikaleimat ovat van-

hentuneet eli tiedostot ovat muuttuneet on ajettava kohteet rdquotiedosto1ordquo sekauml rdquotie-

dosto2ordquo Naumlmauml kohteet ajettuaan voi Make siirtyauml suorittamaan kohdetta rdquoesimerkkirdquo

ja taumlmaumln jaumllkeen kohdetta rdquoallrdquo jolla ei ole toteutusta

11

Kohteella rdquocleanrdquo ei ole riippuvuuksia Taumlllaista kohdetta kutsutaan komentorivillauml ko-

mennolla rdquomake cleanrdquo Rivillauml 16 oleva komento poistaa kaikki tyoumlhakemistossa sijait-

sevat rdquoordquo-paumlaumltteiset tiedostot sekauml sovellusohjelman rdquoesimerkkirdquo

Viimeisin makefile-esimerkki on yksinkertainen ohjelmiston koonti vaikka se vaikuttaa

pelkaumlstaumlaumln ohjelman kaumlaumlntaumlmiseltauml Jos yllauml olevaa esimerkkiauml haluttaisiin kehittaumlauml li-

saumlauml voitaisiin siihen lisaumltauml esimerkiksi kohde joka hakee laumlhdekoodin tietovarastosta ja

poistaa paikalliset laumlhdekoodit kovalevyltauml ohjelman kaumlaumlntaumlmisen jaumllkeen

32 Ant

Luvussa 31 tutustuttiin makefileen joka on Maken koontikuvaustiedosto Taumlssauml luvus-

sa perehdytaumlaumln koontityoumlkalu Antin kaumlyttaumlmaumlaumln Xml-muotoiseen koontikuvaukseen

Apache Ant on Java kirjasto- ja komentorivityoumlkalu jonka tehtaumlvaumlnauml on ajaa prosesseja

jotka on kuvattu koontitiedostoissa rdquokohteinardquo joilla on keskinaumlisiauml riippuvaisuuksia

Ant on paumlaumlasiallisesti Java-sovellusten koontisovellus mutta sitauml voidaan kaumlyttaumlauml myoumls

C -ja C++ -ohjelmistojen kokoamiseen Taumlssauml luvussa on esimerkki Java-ohjelmiston

koonnista

Antin kaumlyttaumljaumlt voivat kehittaumlauml omia rdquoantlibsrdquo-kirjastoja joihin sisaumlltyy omia tehtaumlviauml

(tasks) ja tyyppejauml (types) Kaumlyttaumljille tarjotaan myoumls suuri maumlaumlrauml valmiiksi tehtyjauml

kaupallisia tai avoimia rdquoantlibsrdquo kirjastoja [Apache Ant Welcome]

Ant-koontitiedosto koostuu neljaumlstauml eri elementistauml projects targets tasks ja proper-

ties

Koontitiedostossa kuvatulla projektilla on kolme attribuuttia name default sekauml base-

dir Name kuvaa projektin nimeauml ja eikauml sitauml ole pakko maumlaumlritellauml Default kuvaa koon-

titiedoston oletuskohdetta (default target) jota kutsutaan kun kohdetta ei erikseen

anneta kokoamiskomennossa Basedir maumlaumlrittelee projektin tyoumlhakemiston jota kaumlyte-

taumlaumln hakemistopolkujen selvittaumlmiseksi Taumlmaumlkaumlaumln attribuutti ei ole pakollinen Jos

basedir-atribuuttia ei maumlaumlritellauml kaumlytetaumlaumln tyoumlhakemistona samaa hakemistoa jossa

koontitiedosto sijaitsee

12

Kohteilla (targets) on riippuvuuksia muista kohteista Kuten makefilessauml voidaan koh-

teiden vaumllille rakentaa riippuvuuksia ja luoda ohjelmiston kokoamisen kannalta jaumlrkevauml

riippuvaisuuksien verkosto

Tehtaumlvaumlt (tasks) ovat suoritettavia koodirivejauml Tehtaumlvillauml voi olla useita attribuutteja

kuten tulevasta esimerkissauml naumlhdaumlaumln

Ominaisuuksilla (properties) voidaan antaa oikoteitauml (shortcuts) komentoihin tai merk-

kijonoihin joita kaumlytetaumlaumln usein koontitiedostossa Ominaisuudella on nimi- sekauml arvo-

attribuutti [Apache Ant Using Apache Ant]

1 ltproject name=MyProject default=dist basedir=gt

2 ltdescriptiongt

3 Yksinkertainen koontikuvaustiedosto

4 ltdescriptiongt

5 lt--Asetetaan julkiset ominaisuudet --gt

6 ltproperty name=src location=srcgt

7 ltproperty name=build location=buildgt

8 ltproperty name=dist location=distgt

9

10 lttarget name=initgt

11 ltmdashLuodaan aikaleima --gt

12 lttstampgt

13 ltmdashLuodaan hakemistorakenne ldquocompilerdquo tehtaumlvaumllle --gt

14 ltmkdir dir=$buildgt

15 lttargetgt

16 17 lttarget name=compile depends=initgt

18 lt--Kaumlaumlnnetaumlaumln Java-koodi $srcstauml into $buildiin --gt

19 ltjavac srcdir=$src destdir=$buildgt

20 lttargetgt

21 22 lttarget name=dist depends=compile

23 description=Generoidaan distribuutio gt

24 lt--Luodaan distribuutio kansio --gt

25 ltmkdir dir=$distlibgt

26 27 lt-- Laitetaan $build sisaumlltouml MyProject-$DSTAMPjarriin --gt

28 ltjar jarfile=$distlibMyProject $DSTAMPjar basedir=$buildgt

29 lttargetgt

30 31 lttarget name=clean

32 description=clean up gt

33 ltmdashPoistetaan $build ja $dist hakemistot --gt

34 ltdelete dir=$buildgt

13

35 ltdelete dir=$distgt

36 lttargetgt

37 ltprojectgt

[Apache Ant Using Apache Ant Example Buildfile]

Edelliseen koontikuvaukseen on maumlaumlritelty projekti jonka nimi on ldquoMyProjectrdquo Kun

tutustutaan koonnin kuvaukseen huomataan ettauml koontitiedoston projektin oletuskoh-

teella rdquodistrdquo on riippuvuus kohteeseen rdquocompilerdquo jolla on riippuvuus kohteeseen rdquoinitrdquo

Initillauml ei ole riippuvaisuuksia Taumlten ensimmaumlinen koonnin yhteydessauml ajettava kohde

onkin rdquoinitrdquo eikauml rdquodistrdquo vaikka rdquodistrdquo on koontikuvauksen oletuskohde Voidaan sanoa

ettauml koonnin paumlaumlmaumlaumlrauml on suorittaa kohde rdquodistrdquo ja paumlaumlmaumlaumlraumln saavuttamiseksi on

suoritettava kohteita joista taumlmauml on riippuvainen Riippuvuudet toimivat samalla peri-

aatteella kuin aikaisemmissa makefile-esimerkeissauml

Ohjelmiston kokoamisen yhteydessauml halutaan edellisessauml esimerkissauml saada ohjelmisto

jakeluun Jotta ohjelmisto saataisiin jakeluun on se ensin kaumlaumlnnettaumlvauml ja sitauml ennen on

luotava ohjelmiston hakemistorakenne

Jos halutaan kehittaumlauml esimerkin koontikuvausta voidaan esimerkiksi suorittaa verk-

kosivujen paumlivitystehtaumlvauml yhden kohteen sisaumlllauml ja asettaa se riippuvaiseksi kohteesta

rdquodistrdquo Naumlin ohjelmasta saadaan paumlivitetty versio jakeluun ja verkkosivuille tulee taumlstauml

automaattinen ilmoitus ohjelmiston kaumlyttaumljille

33 Maven

Luvussa 32 tutustuttiin Anttiin joka on natiivi koontityoumlkalu Seuraavaksi tutustutaan

koonti- ja projektinhallintasovellukseen Maveniin jolla voidaan kuvata koontiprosessin

lisaumlksi myoumls projektin rakenne Maven rohkaisee kaumlyttaumlmaumlaumln parhaita kaumlytaumlntoumljauml (best

practises) joita kaumlyttaumlmaumlllauml ohjelmistoprojektista toiseen siirtyessauml oppimiskynnys

uuden koontikuvauksen ymmaumlrtaumlmiseen pienenee [Maven vs Ant or Ant vs Maven]

Maven on kaumlytoumlssauml Metropolian Ohjelmistotuotantoprojekti-kurssin ohjelmistoprojekti-

en koontityoumlkaluna

Apache Maven on ohjelmistoprojektin hallintatyoumlkalu Se perustuu projekti-olio-malli -

konseptiin (Project Object Model POM) Maven kykenee kokoamaan projektin testaa-

14

maan projektin antamaan kaumlyttaumljaumllle palautetta dokumentoimaan kokoamisen ja te-

kemaumlaumln useita muita tehtaumlviauml erillisillauml Mavenin tarjoamilla lisaumlosilla (plug-ins) [Apache

Maven Project Welcome to Apache Maven]

POM on XML-tiedosto joka sisaumlltaumlauml informaatiota projektista ja yksityiskohtaisen konfi-

guraation jota Maven kaumlyttaumlauml projektin kokoamiseen POM kostuu kohteista (goals)

jotka on maumlaumlritelty pomxml -tiedostossa Kun suoritetaan erillinen tehtaumlvauml tai kohde

Maven etsii POMmia tyoumlhakemistosta lukee POMmin hakee tarvittavan konfiguraati-

on ja suorittaa kohteen

Eraumlitauml POMissa maumlaumlriteltaumlviauml konfiguraatioita ovat projektin riippuvuudet kaumlytettaumlvaumlt

lisaumlosat ajettavat kohteet ja koontiprofiilit POMiin voi maumlaumlritellauml muutakin tietoa ku-

ten projektin version kehittaumljaumlt ja postituslistat [Apache Maven Project Introduction

to the POM]

Maven on Java-tyoumlkalu joten Java taumlytyy olla asennettuna Mavenia ajavalle koneelle

Taumlmauml luku perustuu Apachen verkkosivuilla sijaitsevaan Mavenin kaumlyttoumlohjeeseen

[Apache Maven Project Maven in 5 Minutes] Seuraavaksi luetellaan eri vaiheet Ma-

ven-projektin luomiseksi

Ensin on ladattava Maven ja kaumlytaumlvauml laumlpi asennusohjeet jotka loumlytyvaumlt osoitteesta

[httpmavenapacheorgdownloadhtmlInstallation] Taumlmaumln jaumllkeen on avattava

terminaali tai komentokehote ja kirjoitettava

mvn --version

Taumlmaumln tulostaa asennetun Mavenin ja Javan versio Esimerkiksi

1 Apache Maven 303 (r1075438 2011-02-28 183109+0100)

2 Maven home Dapache-maven-303bin

3 Java version 160_25 vendor Sun Microsystems Inc

4 Java home EProgram FilesJavajdk160_25jre

5 Default locale nl_NL platform encoding Cp1252

6 OS name windows 7 version 61 arch amd64 family windows

Maven-projekti luodaan ajamalla terminaalissa Maven kohde (goal)

15

mvn archetypegenerate -DgroupId=commycompanyapp -DartifactId=my-app -

DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Ensimmaumlisellauml ajolla taumlmauml komento lataa tarvittavat Maven lisaumlosat ja muita tiedostoja

paikalliseen tietovarastoon Huomataan ettauml rdquogeneraterdquo kohde loi rdquoartifactIdrdquonauml anne-

tun hakemiston

Kirjoitetaan komentoriville

cd my-app

Taumlmaumln kansion alta loumlytyy Mavenin standardi projektirakenne

my-app

|-- pomxml

`-- src

|-- main

| `-- java

| `-- com

| `-- mycompany

| `-- app

| `-- Appjava

`-- test

`-- java

`-- com

`-- mycompany

`-- app

`-- AppTestjava

Yllauml kuvatussa hakemistorakenteessa oleva rdquosrcmainjavardquo-hakemisto sisaumlltaumlauml projek-

tin laumlhdekoodin Vastaavasti rdquosrctestjavardquo-hakemisto sisaumlltaumlauml testien laumlhdekoodin

Pomxml-tiedosto kuvaa projektin konfiguraatiota ja sisaumlltaumlauml projektin kokoamisohjeet

Esimerkkiprojektin POM naumlyttaumlauml taumlltauml

1 ltpro-

ject xmlns=httpmavenapacheorgPOM400 xmlnsxsi=httpwwww3org20

01XMLSchema-instance

2 xsischemaLocation=httpmavenapacheorgPOM400 httpmavenapacheorg

xsdmaven-400xsdgt

3 ltmodelVersiongt400ltmodelVersiongt

4

5 ltgroupIdgtcommycompanyappltgroupIdgt

6 ltartifactIdgtmy-appltartifactIdgt

16

7 ltversiongt10-SNAPSHOTltversiongt

8 ltpackaginggtjarltpackaginggt

9

10 ltnamegtMaven Quick Start Archetypeltnamegt

11 lturlgthttpmavenapacheorglturlgt

12 13 ltdependenciesgt

14 ltdependencygt

15 ltgroupIdgtjunitltgroupIdgt

16 ltartifactIdgtjunitltartifactIdgt

17 ltversiongt482ltversiongt

18 ltscopegttestltscopegt

19 ltdependencygt

20 ltdependenciesgt

21 ltprojectgt

POM-tiedosto on Maven-projektin konfiguraation ydin Se sisaumlltaumlauml suurimman osan

informaatiosta joka vaaditaan projektin kokoamiseen halutulla tavalla

Aikaisemmassa esimerkissauml ajettiin Mavenin kohde (goal) archetypegenerate ja an-

nettiin sille parametreja Etuliite archetype on lisaumlosa joka sisaumlltaumlauml kohteen generate

Taumltauml voi verrata Antin tehtaumlvaumlaumln Taumlmauml kohde loi yksinkertaisen projektin joka perus-

tuu arkkityyppiin Yleisesti Mavenin lisaumlosat koostuvat kohteista joilla on yhteinen paumlauml-

tarkoitus Esimerkki taumlllaisesta lisaumlosasta on jboss-maven-plugin jonka tehtaumlvaumlnauml on

kaumlsitellauml erinaumlisiauml Jboss-komponentteja (items)

Maven-projekti kootaan komentoriviltauml seuraavanlaisesti

mvn package

Komentorivi tulostaa eri komentoja tulostus loppuu seuraavanlaisesti

[INFO] --------------------------

[INFO] BUILD SUCCESSFUL

[INFO] --------------------------

[INFO] Total time 2 seconds

[INFO] Finished at Thu Jul 07 213452 CEST 2011

[INFO] Final Memory 3M6M

[INFO] --------------------------

Toisin kuin ensimmaumliseksi suoritetussa komennossa (archetypegenerate) huomataan

taumlllauml kertaa kaumlytetty komento package on vain yksi sana Taumlllaista komentoa kutsutaan

17

kohteen (goal) sijaan vaiheeksi (phase) Vaihe on yksi askel koonnin elinkaaressa

(build lifecycle) joka on jaumlrjestetty sarja eri vaiheita Jos esimerkiksi ajetaan vaiheen

compile Maven itseasiassa suorittaa sarjan vaiheita

1 validate

2 generate-sources

3 process-sources

4 generate-resources

5 process-resources

6 compile

Compilen ajamisen jaumllkeen voidaan testata kaumlaumlnnettyauml JARia seuraavalla komennolla

java -cp targetmy-app-10-SNAPSHOTjar commycompanyappApp

Taumlmauml komento tulostaa

Hello World

Kaumlydaumlaumln laumlpi vielauml eri Mavenin yleisimmaumlt oletuselinkaaressa kaumlytetyt vaiheet Naumlitauml

ovat

-validate varmistaa ettauml projekti on ehjauml ja kaikki tarvittava tieto on saatavilla

-compile kaumlaumlntaumlauml projektin laumlhdekoodin

-test testaa kaumlaumlnnetyn laumlhdekoodin kaumlyttaumlen sopivaa yksikkoumltestikehystauml Naumliden

testien ei tulisi vaatia vaiheita package tai deploy

-package paketoi kaumlaumlnnetyn koodin sen jaettavaan muotoon esimerkiksi JARriksi

-integration-test prosessoi ja jaumlrjestaumlauml paketin ympaumlristoumloumln jossa integraatiotestejauml

voidaan ajaa jos tarpeellista

-verify tarkistaa onko paketti validi ja taumlyttaumlaumlkouml se laatukriteerit

-install asentaa paketin paikalliseen tietovarastoon muiden paikallisten projektien

kaumlyttoumloumln tai paikallisten projektien riippuvuudeksi

-deploy kopioi lopullisen paketin ulkoiseen tietovarastoon jaettavaksi muille kehittaumljil-

le ja projekteille Tehdaumlaumln integraatio- tai julkaisuympaumlristoumlssauml

On vielauml kaksi muuta mainitsemisen arvoista Maven-elinkaarta jotka eivaumlt sisaumllly yllauml

listattuun oletuselinkaareen Naumlitauml ovat

18

-clean poistaa aikaisempien koontien yhteydessauml luodut artifaktit

-site generoi verkkodokumentaation kyseiselle projektille

Jokainen vaihe sisaumlltaumlauml sarjan suoritettavia kohteita joiden ajaminen riippuu projektin

paketointityypistauml Jos projektin tyyppi on JAR niin package ajaa kohteen jarjar Vas-

taavasti WAR -tyyppisen projektin package -vaihe suorittaa kohteen warwar

34 Koonti ja kaumlyttoumloumlnotto

Ohjelmiston saattamista laumlhdekoodista loppukaumlyttaumljaumllle kaumlyttoumlkelpoiseen muotoon kut-

sutaan koonniksi Laumlhdekoodin kaumlaumlntaumlmisen lisaumlksi koonti voi sisaumlltaumlauml monia muita vai-

heita Aleksi Lukkarinen on opinnaumlytetyoumlssaumlaumln listannut esimerkkejauml erilaisista koon-

neista seuraavasti [Aleksi Lukkarinen opinnaumlytetyouml]

-ohjelmointikielisen laumlhdekoodin sekauml resurssien automatisoitua luomista

-eri ohjelmointikielillauml tuotetun laumlhdekoodin kaumlaumlntaumlmistauml kone- jatai vaumllikielille

-vaumlli- tai konekielisen ohjelmakoodin jaumllkikaumlsittelyauml esimerkiksi testauksen aspektioh-

jelmoinnin tai koodin tarkoituksellisen sotkemisen vuoksi

-sovelluksen testausta (esimerkiksi toimivuus tietoturvallisuus suorituskyky rakenteel-

linen ja koodaustekninen laatu sekauml kaumlyttoumltarkoitustaan vastaavuus)

-dokumentaation koontia (kuten varsinaisen sovelluksen koonti)

-koontituotteiden paketointia sekauml mahdollisten fyysisten jakelumedioiden luontia toi-

mivuus- ja virustarkistuksineen

-ohjelmistomoduulien integrointia

-palautteen antamista koonnin tuloksista

Lukkarinen jaumlsentelee opinnaumlytetyoumlssaumlaumln sovelluksen jakeluun ja kaumlyttoumloumlnottoon sisaumll-

tyviksi asioiksi

-Sovellusta suorittavien ja tukevien palvelinympaumlristoumljen luominen ja paumlivittaumlminen

-Sovelluksen sekauml sen kaumlyttaumlmien ohjelmistokomponenttien siirtaumlminen ja maumlaumlrittaumlmi-

nen esimerkiksi testaus- laadunvarmistus- esittely-koulutus- sekauml tuotantoympaumlris-

toumlihin Kohdeympaumlristoumlissauml olevat vanhat versiot on mahdollisesti paumlivitettaumlvauml jollei

uusia versiota asenneta niiden rinnalle

19

-Uusien tietokantojen luominen sekauml vanhojen paumlivittaumlminen uutta sovellusversiota

vastaaviksi

-Kirjanpidollisen materiaalin tuottaminen ja yllaumlpitaumlminen

-Palautteen antaminen jakelu- ja kaumlyttoumloumlnottoprosessin onnistumisesta

Taumlmaumln luvun tarkoitus oli perehdyttaumlauml lukija ymmaumlrtaumlmaumlaumln koontiprosessia koontiku-

vaus-esimerkkien avulla Koontiprosessin ymmaumlrtaumlminen on vaumllttaumlmaumltoumlntauml seuraavan

luvun ymmaumlrtaumlmiseen jossa perehdytaumlaumln koontiympaumlristouml -kaumlsitteeseen

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant

Taumlssauml luvussa luodaan nopea katsaus koonti- ja kaumlyttoumloumlnottoprosessien automatisoimi-

seen tutustutaan jatkuvaan integraatioon sekauml sovellukseen Jenkins CI

Lisaumlksi tutustutaan projektihallintaohjelmaan Agilefant Agilefant on yksi monipuoli-

simmista kevyistauml vapaan laumlhdekoodin projektinhallintasovelluksista ja se soveltuu

niin pieniin kuin suuriinkin projekteihin

Naumlmauml sovellukset esitellaumlaumln pohjustuksena lukuja 5 ja 6 varten joissa tutustutaan

koontiympaumlristoumln tarkkailuun

41 Jatkuva integraatio

Jatkuva integraatio (Continuous Integration CI) on modernin sovelluskehityksen kul-

makivi Itse asiassa se on mullistanut sovelluskehityksen Kun jatkuva integraatio ote-

taan kaumlyttoumloumln organisaatiossa se muuttaa radikaalisti sitauml miten tyoumlryhmauml ymmaumlrtaumlauml

koko kehitysprosessin Jatkuvalla integraatiolla on potentiaalia laukaista sarja paran-

nuksia organisaation tuotteen kehitysprosessiin Se alkaa yksinkertaisesta automaatti-

sesta koonnista kehittyen systeemiksi joka automaattisesti saattaa tuotteen tuotan-

toon Hyvauml CI-infrastruktuuri mahdollistaa virheiden helpon sekauml nopean huomaamisen

ja tarjoaa kojelaudan projektin hyvinvoinnin ja muiden statistiikkojen seuraamiseen

sekauml kehittaumljille ettauml muille projektin osapuolille Jenkins The Definite Guiden mukaan

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 10: Joakim Sandqvist - Theseus

4

Kuva 1 Yhden ryhmaumln tyoumltila

Yksi oleellisimmista uusista laitehankinnoista on laumlhiprojektori (kuva 2) Jokaisella kurs-

sin ryhmaumlllauml on kaumlytoumlssaumlaumln yksi laumlhiprojektori Toisin kuin perinteinen projektori laumlhi-

projektori saadaan asetettua seinaumllle suoraan projektorointikohteen ylaumlpuolelle Taumlten

se vie vaumlhemmaumln tilaa kuin normaali projektori ja oli hyvauml valinta uuteen laitekokoon-

panoon

Kuva 2 Hitachi CP-AW250NM

Tyoumltiloihin hankittiin 2000 mm x 1200 mm tussitaulut jotka toimivat laumlhiprojektorien

piirtoalueina sekauml vaihtoehtoisesti tussitauluina

5

Jokaiselle ryhmaumllle hankittiin 27-tuumaiset LG E2770V -malliset LED-naumlytoumlt Naumlmauml naumly-

toumlt on tarkoitettu vain koontiympaumlristoumln tarkkailua varten Ne kestaumlvaumlt pitkaumlkestoista

kaumlyttoumlauml ja voivat olla paumlaumlllauml youmltauml paumlivaumlauml ilman ettauml kuva palaa kiinni ruutuun Naumlytoumlt

on kiinnitetty seinaumlaumln kolmi-nivelisillauml Melicone Stile DR200 -mallisilla seinaumltelineillauml

joiden avulla naumlyttoumljen kaltevuutta ja sijaintia pystytaumlaumln saumlaumltaumlmaumlaumln

Ryhmille hankitut minitietokoneet (kuva 3) ovat kiinni yllauml esitetyissauml naumlytoumlissauml Minitie-

tokoneita hallitaan langattomalla hiirellauml sekauml naumlppaumlimistoumlllauml Perinteisen poumlytaumltietoko-

neen hankkimisen sijaan paumlaumldyttiin pienempaumlaumln vaihtoehtoon jotta tyoumlskentelytilaa

jaumlisi enemmaumln

Kuva 3 HP8200 USDT -minitietokone

Taumlrkeauml osa uutta laitekokoonpanoa on HDMI-valitsin (kuva 4) Valitsin on kytkettynauml

ryhmaumln laumlhiprojektoriin sekauml ryhmaumln jaumlsenten kaumlyttaumlmiin kannettaviin tietokoneisiin

Valitsimella on taumlrkeauml rooli ryhmien viikkopalavereissa ryhmaumln paumlivittaumlisessauml tyoumlsken-

telyssauml sekauml kehitysryhmaumln ja asiakkaan vaumllisissauml tapaamisissa Valitsin mahdollistaa

sujuvamman kommunikaation ryhmaumln jaumlsenten vaumllillauml Kurssiryhmien kehittaumljaumlt saavat

nappia painamalla oman kannettavan tietokoneensa naumlkymaumln laumlhiprojektoriin

6

Kuva 4 Kramer VS-81H HDMI -valitsin

222 Kurssin palvelimet

Kurssin ryhmaumlkohtaiset palvelimet kevaumlaumlllauml 2012 ovat koontipalvelin testi- ja tuotanto-

sovelluspalvelimet sekauml testi- ja tuotantotietokantapalvelimet (kuva 5) Testipalvelimet

toimivat ryhmaumln omana hiekkalaatikkona Kehitysympaumlristoumln palvelininfrastruktuuri

koostuu kokonaisuudessaan seuraavassa kuvassa esitellyistauml palvelimista

Kuva 5 Kehitysympaumlristoumln palvelininfrastruktuuri

7

Seuraavaksi kaumlydaumlaumln laumlpi palvelimet yksitellen Kerrotaan mitauml sovelluksia kuhunkin

palvelimeen on asennettu ja mitauml ovat kunkin palvelimen tehtaumlvaumlt

Palvelimista koontiympaumlristoumln (luvut 34 4) kannalta oleellisimmassa roolissa on koon-

tipalvelin Jokaisella ryhmaumlllauml on oma koontipalvelimensa jossa ajetaan Jenkins CI -

sovellusta Jenkins CI on vastuussa projektien automaattisesta koonnista ja haumllyttaumlauml

ryhmaumllle projektin koonnin epaumlonnistuessa Jenkins CIstauml kerrotaan lisaumlauml luvussa 4

Tuotanto- ja testipalvelimia on kaksi kappaletta jokaista ryhmaumlauml kohti Tuotantoympauml-

ristoumloumln kuuluvat tuotantosovelluspalvelin sekauml tuotantotietokantapalvelin Tuotantotie-

tokantapalvelin sisaumlltaumlauml ryhmaumlkohtaiset tietokannat Tuotantosovelluspalvelin sisaumlltaumlauml

ryhmaumlkohtaiset palvelut kuten Phpn ja Javan Vastaavasti testiympaumlristoumloumln kuuluvat

testisovelluspalvelin ja testitietokantapalvelin joilla on sama toiminnallisuus kuin tuo-

tantoympaumlristoumln palvelimilla

Ryhmien kaumlytoumlssauml oleva testiympaumlristouml mahdollistaa esimerkiksi palvelinkonfiguraatioi-

den riskittoumlmaumln testaamisen ennen muutosten kaumlyttoumloumlnottoa tuotantoympaumlristoumln puo-

lella Tuotanto -ja testipalvelimet ovat virtualisoituja Palvelimien virtualisointi mahdol-

listaa palvelimen tilan tallennuksen Palvelinten oletustilat (snapshot) voidaan halutessa

ladata muistista palvelimen korruptoituessa konfiguraatiotestaamisen yhteydessauml

Jokaisella ryhmaumlllauml on siis kaumlytoumlssaumlaumln viisi ryhmaumlkohtaista palvelinta koonti- tuotanto-

sovellus- tuotantotietokanta- testisovellus- sekauml testitietokantapalvelin Taumlmaumln lisaumlksi

ryhmillauml on kaumlytoumlssaumlaumln kolme yleiskaumlyttoumlistauml palvelinta joista kerrotaan seuraavaksi

Naumlmauml palvelimet ovat versionhallinta- projektinhallinta- sekauml varmuuskopiopalvelin

Versionhallintapalvelimella sijaitsevat ryhmien kaumlytoumlssauml olevat kaksi tietovarastoa Tois-

ta tietovarastoa kaumlytetaumlaumln laumlhdekoodin taltioimiseen ja toista tietovarastoa oheistuot-

teiden kuten dokumentaation taltioimiseen Opiskelijaryhmien tietovarastojen lisaumlksi

palvelimella on innodev-tietovarasto ympaumlristoumln yllaumlpitoa ja kehitystauml varten Kuvassa 6

on esitelty esimerkki eraumlaumln ohjelmistoprojektin tietovaraston hakemistorakenteesta

8

Kuva 6 Esimerkki opiskelijaryhmaumln tietovaraston hakemistorakenteesta

Projektinhallintapalvelin sisaumlltaumlauml Agilefant-sovelluksen josta ajetaan yhtauml instanssia

kullekin kurssin ryhmaumllle Agilefant on projektinhallintasovellus joka soveltuu hyvin

ketteraumln kehityksen tarpeisiin Sitauml kaumlytetaumlaumln ryhmaumln tyoumltuntien merkkaamiseen ja

projektin kehityksen valvomiseen Agilefantista kerrotaan tarkemmin luvussa 4

Kurssiryhmien kaumlytoumlssauml olevalle varmuuskopiopalvelimelle on tarkoitus kopioida var-

muuskopiota projektinhallinta- ja versionhallintapalvelimien tiloista Varmuuskopiointi ei

ole automatisoitua jonka takia palvelimen kaumlyttoumlmaumlaumlrauml on jaumlaumlnyt pieneksi

3 Ohjelmiston kokoaminen

Ohjelmiston kokoaminen tarkoittaa yksinkertaisimmillaan ohjelmistokoodin kaumlaumlntaumlmistauml

ajettavaan muotoon Jos ohjelmisto on iso ja sen rakenne on modulaarinen voi kehit-

taumljaumlllauml olla tarve jakaa ohjelmiston kokoaminen useisiin operaatioihin joilla on keskinaumli-

siauml riippuvuuksia

Taumlssauml luvussa tutustutaan eri tapoihin toteuttaa ohjelmiston koonti Ensin perehdytaumlaumln

makefileen ja tutustutaan ohjelmiston kokoamiseen makefile-esimerkkien avulla Tauml-

9

maumln jaumllkeen perehdytaumlaumln modernimpiin koontisovelluksiin Ant ja Maven Naumlmauml luvut

ovat tarpeellisia koontiprosessin ymmaumlrtaumlmisen kannalta

31 Makefile

Makefile on tiedosto jota Unix-komento Make kaumlyttaumlauml ohjelman kokoamiseen Makefile

kuvaa ohjelman laumlhdekooditiedostojen vaumlliset riippuvuudet ja sisaumlltaumlauml ohjeet ohjelmis-

ton kaumlaumlntaumlmiseen Kaumlaumlntaumlmisen lisaumlksi makefileen voi sisaumlllyttaumlauml mitauml vain Unix-

komentoja ja siitauml voi kaumlynnistaumlauml testejauml

Otetaan esimerkkitapaus jossa C-kieliseen ohjelmistoon kuuluu 3 tiedostoa

tiedosto1c

tiedosto2c

tiedosto1h

Ilman makefileauml ohjelma kaumlaumlnnettaumlisiin Unix-komentoriviltauml seuraavanlaisesti

gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Esimerkissauml ndashI optio kertoo kaumlaumlntaumljaumllle ettauml sen tulee etsiauml header-tiedostot tyoumlkansi-

osta Gcc-kaumlaumlntaumljauml kaumlaumlntaumlauml tiedostot ja luo sovellusohjelman rdquoesimerkkirdquo Taumlmauml laumlhes-

tymistapa ohjelmiston kaumlaumlntaumlmiseen tulee vaivalloiseksi viimeistaumlaumln siinauml vaiheessa

kun projektiin lisaumltaumlaumln tiedostoja kaumlaumlntaumlmiskomento muuttuu ja se on haettava ko-

mentorivihistoriasta tai kirjoitettava uudestaan Makefilen tekeminen ratkaisee taumlmaumln

ongelman [A Simple Makefile Tutorial]

Esimerkki makefilestauml naumlyttaumlauml taumlltauml

1 esimerkki tiedosto1c tiedosto2c

2 gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Jos yllauml olevat rivit kirjoitetaan rdquoMakefilerdquo- tai rdquomakefilerdquo-nimiseen tiedostoon ja kirjoi-

tetaan komentoriville rdquomakerdquo niin suoritetaan makefileen kirjoitettu komento (rivi 2)

Make ilman optioita suorittaa automaattisesti makefilen ensimmaumlisen kohteen (target)

joka taumlssauml tapauksessa on nimeltaumlaumln rdquoesimerkkirdquo Rivillauml 1 olevat tiedosto1c ja tiedos-

to2c kertoo makelle ettauml naumliden tiedostojen olemassaolo vaaditaan kohteen suoritta-

10

miseen Korostetaan ettauml make vaatii tabulaattorin kaumlytoumln ennen jokaista komentoa

(rivi 2) [A Simple Makefile Tutorial]

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 esimerkki tiedosto1o tiedosto2o

5 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

Edellisen esimerkin riveille 1 ja 2 on lisaumltty muuttujat rdquoKAANTAJArdquo ja rdquoOPTIOTrdquo Naumliden

muuttujien muuttaminen vaikuttaa koko tiedostoon ndash taumlssauml tapauksessa ainoastaan

riviin 5

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 all esimerkki

5

6 esimerkki tiedosto1o tiedosto2o

7 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

8

9 tiedosto1o tiedosto1c

10 gcc -c tiedosto1c

11 12 tiedosto2o tiedosto2c

13 gcc -c tiedosto2c

14 15 clean

16 rm -rf o esimerkki

Edellinen esimerkki koostuu viidestauml eri kohteesta

Ensimmaumlinen kohde rdquoallrdquo suoritetaan kun Make ajetaan ilman optioita Jotta rdquoallrdquo voi-

taisiin suorittaa pitaumlauml suorittaa ensin rdquoesimerkkirdquo (rivi 6) koska rdquoallrdquo on riippuvainen

kohteesta rdquoesimerkkirdquo

Seuraavaa kohdetta rdquoesimerkkirdquo ei voi kuitenkaan suorittaa ennen kuin Make on tar-

kastanut tiedostojen rdquotiedosto1ordquo ja rdquotiedosto2ordquo aikaleimat jos aikaleimat ovat van-

hentuneet eli tiedostot ovat muuttuneet on ajettava kohteet rdquotiedosto1ordquo sekauml rdquotie-

dosto2ordquo Naumlmauml kohteet ajettuaan voi Make siirtyauml suorittamaan kohdetta rdquoesimerkkirdquo

ja taumlmaumln jaumllkeen kohdetta rdquoallrdquo jolla ei ole toteutusta

11

Kohteella rdquocleanrdquo ei ole riippuvuuksia Taumlllaista kohdetta kutsutaan komentorivillauml ko-

mennolla rdquomake cleanrdquo Rivillauml 16 oleva komento poistaa kaikki tyoumlhakemistossa sijait-

sevat rdquoordquo-paumlaumltteiset tiedostot sekauml sovellusohjelman rdquoesimerkkirdquo

Viimeisin makefile-esimerkki on yksinkertainen ohjelmiston koonti vaikka se vaikuttaa

pelkaumlstaumlaumln ohjelman kaumlaumlntaumlmiseltauml Jos yllauml olevaa esimerkkiauml haluttaisiin kehittaumlauml li-

saumlauml voitaisiin siihen lisaumltauml esimerkiksi kohde joka hakee laumlhdekoodin tietovarastosta ja

poistaa paikalliset laumlhdekoodit kovalevyltauml ohjelman kaumlaumlntaumlmisen jaumllkeen

32 Ant

Luvussa 31 tutustuttiin makefileen joka on Maken koontikuvaustiedosto Taumlssauml luvus-

sa perehdytaumlaumln koontityoumlkalu Antin kaumlyttaumlmaumlaumln Xml-muotoiseen koontikuvaukseen

Apache Ant on Java kirjasto- ja komentorivityoumlkalu jonka tehtaumlvaumlnauml on ajaa prosesseja

jotka on kuvattu koontitiedostoissa rdquokohteinardquo joilla on keskinaumlisiauml riippuvaisuuksia

Ant on paumlaumlasiallisesti Java-sovellusten koontisovellus mutta sitauml voidaan kaumlyttaumlauml myoumls

C -ja C++ -ohjelmistojen kokoamiseen Taumlssauml luvussa on esimerkki Java-ohjelmiston

koonnista

Antin kaumlyttaumljaumlt voivat kehittaumlauml omia rdquoantlibsrdquo-kirjastoja joihin sisaumlltyy omia tehtaumlviauml

(tasks) ja tyyppejauml (types) Kaumlyttaumljille tarjotaan myoumls suuri maumlaumlrauml valmiiksi tehtyjauml

kaupallisia tai avoimia rdquoantlibsrdquo kirjastoja [Apache Ant Welcome]

Ant-koontitiedosto koostuu neljaumlstauml eri elementistauml projects targets tasks ja proper-

ties

Koontitiedostossa kuvatulla projektilla on kolme attribuuttia name default sekauml base-

dir Name kuvaa projektin nimeauml ja eikauml sitauml ole pakko maumlaumlritellauml Default kuvaa koon-

titiedoston oletuskohdetta (default target) jota kutsutaan kun kohdetta ei erikseen

anneta kokoamiskomennossa Basedir maumlaumlrittelee projektin tyoumlhakemiston jota kaumlyte-

taumlaumln hakemistopolkujen selvittaumlmiseksi Taumlmaumlkaumlaumln attribuutti ei ole pakollinen Jos

basedir-atribuuttia ei maumlaumlritellauml kaumlytetaumlaumln tyoumlhakemistona samaa hakemistoa jossa

koontitiedosto sijaitsee

12

Kohteilla (targets) on riippuvuuksia muista kohteista Kuten makefilessauml voidaan koh-

teiden vaumllille rakentaa riippuvuuksia ja luoda ohjelmiston kokoamisen kannalta jaumlrkevauml

riippuvaisuuksien verkosto

Tehtaumlvaumlt (tasks) ovat suoritettavia koodirivejauml Tehtaumlvillauml voi olla useita attribuutteja

kuten tulevasta esimerkissauml naumlhdaumlaumln

Ominaisuuksilla (properties) voidaan antaa oikoteitauml (shortcuts) komentoihin tai merk-

kijonoihin joita kaumlytetaumlaumln usein koontitiedostossa Ominaisuudella on nimi- sekauml arvo-

attribuutti [Apache Ant Using Apache Ant]

1 ltproject name=MyProject default=dist basedir=gt

2 ltdescriptiongt

3 Yksinkertainen koontikuvaustiedosto

4 ltdescriptiongt

5 lt--Asetetaan julkiset ominaisuudet --gt

6 ltproperty name=src location=srcgt

7 ltproperty name=build location=buildgt

8 ltproperty name=dist location=distgt

9

10 lttarget name=initgt

11 ltmdashLuodaan aikaleima --gt

12 lttstampgt

13 ltmdashLuodaan hakemistorakenne ldquocompilerdquo tehtaumlvaumllle --gt

14 ltmkdir dir=$buildgt

15 lttargetgt

16 17 lttarget name=compile depends=initgt

18 lt--Kaumlaumlnnetaumlaumln Java-koodi $srcstauml into $buildiin --gt

19 ltjavac srcdir=$src destdir=$buildgt

20 lttargetgt

21 22 lttarget name=dist depends=compile

23 description=Generoidaan distribuutio gt

24 lt--Luodaan distribuutio kansio --gt

25 ltmkdir dir=$distlibgt

26 27 lt-- Laitetaan $build sisaumlltouml MyProject-$DSTAMPjarriin --gt

28 ltjar jarfile=$distlibMyProject $DSTAMPjar basedir=$buildgt

29 lttargetgt

30 31 lttarget name=clean

32 description=clean up gt

33 ltmdashPoistetaan $build ja $dist hakemistot --gt

34 ltdelete dir=$buildgt

13

35 ltdelete dir=$distgt

36 lttargetgt

37 ltprojectgt

[Apache Ant Using Apache Ant Example Buildfile]

Edelliseen koontikuvaukseen on maumlaumlritelty projekti jonka nimi on ldquoMyProjectrdquo Kun

tutustutaan koonnin kuvaukseen huomataan ettauml koontitiedoston projektin oletuskoh-

teella rdquodistrdquo on riippuvuus kohteeseen rdquocompilerdquo jolla on riippuvuus kohteeseen rdquoinitrdquo

Initillauml ei ole riippuvaisuuksia Taumlten ensimmaumlinen koonnin yhteydessauml ajettava kohde

onkin rdquoinitrdquo eikauml rdquodistrdquo vaikka rdquodistrdquo on koontikuvauksen oletuskohde Voidaan sanoa

ettauml koonnin paumlaumlmaumlaumlrauml on suorittaa kohde rdquodistrdquo ja paumlaumlmaumlaumlraumln saavuttamiseksi on

suoritettava kohteita joista taumlmauml on riippuvainen Riippuvuudet toimivat samalla peri-

aatteella kuin aikaisemmissa makefile-esimerkeissauml

Ohjelmiston kokoamisen yhteydessauml halutaan edellisessauml esimerkissauml saada ohjelmisto

jakeluun Jotta ohjelmisto saataisiin jakeluun on se ensin kaumlaumlnnettaumlvauml ja sitauml ennen on

luotava ohjelmiston hakemistorakenne

Jos halutaan kehittaumlauml esimerkin koontikuvausta voidaan esimerkiksi suorittaa verk-

kosivujen paumlivitystehtaumlvauml yhden kohteen sisaumlllauml ja asettaa se riippuvaiseksi kohteesta

rdquodistrdquo Naumlin ohjelmasta saadaan paumlivitetty versio jakeluun ja verkkosivuille tulee taumlstauml

automaattinen ilmoitus ohjelmiston kaumlyttaumljille

33 Maven

Luvussa 32 tutustuttiin Anttiin joka on natiivi koontityoumlkalu Seuraavaksi tutustutaan

koonti- ja projektinhallintasovellukseen Maveniin jolla voidaan kuvata koontiprosessin

lisaumlksi myoumls projektin rakenne Maven rohkaisee kaumlyttaumlmaumlaumln parhaita kaumlytaumlntoumljauml (best

practises) joita kaumlyttaumlmaumlllauml ohjelmistoprojektista toiseen siirtyessauml oppimiskynnys

uuden koontikuvauksen ymmaumlrtaumlmiseen pienenee [Maven vs Ant or Ant vs Maven]

Maven on kaumlytoumlssauml Metropolian Ohjelmistotuotantoprojekti-kurssin ohjelmistoprojekti-

en koontityoumlkaluna

Apache Maven on ohjelmistoprojektin hallintatyoumlkalu Se perustuu projekti-olio-malli -

konseptiin (Project Object Model POM) Maven kykenee kokoamaan projektin testaa-

14

maan projektin antamaan kaumlyttaumljaumllle palautetta dokumentoimaan kokoamisen ja te-

kemaumlaumln useita muita tehtaumlviauml erillisillauml Mavenin tarjoamilla lisaumlosilla (plug-ins) [Apache

Maven Project Welcome to Apache Maven]

POM on XML-tiedosto joka sisaumlltaumlauml informaatiota projektista ja yksityiskohtaisen konfi-

guraation jota Maven kaumlyttaumlauml projektin kokoamiseen POM kostuu kohteista (goals)

jotka on maumlaumlritelty pomxml -tiedostossa Kun suoritetaan erillinen tehtaumlvauml tai kohde

Maven etsii POMmia tyoumlhakemistosta lukee POMmin hakee tarvittavan konfiguraati-

on ja suorittaa kohteen

Eraumlitauml POMissa maumlaumlriteltaumlviauml konfiguraatioita ovat projektin riippuvuudet kaumlytettaumlvaumlt

lisaumlosat ajettavat kohteet ja koontiprofiilit POMiin voi maumlaumlritellauml muutakin tietoa ku-

ten projektin version kehittaumljaumlt ja postituslistat [Apache Maven Project Introduction

to the POM]

Maven on Java-tyoumlkalu joten Java taumlytyy olla asennettuna Mavenia ajavalle koneelle

Taumlmauml luku perustuu Apachen verkkosivuilla sijaitsevaan Mavenin kaumlyttoumlohjeeseen

[Apache Maven Project Maven in 5 Minutes] Seuraavaksi luetellaan eri vaiheet Ma-

ven-projektin luomiseksi

Ensin on ladattava Maven ja kaumlytaumlvauml laumlpi asennusohjeet jotka loumlytyvaumlt osoitteesta

[httpmavenapacheorgdownloadhtmlInstallation] Taumlmaumln jaumllkeen on avattava

terminaali tai komentokehote ja kirjoitettava

mvn --version

Taumlmaumln tulostaa asennetun Mavenin ja Javan versio Esimerkiksi

1 Apache Maven 303 (r1075438 2011-02-28 183109+0100)

2 Maven home Dapache-maven-303bin

3 Java version 160_25 vendor Sun Microsystems Inc

4 Java home EProgram FilesJavajdk160_25jre

5 Default locale nl_NL platform encoding Cp1252

6 OS name windows 7 version 61 arch amd64 family windows

Maven-projekti luodaan ajamalla terminaalissa Maven kohde (goal)

15

mvn archetypegenerate -DgroupId=commycompanyapp -DartifactId=my-app -

DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Ensimmaumlisellauml ajolla taumlmauml komento lataa tarvittavat Maven lisaumlosat ja muita tiedostoja

paikalliseen tietovarastoon Huomataan ettauml rdquogeneraterdquo kohde loi rdquoartifactIdrdquonauml anne-

tun hakemiston

Kirjoitetaan komentoriville

cd my-app

Taumlmaumln kansion alta loumlytyy Mavenin standardi projektirakenne

my-app

|-- pomxml

`-- src

|-- main

| `-- java

| `-- com

| `-- mycompany

| `-- app

| `-- Appjava

`-- test

`-- java

`-- com

`-- mycompany

`-- app

`-- AppTestjava

Yllauml kuvatussa hakemistorakenteessa oleva rdquosrcmainjavardquo-hakemisto sisaumlltaumlauml projek-

tin laumlhdekoodin Vastaavasti rdquosrctestjavardquo-hakemisto sisaumlltaumlauml testien laumlhdekoodin

Pomxml-tiedosto kuvaa projektin konfiguraatiota ja sisaumlltaumlauml projektin kokoamisohjeet

Esimerkkiprojektin POM naumlyttaumlauml taumlltauml

1 ltpro-

ject xmlns=httpmavenapacheorgPOM400 xmlnsxsi=httpwwww3org20

01XMLSchema-instance

2 xsischemaLocation=httpmavenapacheorgPOM400 httpmavenapacheorg

xsdmaven-400xsdgt

3 ltmodelVersiongt400ltmodelVersiongt

4

5 ltgroupIdgtcommycompanyappltgroupIdgt

6 ltartifactIdgtmy-appltartifactIdgt

16

7 ltversiongt10-SNAPSHOTltversiongt

8 ltpackaginggtjarltpackaginggt

9

10 ltnamegtMaven Quick Start Archetypeltnamegt

11 lturlgthttpmavenapacheorglturlgt

12 13 ltdependenciesgt

14 ltdependencygt

15 ltgroupIdgtjunitltgroupIdgt

16 ltartifactIdgtjunitltartifactIdgt

17 ltversiongt482ltversiongt

18 ltscopegttestltscopegt

19 ltdependencygt

20 ltdependenciesgt

21 ltprojectgt

POM-tiedosto on Maven-projektin konfiguraation ydin Se sisaumlltaumlauml suurimman osan

informaatiosta joka vaaditaan projektin kokoamiseen halutulla tavalla

Aikaisemmassa esimerkissauml ajettiin Mavenin kohde (goal) archetypegenerate ja an-

nettiin sille parametreja Etuliite archetype on lisaumlosa joka sisaumlltaumlauml kohteen generate

Taumltauml voi verrata Antin tehtaumlvaumlaumln Taumlmauml kohde loi yksinkertaisen projektin joka perus-

tuu arkkityyppiin Yleisesti Mavenin lisaumlosat koostuvat kohteista joilla on yhteinen paumlauml-

tarkoitus Esimerkki taumlllaisesta lisaumlosasta on jboss-maven-plugin jonka tehtaumlvaumlnauml on

kaumlsitellauml erinaumlisiauml Jboss-komponentteja (items)

Maven-projekti kootaan komentoriviltauml seuraavanlaisesti

mvn package

Komentorivi tulostaa eri komentoja tulostus loppuu seuraavanlaisesti

[INFO] --------------------------

[INFO] BUILD SUCCESSFUL

[INFO] --------------------------

[INFO] Total time 2 seconds

[INFO] Finished at Thu Jul 07 213452 CEST 2011

[INFO] Final Memory 3M6M

[INFO] --------------------------

Toisin kuin ensimmaumliseksi suoritetussa komennossa (archetypegenerate) huomataan

taumlllauml kertaa kaumlytetty komento package on vain yksi sana Taumlllaista komentoa kutsutaan

17

kohteen (goal) sijaan vaiheeksi (phase) Vaihe on yksi askel koonnin elinkaaressa

(build lifecycle) joka on jaumlrjestetty sarja eri vaiheita Jos esimerkiksi ajetaan vaiheen

compile Maven itseasiassa suorittaa sarjan vaiheita

1 validate

2 generate-sources

3 process-sources

4 generate-resources

5 process-resources

6 compile

Compilen ajamisen jaumllkeen voidaan testata kaumlaumlnnettyauml JARia seuraavalla komennolla

java -cp targetmy-app-10-SNAPSHOTjar commycompanyappApp

Taumlmauml komento tulostaa

Hello World

Kaumlydaumlaumln laumlpi vielauml eri Mavenin yleisimmaumlt oletuselinkaaressa kaumlytetyt vaiheet Naumlitauml

ovat

-validate varmistaa ettauml projekti on ehjauml ja kaikki tarvittava tieto on saatavilla

-compile kaumlaumlntaumlauml projektin laumlhdekoodin

-test testaa kaumlaumlnnetyn laumlhdekoodin kaumlyttaumlen sopivaa yksikkoumltestikehystauml Naumliden

testien ei tulisi vaatia vaiheita package tai deploy

-package paketoi kaumlaumlnnetyn koodin sen jaettavaan muotoon esimerkiksi JARriksi

-integration-test prosessoi ja jaumlrjestaumlauml paketin ympaumlristoumloumln jossa integraatiotestejauml

voidaan ajaa jos tarpeellista

-verify tarkistaa onko paketti validi ja taumlyttaumlaumlkouml se laatukriteerit

-install asentaa paketin paikalliseen tietovarastoon muiden paikallisten projektien

kaumlyttoumloumln tai paikallisten projektien riippuvuudeksi

-deploy kopioi lopullisen paketin ulkoiseen tietovarastoon jaettavaksi muille kehittaumljil-

le ja projekteille Tehdaumlaumln integraatio- tai julkaisuympaumlristoumlssauml

On vielauml kaksi muuta mainitsemisen arvoista Maven-elinkaarta jotka eivaumlt sisaumllly yllauml

listattuun oletuselinkaareen Naumlitauml ovat

18

-clean poistaa aikaisempien koontien yhteydessauml luodut artifaktit

-site generoi verkkodokumentaation kyseiselle projektille

Jokainen vaihe sisaumlltaumlauml sarjan suoritettavia kohteita joiden ajaminen riippuu projektin

paketointityypistauml Jos projektin tyyppi on JAR niin package ajaa kohteen jarjar Vas-

taavasti WAR -tyyppisen projektin package -vaihe suorittaa kohteen warwar

34 Koonti ja kaumlyttoumloumlnotto

Ohjelmiston saattamista laumlhdekoodista loppukaumlyttaumljaumllle kaumlyttoumlkelpoiseen muotoon kut-

sutaan koonniksi Laumlhdekoodin kaumlaumlntaumlmisen lisaumlksi koonti voi sisaumlltaumlauml monia muita vai-

heita Aleksi Lukkarinen on opinnaumlytetyoumlssaumlaumln listannut esimerkkejauml erilaisista koon-

neista seuraavasti [Aleksi Lukkarinen opinnaumlytetyouml]

-ohjelmointikielisen laumlhdekoodin sekauml resurssien automatisoitua luomista

-eri ohjelmointikielillauml tuotetun laumlhdekoodin kaumlaumlntaumlmistauml kone- jatai vaumllikielille

-vaumlli- tai konekielisen ohjelmakoodin jaumllkikaumlsittelyauml esimerkiksi testauksen aspektioh-

jelmoinnin tai koodin tarkoituksellisen sotkemisen vuoksi

-sovelluksen testausta (esimerkiksi toimivuus tietoturvallisuus suorituskyky rakenteel-

linen ja koodaustekninen laatu sekauml kaumlyttoumltarkoitustaan vastaavuus)

-dokumentaation koontia (kuten varsinaisen sovelluksen koonti)

-koontituotteiden paketointia sekauml mahdollisten fyysisten jakelumedioiden luontia toi-

mivuus- ja virustarkistuksineen

-ohjelmistomoduulien integrointia

-palautteen antamista koonnin tuloksista

Lukkarinen jaumlsentelee opinnaumlytetyoumlssaumlaumln sovelluksen jakeluun ja kaumlyttoumloumlnottoon sisaumll-

tyviksi asioiksi

-Sovellusta suorittavien ja tukevien palvelinympaumlristoumljen luominen ja paumlivittaumlminen

-Sovelluksen sekauml sen kaumlyttaumlmien ohjelmistokomponenttien siirtaumlminen ja maumlaumlrittaumlmi-

nen esimerkiksi testaus- laadunvarmistus- esittely-koulutus- sekauml tuotantoympaumlris-

toumlihin Kohdeympaumlristoumlissauml olevat vanhat versiot on mahdollisesti paumlivitettaumlvauml jollei

uusia versiota asenneta niiden rinnalle

19

-Uusien tietokantojen luominen sekauml vanhojen paumlivittaumlminen uutta sovellusversiota

vastaaviksi

-Kirjanpidollisen materiaalin tuottaminen ja yllaumlpitaumlminen

-Palautteen antaminen jakelu- ja kaumlyttoumloumlnottoprosessin onnistumisesta

Taumlmaumln luvun tarkoitus oli perehdyttaumlauml lukija ymmaumlrtaumlmaumlaumln koontiprosessia koontiku-

vaus-esimerkkien avulla Koontiprosessin ymmaumlrtaumlminen on vaumllttaumlmaumltoumlntauml seuraavan

luvun ymmaumlrtaumlmiseen jossa perehdytaumlaumln koontiympaumlristouml -kaumlsitteeseen

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant

Taumlssauml luvussa luodaan nopea katsaus koonti- ja kaumlyttoumloumlnottoprosessien automatisoimi-

seen tutustutaan jatkuvaan integraatioon sekauml sovellukseen Jenkins CI

Lisaumlksi tutustutaan projektihallintaohjelmaan Agilefant Agilefant on yksi monipuoli-

simmista kevyistauml vapaan laumlhdekoodin projektinhallintasovelluksista ja se soveltuu

niin pieniin kuin suuriinkin projekteihin

Naumlmauml sovellukset esitellaumlaumln pohjustuksena lukuja 5 ja 6 varten joissa tutustutaan

koontiympaumlristoumln tarkkailuun

41 Jatkuva integraatio

Jatkuva integraatio (Continuous Integration CI) on modernin sovelluskehityksen kul-

makivi Itse asiassa se on mullistanut sovelluskehityksen Kun jatkuva integraatio ote-

taan kaumlyttoumloumln organisaatiossa se muuttaa radikaalisti sitauml miten tyoumlryhmauml ymmaumlrtaumlauml

koko kehitysprosessin Jatkuvalla integraatiolla on potentiaalia laukaista sarja paran-

nuksia organisaation tuotteen kehitysprosessiin Se alkaa yksinkertaisesta automaatti-

sesta koonnista kehittyen systeemiksi joka automaattisesti saattaa tuotteen tuotan-

toon Hyvauml CI-infrastruktuuri mahdollistaa virheiden helpon sekauml nopean huomaamisen

ja tarjoaa kojelaudan projektin hyvinvoinnin ja muiden statistiikkojen seuraamiseen

sekauml kehittaumljille ettauml muille projektin osapuolille Jenkins The Definite Guiden mukaan

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 11: Joakim Sandqvist - Theseus

5

Jokaiselle ryhmaumllle hankittiin 27-tuumaiset LG E2770V -malliset LED-naumlytoumlt Naumlmauml naumly-

toumlt on tarkoitettu vain koontiympaumlristoumln tarkkailua varten Ne kestaumlvaumlt pitkaumlkestoista

kaumlyttoumlauml ja voivat olla paumlaumlllauml youmltauml paumlivaumlauml ilman ettauml kuva palaa kiinni ruutuun Naumlytoumlt

on kiinnitetty seinaumlaumln kolmi-nivelisillauml Melicone Stile DR200 -mallisilla seinaumltelineillauml

joiden avulla naumlyttoumljen kaltevuutta ja sijaintia pystytaumlaumln saumlaumltaumlmaumlaumln

Ryhmille hankitut minitietokoneet (kuva 3) ovat kiinni yllauml esitetyissauml naumlytoumlissauml Minitie-

tokoneita hallitaan langattomalla hiirellauml sekauml naumlppaumlimistoumlllauml Perinteisen poumlytaumltietoko-

neen hankkimisen sijaan paumlaumldyttiin pienempaumlaumln vaihtoehtoon jotta tyoumlskentelytilaa

jaumlisi enemmaumln

Kuva 3 HP8200 USDT -minitietokone

Taumlrkeauml osa uutta laitekokoonpanoa on HDMI-valitsin (kuva 4) Valitsin on kytkettynauml

ryhmaumln laumlhiprojektoriin sekauml ryhmaumln jaumlsenten kaumlyttaumlmiin kannettaviin tietokoneisiin

Valitsimella on taumlrkeauml rooli ryhmien viikkopalavereissa ryhmaumln paumlivittaumlisessauml tyoumlsken-

telyssauml sekauml kehitysryhmaumln ja asiakkaan vaumllisissauml tapaamisissa Valitsin mahdollistaa

sujuvamman kommunikaation ryhmaumln jaumlsenten vaumllillauml Kurssiryhmien kehittaumljaumlt saavat

nappia painamalla oman kannettavan tietokoneensa naumlkymaumln laumlhiprojektoriin

6

Kuva 4 Kramer VS-81H HDMI -valitsin

222 Kurssin palvelimet

Kurssin ryhmaumlkohtaiset palvelimet kevaumlaumlllauml 2012 ovat koontipalvelin testi- ja tuotanto-

sovelluspalvelimet sekauml testi- ja tuotantotietokantapalvelimet (kuva 5) Testipalvelimet

toimivat ryhmaumln omana hiekkalaatikkona Kehitysympaumlristoumln palvelininfrastruktuuri

koostuu kokonaisuudessaan seuraavassa kuvassa esitellyistauml palvelimista

Kuva 5 Kehitysympaumlristoumln palvelininfrastruktuuri

7

Seuraavaksi kaumlydaumlaumln laumlpi palvelimet yksitellen Kerrotaan mitauml sovelluksia kuhunkin

palvelimeen on asennettu ja mitauml ovat kunkin palvelimen tehtaumlvaumlt

Palvelimista koontiympaumlristoumln (luvut 34 4) kannalta oleellisimmassa roolissa on koon-

tipalvelin Jokaisella ryhmaumlllauml on oma koontipalvelimensa jossa ajetaan Jenkins CI -

sovellusta Jenkins CI on vastuussa projektien automaattisesta koonnista ja haumllyttaumlauml

ryhmaumllle projektin koonnin epaumlonnistuessa Jenkins CIstauml kerrotaan lisaumlauml luvussa 4

Tuotanto- ja testipalvelimia on kaksi kappaletta jokaista ryhmaumlauml kohti Tuotantoympauml-

ristoumloumln kuuluvat tuotantosovelluspalvelin sekauml tuotantotietokantapalvelin Tuotantotie-

tokantapalvelin sisaumlltaumlauml ryhmaumlkohtaiset tietokannat Tuotantosovelluspalvelin sisaumlltaumlauml

ryhmaumlkohtaiset palvelut kuten Phpn ja Javan Vastaavasti testiympaumlristoumloumln kuuluvat

testisovelluspalvelin ja testitietokantapalvelin joilla on sama toiminnallisuus kuin tuo-

tantoympaumlristoumln palvelimilla

Ryhmien kaumlytoumlssauml oleva testiympaumlristouml mahdollistaa esimerkiksi palvelinkonfiguraatioi-

den riskittoumlmaumln testaamisen ennen muutosten kaumlyttoumloumlnottoa tuotantoympaumlristoumln puo-

lella Tuotanto -ja testipalvelimet ovat virtualisoituja Palvelimien virtualisointi mahdol-

listaa palvelimen tilan tallennuksen Palvelinten oletustilat (snapshot) voidaan halutessa

ladata muistista palvelimen korruptoituessa konfiguraatiotestaamisen yhteydessauml

Jokaisella ryhmaumlllauml on siis kaumlytoumlssaumlaumln viisi ryhmaumlkohtaista palvelinta koonti- tuotanto-

sovellus- tuotantotietokanta- testisovellus- sekauml testitietokantapalvelin Taumlmaumln lisaumlksi

ryhmillauml on kaumlytoumlssaumlaumln kolme yleiskaumlyttoumlistauml palvelinta joista kerrotaan seuraavaksi

Naumlmauml palvelimet ovat versionhallinta- projektinhallinta- sekauml varmuuskopiopalvelin

Versionhallintapalvelimella sijaitsevat ryhmien kaumlytoumlssauml olevat kaksi tietovarastoa Tois-

ta tietovarastoa kaumlytetaumlaumln laumlhdekoodin taltioimiseen ja toista tietovarastoa oheistuot-

teiden kuten dokumentaation taltioimiseen Opiskelijaryhmien tietovarastojen lisaumlksi

palvelimella on innodev-tietovarasto ympaumlristoumln yllaumlpitoa ja kehitystauml varten Kuvassa 6

on esitelty esimerkki eraumlaumln ohjelmistoprojektin tietovaraston hakemistorakenteesta

8

Kuva 6 Esimerkki opiskelijaryhmaumln tietovaraston hakemistorakenteesta

Projektinhallintapalvelin sisaumlltaumlauml Agilefant-sovelluksen josta ajetaan yhtauml instanssia

kullekin kurssin ryhmaumllle Agilefant on projektinhallintasovellus joka soveltuu hyvin

ketteraumln kehityksen tarpeisiin Sitauml kaumlytetaumlaumln ryhmaumln tyoumltuntien merkkaamiseen ja

projektin kehityksen valvomiseen Agilefantista kerrotaan tarkemmin luvussa 4

Kurssiryhmien kaumlytoumlssauml olevalle varmuuskopiopalvelimelle on tarkoitus kopioida var-

muuskopiota projektinhallinta- ja versionhallintapalvelimien tiloista Varmuuskopiointi ei

ole automatisoitua jonka takia palvelimen kaumlyttoumlmaumlaumlrauml on jaumlaumlnyt pieneksi

3 Ohjelmiston kokoaminen

Ohjelmiston kokoaminen tarkoittaa yksinkertaisimmillaan ohjelmistokoodin kaumlaumlntaumlmistauml

ajettavaan muotoon Jos ohjelmisto on iso ja sen rakenne on modulaarinen voi kehit-

taumljaumlllauml olla tarve jakaa ohjelmiston kokoaminen useisiin operaatioihin joilla on keskinaumli-

siauml riippuvuuksia

Taumlssauml luvussa tutustutaan eri tapoihin toteuttaa ohjelmiston koonti Ensin perehdytaumlaumln

makefileen ja tutustutaan ohjelmiston kokoamiseen makefile-esimerkkien avulla Tauml-

9

maumln jaumllkeen perehdytaumlaumln modernimpiin koontisovelluksiin Ant ja Maven Naumlmauml luvut

ovat tarpeellisia koontiprosessin ymmaumlrtaumlmisen kannalta

31 Makefile

Makefile on tiedosto jota Unix-komento Make kaumlyttaumlauml ohjelman kokoamiseen Makefile

kuvaa ohjelman laumlhdekooditiedostojen vaumlliset riippuvuudet ja sisaumlltaumlauml ohjeet ohjelmis-

ton kaumlaumlntaumlmiseen Kaumlaumlntaumlmisen lisaumlksi makefileen voi sisaumlllyttaumlauml mitauml vain Unix-

komentoja ja siitauml voi kaumlynnistaumlauml testejauml

Otetaan esimerkkitapaus jossa C-kieliseen ohjelmistoon kuuluu 3 tiedostoa

tiedosto1c

tiedosto2c

tiedosto1h

Ilman makefileauml ohjelma kaumlaumlnnettaumlisiin Unix-komentoriviltauml seuraavanlaisesti

gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Esimerkissauml ndashI optio kertoo kaumlaumlntaumljaumllle ettauml sen tulee etsiauml header-tiedostot tyoumlkansi-

osta Gcc-kaumlaumlntaumljauml kaumlaumlntaumlauml tiedostot ja luo sovellusohjelman rdquoesimerkkirdquo Taumlmauml laumlhes-

tymistapa ohjelmiston kaumlaumlntaumlmiseen tulee vaivalloiseksi viimeistaumlaumln siinauml vaiheessa

kun projektiin lisaumltaumlaumln tiedostoja kaumlaumlntaumlmiskomento muuttuu ja se on haettava ko-

mentorivihistoriasta tai kirjoitettava uudestaan Makefilen tekeminen ratkaisee taumlmaumln

ongelman [A Simple Makefile Tutorial]

Esimerkki makefilestauml naumlyttaumlauml taumlltauml

1 esimerkki tiedosto1c tiedosto2c

2 gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Jos yllauml olevat rivit kirjoitetaan rdquoMakefilerdquo- tai rdquomakefilerdquo-nimiseen tiedostoon ja kirjoi-

tetaan komentoriville rdquomakerdquo niin suoritetaan makefileen kirjoitettu komento (rivi 2)

Make ilman optioita suorittaa automaattisesti makefilen ensimmaumlisen kohteen (target)

joka taumlssauml tapauksessa on nimeltaumlaumln rdquoesimerkkirdquo Rivillauml 1 olevat tiedosto1c ja tiedos-

to2c kertoo makelle ettauml naumliden tiedostojen olemassaolo vaaditaan kohteen suoritta-

10

miseen Korostetaan ettauml make vaatii tabulaattorin kaumlytoumln ennen jokaista komentoa

(rivi 2) [A Simple Makefile Tutorial]

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 esimerkki tiedosto1o tiedosto2o

5 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

Edellisen esimerkin riveille 1 ja 2 on lisaumltty muuttujat rdquoKAANTAJArdquo ja rdquoOPTIOTrdquo Naumliden

muuttujien muuttaminen vaikuttaa koko tiedostoon ndash taumlssauml tapauksessa ainoastaan

riviin 5

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 all esimerkki

5

6 esimerkki tiedosto1o tiedosto2o

7 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

8

9 tiedosto1o tiedosto1c

10 gcc -c tiedosto1c

11 12 tiedosto2o tiedosto2c

13 gcc -c tiedosto2c

14 15 clean

16 rm -rf o esimerkki

Edellinen esimerkki koostuu viidestauml eri kohteesta

Ensimmaumlinen kohde rdquoallrdquo suoritetaan kun Make ajetaan ilman optioita Jotta rdquoallrdquo voi-

taisiin suorittaa pitaumlauml suorittaa ensin rdquoesimerkkirdquo (rivi 6) koska rdquoallrdquo on riippuvainen

kohteesta rdquoesimerkkirdquo

Seuraavaa kohdetta rdquoesimerkkirdquo ei voi kuitenkaan suorittaa ennen kuin Make on tar-

kastanut tiedostojen rdquotiedosto1ordquo ja rdquotiedosto2ordquo aikaleimat jos aikaleimat ovat van-

hentuneet eli tiedostot ovat muuttuneet on ajettava kohteet rdquotiedosto1ordquo sekauml rdquotie-

dosto2ordquo Naumlmauml kohteet ajettuaan voi Make siirtyauml suorittamaan kohdetta rdquoesimerkkirdquo

ja taumlmaumln jaumllkeen kohdetta rdquoallrdquo jolla ei ole toteutusta

11

Kohteella rdquocleanrdquo ei ole riippuvuuksia Taumlllaista kohdetta kutsutaan komentorivillauml ko-

mennolla rdquomake cleanrdquo Rivillauml 16 oleva komento poistaa kaikki tyoumlhakemistossa sijait-

sevat rdquoordquo-paumlaumltteiset tiedostot sekauml sovellusohjelman rdquoesimerkkirdquo

Viimeisin makefile-esimerkki on yksinkertainen ohjelmiston koonti vaikka se vaikuttaa

pelkaumlstaumlaumln ohjelman kaumlaumlntaumlmiseltauml Jos yllauml olevaa esimerkkiauml haluttaisiin kehittaumlauml li-

saumlauml voitaisiin siihen lisaumltauml esimerkiksi kohde joka hakee laumlhdekoodin tietovarastosta ja

poistaa paikalliset laumlhdekoodit kovalevyltauml ohjelman kaumlaumlntaumlmisen jaumllkeen

32 Ant

Luvussa 31 tutustuttiin makefileen joka on Maken koontikuvaustiedosto Taumlssauml luvus-

sa perehdytaumlaumln koontityoumlkalu Antin kaumlyttaumlmaumlaumln Xml-muotoiseen koontikuvaukseen

Apache Ant on Java kirjasto- ja komentorivityoumlkalu jonka tehtaumlvaumlnauml on ajaa prosesseja

jotka on kuvattu koontitiedostoissa rdquokohteinardquo joilla on keskinaumlisiauml riippuvaisuuksia

Ant on paumlaumlasiallisesti Java-sovellusten koontisovellus mutta sitauml voidaan kaumlyttaumlauml myoumls

C -ja C++ -ohjelmistojen kokoamiseen Taumlssauml luvussa on esimerkki Java-ohjelmiston

koonnista

Antin kaumlyttaumljaumlt voivat kehittaumlauml omia rdquoantlibsrdquo-kirjastoja joihin sisaumlltyy omia tehtaumlviauml

(tasks) ja tyyppejauml (types) Kaumlyttaumljille tarjotaan myoumls suuri maumlaumlrauml valmiiksi tehtyjauml

kaupallisia tai avoimia rdquoantlibsrdquo kirjastoja [Apache Ant Welcome]

Ant-koontitiedosto koostuu neljaumlstauml eri elementistauml projects targets tasks ja proper-

ties

Koontitiedostossa kuvatulla projektilla on kolme attribuuttia name default sekauml base-

dir Name kuvaa projektin nimeauml ja eikauml sitauml ole pakko maumlaumlritellauml Default kuvaa koon-

titiedoston oletuskohdetta (default target) jota kutsutaan kun kohdetta ei erikseen

anneta kokoamiskomennossa Basedir maumlaumlrittelee projektin tyoumlhakemiston jota kaumlyte-

taumlaumln hakemistopolkujen selvittaumlmiseksi Taumlmaumlkaumlaumln attribuutti ei ole pakollinen Jos

basedir-atribuuttia ei maumlaumlritellauml kaumlytetaumlaumln tyoumlhakemistona samaa hakemistoa jossa

koontitiedosto sijaitsee

12

Kohteilla (targets) on riippuvuuksia muista kohteista Kuten makefilessauml voidaan koh-

teiden vaumllille rakentaa riippuvuuksia ja luoda ohjelmiston kokoamisen kannalta jaumlrkevauml

riippuvaisuuksien verkosto

Tehtaumlvaumlt (tasks) ovat suoritettavia koodirivejauml Tehtaumlvillauml voi olla useita attribuutteja

kuten tulevasta esimerkissauml naumlhdaumlaumln

Ominaisuuksilla (properties) voidaan antaa oikoteitauml (shortcuts) komentoihin tai merk-

kijonoihin joita kaumlytetaumlaumln usein koontitiedostossa Ominaisuudella on nimi- sekauml arvo-

attribuutti [Apache Ant Using Apache Ant]

1 ltproject name=MyProject default=dist basedir=gt

2 ltdescriptiongt

3 Yksinkertainen koontikuvaustiedosto

4 ltdescriptiongt

5 lt--Asetetaan julkiset ominaisuudet --gt

6 ltproperty name=src location=srcgt

7 ltproperty name=build location=buildgt

8 ltproperty name=dist location=distgt

9

10 lttarget name=initgt

11 ltmdashLuodaan aikaleima --gt

12 lttstampgt

13 ltmdashLuodaan hakemistorakenne ldquocompilerdquo tehtaumlvaumllle --gt

14 ltmkdir dir=$buildgt

15 lttargetgt

16 17 lttarget name=compile depends=initgt

18 lt--Kaumlaumlnnetaumlaumln Java-koodi $srcstauml into $buildiin --gt

19 ltjavac srcdir=$src destdir=$buildgt

20 lttargetgt

21 22 lttarget name=dist depends=compile

23 description=Generoidaan distribuutio gt

24 lt--Luodaan distribuutio kansio --gt

25 ltmkdir dir=$distlibgt

26 27 lt-- Laitetaan $build sisaumlltouml MyProject-$DSTAMPjarriin --gt

28 ltjar jarfile=$distlibMyProject $DSTAMPjar basedir=$buildgt

29 lttargetgt

30 31 lttarget name=clean

32 description=clean up gt

33 ltmdashPoistetaan $build ja $dist hakemistot --gt

34 ltdelete dir=$buildgt

13

35 ltdelete dir=$distgt

36 lttargetgt

37 ltprojectgt

[Apache Ant Using Apache Ant Example Buildfile]

Edelliseen koontikuvaukseen on maumlaumlritelty projekti jonka nimi on ldquoMyProjectrdquo Kun

tutustutaan koonnin kuvaukseen huomataan ettauml koontitiedoston projektin oletuskoh-

teella rdquodistrdquo on riippuvuus kohteeseen rdquocompilerdquo jolla on riippuvuus kohteeseen rdquoinitrdquo

Initillauml ei ole riippuvaisuuksia Taumlten ensimmaumlinen koonnin yhteydessauml ajettava kohde

onkin rdquoinitrdquo eikauml rdquodistrdquo vaikka rdquodistrdquo on koontikuvauksen oletuskohde Voidaan sanoa

ettauml koonnin paumlaumlmaumlaumlrauml on suorittaa kohde rdquodistrdquo ja paumlaumlmaumlaumlraumln saavuttamiseksi on

suoritettava kohteita joista taumlmauml on riippuvainen Riippuvuudet toimivat samalla peri-

aatteella kuin aikaisemmissa makefile-esimerkeissauml

Ohjelmiston kokoamisen yhteydessauml halutaan edellisessauml esimerkissauml saada ohjelmisto

jakeluun Jotta ohjelmisto saataisiin jakeluun on se ensin kaumlaumlnnettaumlvauml ja sitauml ennen on

luotava ohjelmiston hakemistorakenne

Jos halutaan kehittaumlauml esimerkin koontikuvausta voidaan esimerkiksi suorittaa verk-

kosivujen paumlivitystehtaumlvauml yhden kohteen sisaumlllauml ja asettaa se riippuvaiseksi kohteesta

rdquodistrdquo Naumlin ohjelmasta saadaan paumlivitetty versio jakeluun ja verkkosivuille tulee taumlstauml

automaattinen ilmoitus ohjelmiston kaumlyttaumljille

33 Maven

Luvussa 32 tutustuttiin Anttiin joka on natiivi koontityoumlkalu Seuraavaksi tutustutaan

koonti- ja projektinhallintasovellukseen Maveniin jolla voidaan kuvata koontiprosessin

lisaumlksi myoumls projektin rakenne Maven rohkaisee kaumlyttaumlmaumlaumln parhaita kaumlytaumlntoumljauml (best

practises) joita kaumlyttaumlmaumlllauml ohjelmistoprojektista toiseen siirtyessauml oppimiskynnys

uuden koontikuvauksen ymmaumlrtaumlmiseen pienenee [Maven vs Ant or Ant vs Maven]

Maven on kaumlytoumlssauml Metropolian Ohjelmistotuotantoprojekti-kurssin ohjelmistoprojekti-

en koontityoumlkaluna

Apache Maven on ohjelmistoprojektin hallintatyoumlkalu Se perustuu projekti-olio-malli -

konseptiin (Project Object Model POM) Maven kykenee kokoamaan projektin testaa-

14

maan projektin antamaan kaumlyttaumljaumllle palautetta dokumentoimaan kokoamisen ja te-

kemaumlaumln useita muita tehtaumlviauml erillisillauml Mavenin tarjoamilla lisaumlosilla (plug-ins) [Apache

Maven Project Welcome to Apache Maven]

POM on XML-tiedosto joka sisaumlltaumlauml informaatiota projektista ja yksityiskohtaisen konfi-

guraation jota Maven kaumlyttaumlauml projektin kokoamiseen POM kostuu kohteista (goals)

jotka on maumlaumlritelty pomxml -tiedostossa Kun suoritetaan erillinen tehtaumlvauml tai kohde

Maven etsii POMmia tyoumlhakemistosta lukee POMmin hakee tarvittavan konfiguraati-

on ja suorittaa kohteen

Eraumlitauml POMissa maumlaumlriteltaumlviauml konfiguraatioita ovat projektin riippuvuudet kaumlytettaumlvaumlt

lisaumlosat ajettavat kohteet ja koontiprofiilit POMiin voi maumlaumlritellauml muutakin tietoa ku-

ten projektin version kehittaumljaumlt ja postituslistat [Apache Maven Project Introduction

to the POM]

Maven on Java-tyoumlkalu joten Java taumlytyy olla asennettuna Mavenia ajavalle koneelle

Taumlmauml luku perustuu Apachen verkkosivuilla sijaitsevaan Mavenin kaumlyttoumlohjeeseen

[Apache Maven Project Maven in 5 Minutes] Seuraavaksi luetellaan eri vaiheet Ma-

ven-projektin luomiseksi

Ensin on ladattava Maven ja kaumlytaumlvauml laumlpi asennusohjeet jotka loumlytyvaumlt osoitteesta

[httpmavenapacheorgdownloadhtmlInstallation] Taumlmaumln jaumllkeen on avattava

terminaali tai komentokehote ja kirjoitettava

mvn --version

Taumlmaumln tulostaa asennetun Mavenin ja Javan versio Esimerkiksi

1 Apache Maven 303 (r1075438 2011-02-28 183109+0100)

2 Maven home Dapache-maven-303bin

3 Java version 160_25 vendor Sun Microsystems Inc

4 Java home EProgram FilesJavajdk160_25jre

5 Default locale nl_NL platform encoding Cp1252

6 OS name windows 7 version 61 arch amd64 family windows

Maven-projekti luodaan ajamalla terminaalissa Maven kohde (goal)

15

mvn archetypegenerate -DgroupId=commycompanyapp -DartifactId=my-app -

DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Ensimmaumlisellauml ajolla taumlmauml komento lataa tarvittavat Maven lisaumlosat ja muita tiedostoja

paikalliseen tietovarastoon Huomataan ettauml rdquogeneraterdquo kohde loi rdquoartifactIdrdquonauml anne-

tun hakemiston

Kirjoitetaan komentoriville

cd my-app

Taumlmaumln kansion alta loumlytyy Mavenin standardi projektirakenne

my-app

|-- pomxml

`-- src

|-- main

| `-- java

| `-- com

| `-- mycompany

| `-- app

| `-- Appjava

`-- test

`-- java

`-- com

`-- mycompany

`-- app

`-- AppTestjava

Yllauml kuvatussa hakemistorakenteessa oleva rdquosrcmainjavardquo-hakemisto sisaumlltaumlauml projek-

tin laumlhdekoodin Vastaavasti rdquosrctestjavardquo-hakemisto sisaumlltaumlauml testien laumlhdekoodin

Pomxml-tiedosto kuvaa projektin konfiguraatiota ja sisaumlltaumlauml projektin kokoamisohjeet

Esimerkkiprojektin POM naumlyttaumlauml taumlltauml

1 ltpro-

ject xmlns=httpmavenapacheorgPOM400 xmlnsxsi=httpwwww3org20

01XMLSchema-instance

2 xsischemaLocation=httpmavenapacheorgPOM400 httpmavenapacheorg

xsdmaven-400xsdgt

3 ltmodelVersiongt400ltmodelVersiongt

4

5 ltgroupIdgtcommycompanyappltgroupIdgt

6 ltartifactIdgtmy-appltartifactIdgt

16

7 ltversiongt10-SNAPSHOTltversiongt

8 ltpackaginggtjarltpackaginggt

9

10 ltnamegtMaven Quick Start Archetypeltnamegt

11 lturlgthttpmavenapacheorglturlgt

12 13 ltdependenciesgt

14 ltdependencygt

15 ltgroupIdgtjunitltgroupIdgt

16 ltartifactIdgtjunitltartifactIdgt

17 ltversiongt482ltversiongt

18 ltscopegttestltscopegt

19 ltdependencygt

20 ltdependenciesgt

21 ltprojectgt

POM-tiedosto on Maven-projektin konfiguraation ydin Se sisaumlltaumlauml suurimman osan

informaatiosta joka vaaditaan projektin kokoamiseen halutulla tavalla

Aikaisemmassa esimerkissauml ajettiin Mavenin kohde (goal) archetypegenerate ja an-

nettiin sille parametreja Etuliite archetype on lisaumlosa joka sisaumlltaumlauml kohteen generate

Taumltauml voi verrata Antin tehtaumlvaumlaumln Taumlmauml kohde loi yksinkertaisen projektin joka perus-

tuu arkkityyppiin Yleisesti Mavenin lisaumlosat koostuvat kohteista joilla on yhteinen paumlauml-

tarkoitus Esimerkki taumlllaisesta lisaumlosasta on jboss-maven-plugin jonka tehtaumlvaumlnauml on

kaumlsitellauml erinaumlisiauml Jboss-komponentteja (items)

Maven-projekti kootaan komentoriviltauml seuraavanlaisesti

mvn package

Komentorivi tulostaa eri komentoja tulostus loppuu seuraavanlaisesti

[INFO] --------------------------

[INFO] BUILD SUCCESSFUL

[INFO] --------------------------

[INFO] Total time 2 seconds

[INFO] Finished at Thu Jul 07 213452 CEST 2011

[INFO] Final Memory 3M6M

[INFO] --------------------------

Toisin kuin ensimmaumliseksi suoritetussa komennossa (archetypegenerate) huomataan

taumlllauml kertaa kaumlytetty komento package on vain yksi sana Taumlllaista komentoa kutsutaan

17

kohteen (goal) sijaan vaiheeksi (phase) Vaihe on yksi askel koonnin elinkaaressa

(build lifecycle) joka on jaumlrjestetty sarja eri vaiheita Jos esimerkiksi ajetaan vaiheen

compile Maven itseasiassa suorittaa sarjan vaiheita

1 validate

2 generate-sources

3 process-sources

4 generate-resources

5 process-resources

6 compile

Compilen ajamisen jaumllkeen voidaan testata kaumlaumlnnettyauml JARia seuraavalla komennolla

java -cp targetmy-app-10-SNAPSHOTjar commycompanyappApp

Taumlmauml komento tulostaa

Hello World

Kaumlydaumlaumln laumlpi vielauml eri Mavenin yleisimmaumlt oletuselinkaaressa kaumlytetyt vaiheet Naumlitauml

ovat

-validate varmistaa ettauml projekti on ehjauml ja kaikki tarvittava tieto on saatavilla

-compile kaumlaumlntaumlauml projektin laumlhdekoodin

-test testaa kaumlaumlnnetyn laumlhdekoodin kaumlyttaumlen sopivaa yksikkoumltestikehystauml Naumliden

testien ei tulisi vaatia vaiheita package tai deploy

-package paketoi kaumlaumlnnetyn koodin sen jaettavaan muotoon esimerkiksi JARriksi

-integration-test prosessoi ja jaumlrjestaumlauml paketin ympaumlristoumloumln jossa integraatiotestejauml

voidaan ajaa jos tarpeellista

-verify tarkistaa onko paketti validi ja taumlyttaumlaumlkouml se laatukriteerit

-install asentaa paketin paikalliseen tietovarastoon muiden paikallisten projektien

kaumlyttoumloumln tai paikallisten projektien riippuvuudeksi

-deploy kopioi lopullisen paketin ulkoiseen tietovarastoon jaettavaksi muille kehittaumljil-

le ja projekteille Tehdaumlaumln integraatio- tai julkaisuympaumlristoumlssauml

On vielauml kaksi muuta mainitsemisen arvoista Maven-elinkaarta jotka eivaumlt sisaumllly yllauml

listattuun oletuselinkaareen Naumlitauml ovat

18

-clean poistaa aikaisempien koontien yhteydessauml luodut artifaktit

-site generoi verkkodokumentaation kyseiselle projektille

Jokainen vaihe sisaumlltaumlauml sarjan suoritettavia kohteita joiden ajaminen riippuu projektin

paketointityypistauml Jos projektin tyyppi on JAR niin package ajaa kohteen jarjar Vas-

taavasti WAR -tyyppisen projektin package -vaihe suorittaa kohteen warwar

34 Koonti ja kaumlyttoumloumlnotto

Ohjelmiston saattamista laumlhdekoodista loppukaumlyttaumljaumllle kaumlyttoumlkelpoiseen muotoon kut-

sutaan koonniksi Laumlhdekoodin kaumlaumlntaumlmisen lisaumlksi koonti voi sisaumlltaumlauml monia muita vai-

heita Aleksi Lukkarinen on opinnaumlytetyoumlssaumlaumln listannut esimerkkejauml erilaisista koon-

neista seuraavasti [Aleksi Lukkarinen opinnaumlytetyouml]

-ohjelmointikielisen laumlhdekoodin sekauml resurssien automatisoitua luomista

-eri ohjelmointikielillauml tuotetun laumlhdekoodin kaumlaumlntaumlmistauml kone- jatai vaumllikielille

-vaumlli- tai konekielisen ohjelmakoodin jaumllkikaumlsittelyauml esimerkiksi testauksen aspektioh-

jelmoinnin tai koodin tarkoituksellisen sotkemisen vuoksi

-sovelluksen testausta (esimerkiksi toimivuus tietoturvallisuus suorituskyky rakenteel-

linen ja koodaustekninen laatu sekauml kaumlyttoumltarkoitustaan vastaavuus)

-dokumentaation koontia (kuten varsinaisen sovelluksen koonti)

-koontituotteiden paketointia sekauml mahdollisten fyysisten jakelumedioiden luontia toi-

mivuus- ja virustarkistuksineen

-ohjelmistomoduulien integrointia

-palautteen antamista koonnin tuloksista

Lukkarinen jaumlsentelee opinnaumlytetyoumlssaumlaumln sovelluksen jakeluun ja kaumlyttoumloumlnottoon sisaumll-

tyviksi asioiksi

-Sovellusta suorittavien ja tukevien palvelinympaumlristoumljen luominen ja paumlivittaumlminen

-Sovelluksen sekauml sen kaumlyttaumlmien ohjelmistokomponenttien siirtaumlminen ja maumlaumlrittaumlmi-

nen esimerkiksi testaus- laadunvarmistus- esittely-koulutus- sekauml tuotantoympaumlris-

toumlihin Kohdeympaumlristoumlissauml olevat vanhat versiot on mahdollisesti paumlivitettaumlvauml jollei

uusia versiota asenneta niiden rinnalle

19

-Uusien tietokantojen luominen sekauml vanhojen paumlivittaumlminen uutta sovellusversiota

vastaaviksi

-Kirjanpidollisen materiaalin tuottaminen ja yllaumlpitaumlminen

-Palautteen antaminen jakelu- ja kaumlyttoumloumlnottoprosessin onnistumisesta

Taumlmaumln luvun tarkoitus oli perehdyttaumlauml lukija ymmaumlrtaumlmaumlaumln koontiprosessia koontiku-

vaus-esimerkkien avulla Koontiprosessin ymmaumlrtaumlminen on vaumllttaumlmaumltoumlntauml seuraavan

luvun ymmaumlrtaumlmiseen jossa perehdytaumlaumln koontiympaumlristouml -kaumlsitteeseen

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant

Taumlssauml luvussa luodaan nopea katsaus koonti- ja kaumlyttoumloumlnottoprosessien automatisoimi-

seen tutustutaan jatkuvaan integraatioon sekauml sovellukseen Jenkins CI

Lisaumlksi tutustutaan projektihallintaohjelmaan Agilefant Agilefant on yksi monipuoli-

simmista kevyistauml vapaan laumlhdekoodin projektinhallintasovelluksista ja se soveltuu

niin pieniin kuin suuriinkin projekteihin

Naumlmauml sovellukset esitellaumlaumln pohjustuksena lukuja 5 ja 6 varten joissa tutustutaan

koontiympaumlristoumln tarkkailuun

41 Jatkuva integraatio

Jatkuva integraatio (Continuous Integration CI) on modernin sovelluskehityksen kul-

makivi Itse asiassa se on mullistanut sovelluskehityksen Kun jatkuva integraatio ote-

taan kaumlyttoumloumln organisaatiossa se muuttaa radikaalisti sitauml miten tyoumlryhmauml ymmaumlrtaumlauml

koko kehitysprosessin Jatkuvalla integraatiolla on potentiaalia laukaista sarja paran-

nuksia organisaation tuotteen kehitysprosessiin Se alkaa yksinkertaisesta automaatti-

sesta koonnista kehittyen systeemiksi joka automaattisesti saattaa tuotteen tuotan-

toon Hyvauml CI-infrastruktuuri mahdollistaa virheiden helpon sekauml nopean huomaamisen

ja tarjoaa kojelaudan projektin hyvinvoinnin ja muiden statistiikkojen seuraamiseen

sekauml kehittaumljille ettauml muille projektin osapuolille Jenkins The Definite Guiden mukaan

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 12: Joakim Sandqvist - Theseus

6

Kuva 4 Kramer VS-81H HDMI -valitsin

222 Kurssin palvelimet

Kurssin ryhmaumlkohtaiset palvelimet kevaumlaumlllauml 2012 ovat koontipalvelin testi- ja tuotanto-

sovelluspalvelimet sekauml testi- ja tuotantotietokantapalvelimet (kuva 5) Testipalvelimet

toimivat ryhmaumln omana hiekkalaatikkona Kehitysympaumlristoumln palvelininfrastruktuuri

koostuu kokonaisuudessaan seuraavassa kuvassa esitellyistauml palvelimista

Kuva 5 Kehitysympaumlristoumln palvelininfrastruktuuri

7

Seuraavaksi kaumlydaumlaumln laumlpi palvelimet yksitellen Kerrotaan mitauml sovelluksia kuhunkin

palvelimeen on asennettu ja mitauml ovat kunkin palvelimen tehtaumlvaumlt

Palvelimista koontiympaumlristoumln (luvut 34 4) kannalta oleellisimmassa roolissa on koon-

tipalvelin Jokaisella ryhmaumlllauml on oma koontipalvelimensa jossa ajetaan Jenkins CI -

sovellusta Jenkins CI on vastuussa projektien automaattisesta koonnista ja haumllyttaumlauml

ryhmaumllle projektin koonnin epaumlonnistuessa Jenkins CIstauml kerrotaan lisaumlauml luvussa 4

Tuotanto- ja testipalvelimia on kaksi kappaletta jokaista ryhmaumlauml kohti Tuotantoympauml-

ristoumloumln kuuluvat tuotantosovelluspalvelin sekauml tuotantotietokantapalvelin Tuotantotie-

tokantapalvelin sisaumlltaumlauml ryhmaumlkohtaiset tietokannat Tuotantosovelluspalvelin sisaumlltaumlauml

ryhmaumlkohtaiset palvelut kuten Phpn ja Javan Vastaavasti testiympaumlristoumloumln kuuluvat

testisovelluspalvelin ja testitietokantapalvelin joilla on sama toiminnallisuus kuin tuo-

tantoympaumlristoumln palvelimilla

Ryhmien kaumlytoumlssauml oleva testiympaumlristouml mahdollistaa esimerkiksi palvelinkonfiguraatioi-

den riskittoumlmaumln testaamisen ennen muutosten kaumlyttoumloumlnottoa tuotantoympaumlristoumln puo-

lella Tuotanto -ja testipalvelimet ovat virtualisoituja Palvelimien virtualisointi mahdol-

listaa palvelimen tilan tallennuksen Palvelinten oletustilat (snapshot) voidaan halutessa

ladata muistista palvelimen korruptoituessa konfiguraatiotestaamisen yhteydessauml

Jokaisella ryhmaumlllauml on siis kaumlytoumlssaumlaumln viisi ryhmaumlkohtaista palvelinta koonti- tuotanto-

sovellus- tuotantotietokanta- testisovellus- sekauml testitietokantapalvelin Taumlmaumln lisaumlksi

ryhmillauml on kaumlytoumlssaumlaumln kolme yleiskaumlyttoumlistauml palvelinta joista kerrotaan seuraavaksi

Naumlmauml palvelimet ovat versionhallinta- projektinhallinta- sekauml varmuuskopiopalvelin

Versionhallintapalvelimella sijaitsevat ryhmien kaumlytoumlssauml olevat kaksi tietovarastoa Tois-

ta tietovarastoa kaumlytetaumlaumln laumlhdekoodin taltioimiseen ja toista tietovarastoa oheistuot-

teiden kuten dokumentaation taltioimiseen Opiskelijaryhmien tietovarastojen lisaumlksi

palvelimella on innodev-tietovarasto ympaumlristoumln yllaumlpitoa ja kehitystauml varten Kuvassa 6

on esitelty esimerkki eraumlaumln ohjelmistoprojektin tietovaraston hakemistorakenteesta

8

Kuva 6 Esimerkki opiskelijaryhmaumln tietovaraston hakemistorakenteesta

Projektinhallintapalvelin sisaumlltaumlauml Agilefant-sovelluksen josta ajetaan yhtauml instanssia

kullekin kurssin ryhmaumllle Agilefant on projektinhallintasovellus joka soveltuu hyvin

ketteraumln kehityksen tarpeisiin Sitauml kaumlytetaumlaumln ryhmaumln tyoumltuntien merkkaamiseen ja

projektin kehityksen valvomiseen Agilefantista kerrotaan tarkemmin luvussa 4

Kurssiryhmien kaumlytoumlssauml olevalle varmuuskopiopalvelimelle on tarkoitus kopioida var-

muuskopiota projektinhallinta- ja versionhallintapalvelimien tiloista Varmuuskopiointi ei

ole automatisoitua jonka takia palvelimen kaumlyttoumlmaumlaumlrauml on jaumlaumlnyt pieneksi

3 Ohjelmiston kokoaminen

Ohjelmiston kokoaminen tarkoittaa yksinkertaisimmillaan ohjelmistokoodin kaumlaumlntaumlmistauml

ajettavaan muotoon Jos ohjelmisto on iso ja sen rakenne on modulaarinen voi kehit-

taumljaumlllauml olla tarve jakaa ohjelmiston kokoaminen useisiin operaatioihin joilla on keskinaumli-

siauml riippuvuuksia

Taumlssauml luvussa tutustutaan eri tapoihin toteuttaa ohjelmiston koonti Ensin perehdytaumlaumln

makefileen ja tutustutaan ohjelmiston kokoamiseen makefile-esimerkkien avulla Tauml-

9

maumln jaumllkeen perehdytaumlaumln modernimpiin koontisovelluksiin Ant ja Maven Naumlmauml luvut

ovat tarpeellisia koontiprosessin ymmaumlrtaumlmisen kannalta

31 Makefile

Makefile on tiedosto jota Unix-komento Make kaumlyttaumlauml ohjelman kokoamiseen Makefile

kuvaa ohjelman laumlhdekooditiedostojen vaumlliset riippuvuudet ja sisaumlltaumlauml ohjeet ohjelmis-

ton kaumlaumlntaumlmiseen Kaumlaumlntaumlmisen lisaumlksi makefileen voi sisaumlllyttaumlauml mitauml vain Unix-

komentoja ja siitauml voi kaumlynnistaumlauml testejauml

Otetaan esimerkkitapaus jossa C-kieliseen ohjelmistoon kuuluu 3 tiedostoa

tiedosto1c

tiedosto2c

tiedosto1h

Ilman makefileauml ohjelma kaumlaumlnnettaumlisiin Unix-komentoriviltauml seuraavanlaisesti

gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Esimerkissauml ndashI optio kertoo kaumlaumlntaumljaumllle ettauml sen tulee etsiauml header-tiedostot tyoumlkansi-

osta Gcc-kaumlaumlntaumljauml kaumlaumlntaumlauml tiedostot ja luo sovellusohjelman rdquoesimerkkirdquo Taumlmauml laumlhes-

tymistapa ohjelmiston kaumlaumlntaumlmiseen tulee vaivalloiseksi viimeistaumlaumln siinauml vaiheessa

kun projektiin lisaumltaumlaumln tiedostoja kaumlaumlntaumlmiskomento muuttuu ja se on haettava ko-

mentorivihistoriasta tai kirjoitettava uudestaan Makefilen tekeminen ratkaisee taumlmaumln

ongelman [A Simple Makefile Tutorial]

Esimerkki makefilestauml naumlyttaumlauml taumlltauml

1 esimerkki tiedosto1c tiedosto2c

2 gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Jos yllauml olevat rivit kirjoitetaan rdquoMakefilerdquo- tai rdquomakefilerdquo-nimiseen tiedostoon ja kirjoi-

tetaan komentoriville rdquomakerdquo niin suoritetaan makefileen kirjoitettu komento (rivi 2)

Make ilman optioita suorittaa automaattisesti makefilen ensimmaumlisen kohteen (target)

joka taumlssauml tapauksessa on nimeltaumlaumln rdquoesimerkkirdquo Rivillauml 1 olevat tiedosto1c ja tiedos-

to2c kertoo makelle ettauml naumliden tiedostojen olemassaolo vaaditaan kohteen suoritta-

10

miseen Korostetaan ettauml make vaatii tabulaattorin kaumlytoumln ennen jokaista komentoa

(rivi 2) [A Simple Makefile Tutorial]

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 esimerkki tiedosto1o tiedosto2o

5 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

Edellisen esimerkin riveille 1 ja 2 on lisaumltty muuttujat rdquoKAANTAJArdquo ja rdquoOPTIOTrdquo Naumliden

muuttujien muuttaminen vaikuttaa koko tiedostoon ndash taumlssauml tapauksessa ainoastaan

riviin 5

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 all esimerkki

5

6 esimerkki tiedosto1o tiedosto2o

7 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

8

9 tiedosto1o tiedosto1c

10 gcc -c tiedosto1c

11 12 tiedosto2o tiedosto2c

13 gcc -c tiedosto2c

14 15 clean

16 rm -rf o esimerkki

Edellinen esimerkki koostuu viidestauml eri kohteesta

Ensimmaumlinen kohde rdquoallrdquo suoritetaan kun Make ajetaan ilman optioita Jotta rdquoallrdquo voi-

taisiin suorittaa pitaumlauml suorittaa ensin rdquoesimerkkirdquo (rivi 6) koska rdquoallrdquo on riippuvainen

kohteesta rdquoesimerkkirdquo

Seuraavaa kohdetta rdquoesimerkkirdquo ei voi kuitenkaan suorittaa ennen kuin Make on tar-

kastanut tiedostojen rdquotiedosto1ordquo ja rdquotiedosto2ordquo aikaleimat jos aikaleimat ovat van-

hentuneet eli tiedostot ovat muuttuneet on ajettava kohteet rdquotiedosto1ordquo sekauml rdquotie-

dosto2ordquo Naumlmauml kohteet ajettuaan voi Make siirtyauml suorittamaan kohdetta rdquoesimerkkirdquo

ja taumlmaumln jaumllkeen kohdetta rdquoallrdquo jolla ei ole toteutusta

11

Kohteella rdquocleanrdquo ei ole riippuvuuksia Taumlllaista kohdetta kutsutaan komentorivillauml ko-

mennolla rdquomake cleanrdquo Rivillauml 16 oleva komento poistaa kaikki tyoumlhakemistossa sijait-

sevat rdquoordquo-paumlaumltteiset tiedostot sekauml sovellusohjelman rdquoesimerkkirdquo

Viimeisin makefile-esimerkki on yksinkertainen ohjelmiston koonti vaikka se vaikuttaa

pelkaumlstaumlaumln ohjelman kaumlaumlntaumlmiseltauml Jos yllauml olevaa esimerkkiauml haluttaisiin kehittaumlauml li-

saumlauml voitaisiin siihen lisaumltauml esimerkiksi kohde joka hakee laumlhdekoodin tietovarastosta ja

poistaa paikalliset laumlhdekoodit kovalevyltauml ohjelman kaumlaumlntaumlmisen jaumllkeen

32 Ant

Luvussa 31 tutustuttiin makefileen joka on Maken koontikuvaustiedosto Taumlssauml luvus-

sa perehdytaumlaumln koontityoumlkalu Antin kaumlyttaumlmaumlaumln Xml-muotoiseen koontikuvaukseen

Apache Ant on Java kirjasto- ja komentorivityoumlkalu jonka tehtaumlvaumlnauml on ajaa prosesseja

jotka on kuvattu koontitiedostoissa rdquokohteinardquo joilla on keskinaumlisiauml riippuvaisuuksia

Ant on paumlaumlasiallisesti Java-sovellusten koontisovellus mutta sitauml voidaan kaumlyttaumlauml myoumls

C -ja C++ -ohjelmistojen kokoamiseen Taumlssauml luvussa on esimerkki Java-ohjelmiston

koonnista

Antin kaumlyttaumljaumlt voivat kehittaumlauml omia rdquoantlibsrdquo-kirjastoja joihin sisaumlltyy omia tehtaumlviauml

(tasks) ja tyyppejauml (types) Kaumlyttaumljille tarjotaan myoumls suuri maumlaumlrauml valmiiksi tehtyjauml

kaupallisia tai avoimia rdquoantlibsrdquo kirjastoja [Apache Ant Welcome]

Ant-koontitiedosto koostuu neljaumlstauml eri elementistauml projects targets tasks ja proper-

ties

Koontitiedostossa kuvatulla projektilla on kolme attribuuttia name default sekauml base-

dir Name kuvaa projektin nimeauml ja eikauml sitauml ole pakko maumlaumlritellauml Default kuvaa koon-

titiedoston oletuskohdetta (default target) jota kutsutaan kun kohdetta ei erikseen

anneta kokoamiskomennossa Basedir maumlaumlrittelee projektin tyoumlhakemiston jota kaumlyte-

taumlaumln hakemistopolkujen selvittaumlmiseksi Taumlmaumlkaumlaumln attribuutti ei ole pakollinen Jos

basedir-atribuuttia ei maumlaumlritellauml kaumlytetaumlaumln tyoumlhakemistona samaa hakemistoa jossa

koontitiedosto sijaitsee

12

Kohteilla (targets) on riippuvuuksia muista kohteista Kuten makefilessauml voidaan koh-

teiden vaumllille rakentaa riippuvuuksia ja luoda ohjelmiston kokoamisen kannalta jaumlrkevauml

riippuvaisuuksien verkosto

Tehtaumlvaumlt (tasks) ovat suoritettavia koodirivejauml Tehtaumlvillauml voi olla useita attribuutteja

kuten tulevasta esimerkissauml naumlhdaumlaumln

Ominaisuuksilla (properties) voidaan antaa oikoteitauml (shortcuts) komentoihin tai merk-

kijonoihin joita kaumlytetaumlaumln usein koontitiedostossa Ominaisuudella on nimi- sekauml arvo-

attribuutti [Apache Ant Using Apache Ant]

1 ltproject name=MyProject default=dist basedir=gt

2 ltdescriptiongt

3 Yksinkertainen koontikuvaustiedosto

4 ltdescriptiongt

5 lt--Asetetaan julkiset ominaisuudet --gt

6 ltproperty name=src location=srcgt

7 ltproperty name=build location=buildgt

8 ltproperty name=dist location=distgt

9

10 lttarget name=initgt

11 ltmdashLuodaan aikaleima --gt

12 lttstampgt

13 ltmdashLuodaan hakemistorakenne ldquocompilerdquo tehtaumlvaumllle --gt

14 ltmkdir dir=$buildgt

15 lttargetgt

16 17 lttarget name=compile depends=initgt

18 lt--Kaumlaumlnnetaumlaumln Java-koodi $srcstauml into $buildiin --gt

19 ltjavac srcdir=$src destdir=$buildgt

20 lttargetgt

21 22 lttarget name=dist depends=compile

23 description=Generoidaan distribuutio gt

24 lt--Luodaan distribuutio kansio --gt

25 ltmkdir dir=$distlibgt

26 27 lt-- Laitetaan $build sisaumlltouml MyProject-$DSTAMPjarriin --gt

28 ltjar jarfile=$distlibMyProject $DSTAMPjar basedir=$buildgt

29 lttargetgt

30 31 lttarget name=clean

32 description=clean up gt

33 ltmdashPoistetaan $build ja $dist hakemistot --gt

34 ltdelete dir=$buildgt

13

35 ltdelete dir=$distgt

36 lttargetgt

37 ltprojectgt

[Apache Ant Using Apache Ant Example Buildfile]

Edelliseen koontikuvaukseen on maumlaumlritelty projekti jonka nimi on ldquoMyProjectrdquo Kun

tutustutaan koonnin kuvaukseen huomataan ettauml koontitiedoston projektin oletuskoh-

teella rdquodistrdquo on riippuvuus kohteeseen rdquocompilerdquo jolla on riippuvuus kohteeseen rdquoinitrdquo

Initillauml ei ole riippuvaisuuksia Taumlten ensimmaumlinen koonnin yhteydessauml ajettava kohde

onkin rdquoinitrdquo eikauml rdquodistrdquo vaikka rdquodistrdquo on koontikuvauksen oletuskohde Voidaan sanoa

ettauml koonnin paumlaumlmaumlaumlrauml on suorittaa kohde rdquodistrdquo ja paumlaumlmaumlaumlraumln saavuttamiseksi on

suoritettava kohteita joista taumlmauml on riippuvainen Riippuvuudet toimivat samalla peri-

aatteella kuin aikaisemmissa makefile-esimerkeissauml

Ohjelmiston kokoamisen yhteydessauml halutaan edellisessauml esimerkissauml saada ohjelmisto

jakeluun Jotta ohjelmisto saataisiin jakeluun on se ensin kaumlaumlnnettaumlvauml ja sitauml ennen on

luotava ohjelmiston hakemistorakenne

Jos halutaan kehittaumlauml esimerkin koontikuvausta voidaan esimerkiksi suorittaa verk-

kosivujen paumlivitystehtaumlvauml yhden kohteen sisaumlllauml ja asettaa se riippuvaiseksi kohteesta

rdquodistrdquo Naumlin ohjelmasta saadaan paumlivitetty versio jakeluun ja verkkosivuille tulee taumlstauml

automaattinen ilmoitus ohjelmiston kaumlyttaumljille

33 Maven

Luvussa 32 tutustuttiin Anttiin joka on natiivi koontityoumlkalu Seuraavaksi tutustutaan

koonti- ja projektinhallintasovellukseen Maveniin jolla voidaan kuvata koontiprosessin

lisaumlksi myoumls projektin rakenne Maven rohkaisee kaumlyttaumlmaumlaumln parhaita kaumlytaumlntoumljauml (best

practises) joita kaumlyttaumlmaumlllauml ohjelmistoprojektista toiseen siirtyessauml oppimiskynnys

uuden koontikuvauksen ymmaumlrtaumlmiseen pienenee [Maven vs Ant or Ant vs Maven]

Maven on kaumlytoumlssauml Metropolian Ohjelmistotuotantoprojekti-kurssin ohjelmistoprojekti-

en koontityoumlkaluna

Apache Maven on ohjelmistoprojektin hallintatyoumlkalu Se perustuu projekti-olio-malli -

konseptiin (Project Object Model POM) Maven kykenee kokoamaan projektin testaa-

14

maan projektin antamaan kaumlyttaumljaumllle palautetta dokumentoimaan kokoamisen ja te-

kemaumlaumln useita muita tehtaumlviauml erillisillauml Mavenin tarjoamilla lisaumlosilla (plug-ins) [Apache

Maven Project Welcome to Apache Maven]

POM on XML-tiedosto joka sisaumlltaumlauml informaatiota projektista ja yksityiskohtaisen konfi-

guraation jota Maven kaumlyttaumlauml projektin kokoamiseen POM kostuu kohteista (goals)

jotka on maumlaumlritelty pomxml -tiedostossa Kun suoritetaan erillinen tehtaumlvauml tai kohde

Maven etsii POMmia tyoumlhakemistosta lukee POMmin hakee tarvittavan konfiguraati-

on ja suorittaa kohteen

Eraumlitauml POMissa maumlaumlriteltaumlviauml konfiguraatioita ovat projektin riippuvuudet kaumlytettaumlvaumlt

lisaumlosat ajettavat kohteet ja koontiprofiilit POMiin voi maumlaumlritellauml muutakin tietoa ku-

ten projektin version kehittaumljaumlt ja postituslistat [Apache Maven Project Introduction

to the POM]

Maven on Java-tyoumlkalu joten Java taumlytyy olla asennettuna Mavenia ajavalle koneelle

Taumlmauml luku perustuu Apachen verkkosivuilla sijaitsevaan Mavenin kaumlyttoumlohjeeseen

[Apache Maven Project Maven in 5 Minutes] Seuraavaksi luetellaan eri vaiheet Ma-

ven-projektin luomiseksi

Ensin on ladattava Maven ja kaumlytaumlvauml laumlpi asennusohjeet jotka loumlytyvaumlt osoitteesta

[httpmavenapacheorgdownloadhtmlInstallation] Taumlmaumln jaumllkeen on avattava

terminaali tai komentokehote ja kirjoitettava

mvn --version

Taumlmaumln tulostaa asennetun Mavenin ja Javan versio Esimerkiksi

1 Apache Maven 303 (r1075438 2011-02-28 183109+0100)

2 Maven home Dapache-maven-303bin

3 Java version 160_25 vendor Sun Microsystems Inc

4 Java home EProgram FilesJavajdk160_25jre

5 Default locale nl_NL platform encoding Cp1252

6 OS name windows 7 version 61 arch amd64 family windows

Maven-projekti luodaan ajamalla terminaalissa Maven kohde (goal)

15

mvn archetypegenerate -DgroupId=commycompanyapp -DartifactId=my-app -

DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Ensimmaumlisellauml ajolla taumlmauml komento lataa tarvittavat Maven lisaumlosat ja muita tiedostoja

paikalliseen tietovarastoon Huomataan ettauml rdquogeneraterdquo kohde loi rdquoartifactIdrdquonauml anne-

tun hakemiston

Kirjoitetaan komentoriville

cd my-app

Taumlmaumln kansion alta loumlytyy Mavenin standardi projektirakenne

my-app

|-- pomxml

`-- src

|-- main

| `-- java

| `-- com

| `-- mycompany

| `-- app

| `-- Appjava

`-- test

`-- java

`-- com

`-- mycompany

`-- app

`-- AppTestjava

Yllauml kuvatussa hakemistorakenteessa oleva rdquosrcmainjavardquo-hakemisto sisaumlltaumlauml projek-

tin laumlhdekoodin Vastaavasti rdquosrctestjavardquo-hakemisto sisaumlltaumlauml testien laumlhdekoodin

Pomxml-tiedosto kuvaa projektin konfiguraatiota ja sisaumlltaumlauml projektin kokoamisohjeet

Esimerkkiprojektin POM naumlyttaumlauml taumlltauml

1 ltpro-

ject xmlns=httpmavenapacheorgPOM400 xmlnsxsi=httpwwww3org20

01XMLSchema-instance

2 xsischemaLocation=httpmavenapacheorgPOM400 httpmavenapacheorg

xsdmaven-400xsdgt

3 ltmodelVersiongt400ltmodelVersiongt

4

5 ltgroupIdgtcommycompanyappltgroupIdgt

6 ltartifactIdgtmy-appltartifactIdgt

16

7 ltversiongt10-SNAPSHOTltversiongt

8 ltpackaginggtjarltpackaginggt

9

10 ltnamegtMaven Quick Start Archetypeltnamegt

11 lturlgthttpmavenapacheorglturlgt

12 13 ltdependenciesgt

14 ltdependencygt

15 ltgroupIdgtjunitltgroupIdgt

16 ltartifactIdgtjunitltartifactIdgt

17 ltversiongt482ltversiongt

18 ltscopegttestltscopegt

19 ltdependencygt

20 ltdependenciesgt

21 ltprojectgt

POM-tiedosto on Maven-projektin konfiguraation ydin Se sisaumlltaumlauml suurimman osan

informaatiosta joka vaaditaan projektin kokoamiseen halutulla tavalla

Aikaisemmassa esimerkissauml ajettiin Mavenin kohde (goal) archetypegenerate ja an-

nettiin sille parametreja Etuliite archetype on lisaumlosa joka sisaumlltaumlauml kohteen generate

Taumltauml voi verrata Antin tehtaumlvaumlaumln Taumlmauml kohde loi yksinkertaisen projektin joka perus-

tuu arkkityyppiin Yleisesti Mavenin lisaumlosat koostuvat kohteista joilla on yhteinen paumlauml-

tarkoitus Esimerkki taumlllaisesta lisaumlosasta on jboss-maven-plugin jonka tehtaumlvaumlnauml on

kaumlsitellauml erinaumlisiauml Jboss-komponentteja (items)

Maven-projekti kootaan komentoriviltauml seuraavanlaisesti

mvn package

Komentorivi tulostaa eri komentoja tulostus loppuu seuraavanlaisesti

[INFO] --------------------------

[INFO] BUILD SUCCESSFUL

[INFO] --------------------------

[INFO] Total time 2 seconds

[INFO] Finished at Thu Jul 07 213452 CEST 2011

[INFO] Final Memory 3M6M

[INFO] --------------------------

Toisin kuin ensimmaumliseksi suoritetussa komennossa (archetypegenerate) huomataan

taumlllauml kertaa kaumlytetty komento package on vain yksi sana Taumlllaista komentoa kutsutaan

17

kohteen (goal) sijaan vaiheeksi (phase) Vaihe on yksi askel koonnin elinkaaressa

(build lifecycle) joka on jaumlrjestetty sarja eri vaiheita Jos esimerkiksi ajetaan vaiheen

compile Maven itseasiassa suorittaa sarjan vaiheita

1 validate

2 generate-sources

3 process-sources

4 generate-resources

5 process-resources

6 compile

Compilen ajamisen jaumllkeen voidaan testata kaumlaumlnnettyauml JARia seuraavalla komennolla

java -cp targetmy-app-10-SNAPSHOTjar commycompanyappApp

Taumlmauml komento tulostaa

Hello World

Kaumlydaumlaumln laumlpi vielauml eri Mavenin yleisimmaumlt oletuselinkaaressa kaumlytetyt vaiheet Naumlitauml

ovat

-validate varmistaa ettauml projekti on ehjauml ja kaikki tarvittava tieto on saatavilla

-compile kaumlaumlntaumlauml projektin laumlhdekoodin

-test testaa kaumlaumlnnetyn laumlhdekoodin kaumlyttaumlen sopivaa yksikkoumltestikehystauml Naumliden

testien ei tulisi vaatia vaiheita package tai deploy

-package paketoi kaumlaumlnnetyn koodin sen jaettavaan muotoon esimerkiksi JARriksi

-integration-test prosessoi ja jaumlrjestaumlauml paketin ympaumlristoumloumln jossa integraatiotestejauml

voidaan ajaa jos tarpeellista

-verify tarkistaa onko paketti validi ja taumlyttaumlaumlkouml se laatukriteerit

-install asentaa paketin paikalliseen tietovarastoon muiden paikallisten projektien

kaumlyttoumloumln tai paikallisten projektien riippuvuudeksi

-deploy kopioi lopullisen paketin ulkoiseen tietovarastoon jaettavaksi muille kehittaumljil-

le ja projekteille Tehdaumlaumln integraatio- tai julkaisuympaumlristoumlssauml

On vielauml kaksi muuta mainitsemisen arvoista Maven-elinkaarta jotka eivaumlt sisaumllly yllauml

listattuun oletuselinkaareen Naumlitauml ovat

18

-clean poistaa aikaisempien koontien yhteydessauml luodut artifaktit

-site generoi verkkodokumentaation kyseiselle projektille

Jokainen vaihe sisaumlltaumlauml sarjan suoritettavia kohteita joiden ajaminen riippuu projektin

paketointityypistauml Jos projektin tyyppi on JAR niin package ajaa kohteen jarjar Vas-

taavasti WAR -tyyppisen projektin package -vaihe suorittaa kohteen warwar

34 Koonti ja kaumlyttoumloumlnotto

Ohjelmiston saattamista laumlhdekoodista loppukaumlyttaumljaumllle kaumlyttoumlkelpoiseen muotoon kut-

sutaan koonniksi Laumlhdekoodin kaumlaumlntaumlmisen lisaumlksi koonti voi sisaumlltaumlauml monia muita vai-

heita Aleksi Lukkarinen on opinnaumlytetyoumlssaumlaumln listannut esimerkkejauml erilaisista koon-

neista seuraavasti [Aleksi Lukkarinen opinnaumlytetyouml]

-ohjelmointikielisen laumlhdekoodin sekauml resurssien automatisoitua luomista

-eri ohjelmointikielillauml tuotetun laumlhdekoodin kaumlaumlntaumlmistauml kone- jatai vaumllikielille

-vaumlli- tai konekielisen ohjelmakoodin jaumllkikaumlsittelyauml esimerkiksi testauksen aspektioh-

jelmoinnin tai koodin tarkoituksellisen sotkemisen vuoksi

-sovelluksen testausta (esimerkiksi toimivuus tietoturvallisuus suorituskyky rakenteel-

linen ja koodaustekninen laatu sekauml kaumlyttoumltarkoitustaan vastaavuus)

-dokumentaation koontia (kuten varsinaisen sovelluksen koonti)

-koontituotteiden paketointia sekauml mahdollisten fyysisten jakelumedioiden luontia toi-

mivuus- ja virustarkistuksineen

-ohjelmistomoduulien integrointia

-palautteen antamista koonnin tuloksista

Lukkarinen jaumlsentelee opinnaumlytetyoumlssaumlaumln sovelluksen jakeluun ja kaumlyttoumloumlnottoon sisaumll-

tyviksi asioiksi

-Sovellusta suorittavien ja tukevien palvelinympaumlristoumljen luominen ja paumlivittaumlminen

-Sovelluksen sekauml sen kaumlyttaumlmien ohjelmistokomponenttien siirtaumlminen ja maumlaumlrittaumlmi-

nen esimerkiksi testaus- laadunvarmistus- esittely-koulutus- sekauml tuotantoympaumlris-

toumlihin Kohdeympaumlristoumlissauml olevat vanhat versiot on mahdollisesti paumlivitettaumlvauml jollei

uusia versiota asenneta niiden rinnalle

19

-Uusien tietokantojen luominen sekauml vanhojen paumlivittaumlminen uutta sovellusversiota

vastaaviksi

-Kirjanpidollisen materiaalin tuottaminen ja yllaumlpitaumlminen

-Palautteen antaminen jakelu- ja kaumlyttoumloumlnottoprosessin onnistumisesta

Taumlmaumln luvun tarkoitus oli perehdyttaumlauml lukija ymmaumlrtaumlmaumlaumln koontiprosessia koontiku-

vaus-esimerkkien avulla Koontiprosessin ymmaumlrtaumlminen on vaumllttaumlmaumltoumlntauml seuraavan

luvun ymmaumlrtaumlmiseen jossa perehdytaumlaumln koontiympaumlristouml -kaumlsitteeseen

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant

Taumlssauml luvussa luodaan nopea katsaus koonti- ja kaumlyttoumloumlnottoprosessien automatisoimi-

seen tutustutaan jatkuvaan integraatioon sekauml sovellukseen Jenkins CI

Lisaumlksi tutustutaan projektihallintaohjelmaan Agilefant Agilefant on yksi monipuoli-

simmista kevyistauml vapaan laumlhdekoodin projektinhallintasovelluksista ja se soveltuu

niin pieniin kuin suuriinkin projekteihin

Naumlmauml sovellukset esitellaumlaumln pohjustuksena lukuja 5 ja 6 varten joissa tutustutaan

koontiympaumlristoumln tarkkailuun

41 Jatkuva integraatio

Jatkuva integraatio (Continuous Integration CI) on modernin sovelluskehityksen kul-

makivi Itse asiassa se on mullistanut sovelluskehityksen Kun jatkuva integraatio ote-

taan kaumlyttoumloumln organisaatiossa se muuttaa radikaalisti sitauml miten tyoumlryhmauml ymmaumlrtaumlauml

koko kehitysprosessin Jatkuvalla integraatiolla on potentiaalia laukaista sarja paran-

nuksia organisaation tuotteen kehitysprosessiin Se alkaa yksinkertaisesta automaatti-

sesta koonnista kehittyen systeemiksi joka automaattisesti saattaa tuotteen tuotan-

toon Hyvauml CI-infrastruktuuri mahdollistaa virheiden helpon sekauml nopean huomaamisen

ja tarjoaa kojelaudan projektin hyvinvoinnin ja muiden statistiikkojen seuraamiseen

sekauml kehittaumljille ettauml muille projektin osapuolille Jenkins The Definite Guiden mukaan

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 13: Joakim Sandqvist - Theseus

7

Seuraavaksi kaumlydaumlaumln laumlpi palvelimet yksitellen Kerrotaan mitauml sovelluksia kuhunkin

palvelimeen on asennettu ja mitauml ovat kunkin palvelimen tehtaumlvaumlt

Palvelimista koontiympaumlristoumln (luvut 34 4) kannalta oleellisimmassa roolissa on koon-

tipalvelin Jokaisella ryhmaumlllauml on oma koontipalvelimensa jossa ajetaan Jenkins CI -

sovellusta Jenkins CI on vastuussa projektien automaattisesta koonnista ja haumllyttaumlauml

ryhmaumllle projektin koonnin epaumlonnistuessa Jenkins CIstauml kerrotaan lisaumlauml luvussa 4

Tuotanto- ja testipalvelimia on kaksi kappaletta jokaista ryhmaumlauml kohti Tuotantoympauml-

ristoumloumln kuuluvat tuotantosovelluspalvelin sekauml tuotantotietokantapalvelin Tuotantotie-

tokantapalvelin sisaumlltaumlauml ryhmaumlkohtaiset tietokannat Tuotantosovelluspalvelin sisaumlltaumlauml

ryhmaumlkohtaiset palvelut kuten Phpn ja Javan Vastaavasti testiympaumlristoumloumln kuuluvat

testisovelluspalvelin ja testitietokantapalvelin joilla on sama toiminnallisuus kuin tuo-

tantoympaumlristoumln palvelimilla

Ryhmien kaumlytoumlssauml oleva testiympaumlristouml mahdollistaa esimerkiksi palvelinkonfiguraatioi-

den riskittoumlmaumln testaamisen ennen muutosten kaumlyttoumloumlnottoa tuotantoympaumlristoumln puo-

lella Tuotanto -ja testipalvelimet ovat virtualisoituja Palvelimien virtualisointi mahdol-

listaa palvelimen tilan tallennuksen Palvelinten oletustilat (snapshot) voidaan halutessa

ladata muistista palvelimen korruptoituessa konfiguraatiotestaamisen yhteydessauml

Jokaisella ryhmaumlllauml on siis kaumlytoumlssaumlaumln viisi ryhmaumlkohtaista palvelinta koonti- tuotanto-

sovellus- tuotantotietokanta- testisovellus- sekauml testitietokantapalvelin Taumlmaumln lisaumlksi

ryhmillauml on kaumlytoumlssaumlaumln kolme yleiskaumlyttoumlistauml palvelinta joista kerrotaan seuraavaksi

Naumlmauml palvelimet ovat versionhallinta- projektinhallinta- sekauml varmuuskopiopalvelin

Versionhallintapalvelimella sijaitsevat ryhmien kaumlytoumlssauml olevat kaksi tietovarastoa Tois-

ta tietovarastoa kaumlytetaumlaumln laumlhdekoodin taltioimiseen ja toista tietovarastoa oheistuot-

teiden kuten dokumentaation taltioimiseen Opiskelijaryhmien tietovarastojen lisaumlksi

palvelimella on innodev-tietovarasto ympaumlristoumln yllaumlpitoa ja kehitystauml varten Kuvassa 6

on esitelty esimerkki eraumlaumln ohjelmistoprojektin tietovaraston hakemistorakenteesta

8

Kuva 6 Esimerkki opiskelijaryhmaumln tietovaraston hakemistorakenteesta

Projektinhallintapalvelin sisaumlltaumlauml Agilefant-sovelluksen josta ajetaan yhtauml instanssia

kullekin kurssin ryhmaumllle Agilefant on projektinhallintasovellus joka soveltuu hyvin

ketteraumln kehityksen tarpeisiin Sitauml kaumlytetaumlaumln ryhmaumln tyoumltuntien merkkaamiseen ja

projektin kehityksen valvomiseen Agilefantista kerrotaan tarkemmin luvussa 4

Kurssiryhmien kaumlytoumlssauml olevalle varmuuskopiopalvelimelle on tarkoitus kopioida var-

muuskopiota projektinhallinta- ja versionhallintapalvelimien tiloista Varmuuskopiointi ei

ole automatisoitua jonka takia palvelimen kaumlyttoumlmaumlaumlrauml on jaumlaumlnyt pieneksi

3 Ohjelmiston kokoaminen

Ohjelmiston kokoaminen tarkoittaa yksinkertaisimmillaan ohjelmistokoodin kaumlaumlntaumlmistauml

ajettavaan muotoon Jos ohjelmisto on iso ja sen rakenne on modulaarinen voi kehit-

taumljaumlllauml olla tarve jakaa ohjelmiston kokoaminen useisiin operaatioihin joilla on keskinaumli-

siauml riippuvuuksia

Taumlssauml luvussa tutustutaan eri tapoihin toteuttaa ohjelmiston koonti Ensin perehdytaumlaumln

makefileen ja tutustutaan ohjelmiston kokoamiseen makefile-esimerkkien avulla Tauml-

9

maumln jaumllkeen perehdytaumlaumln modernimpiin koontisovelluksiin Ant ja Maven Naumlmauml luvut

ovat tarpeellisia koontiprosessin ymmaumlrtaumlmisen kannalta

31 Makefile

Makefile on tiedosto jota Unix-komento Make kaumlyttaumlauml ohjelman kokoamiseen Makefile

kuvaa ohjelman laumlhdekooditiedostojen vaumlliset riippuvuudet ja sisaumlltaumlauml ohjeet ohjelmis-

ton kaumlaumlntaumlmiseen Kaumlaumlntaumlmisen lisaumlksi makefileen voi sisaumlllyttaumlauml mitauml vain Unix-

komentoja ja siitauml voi kaumlynnistaumlauml testejauml

Otetaan esimerkkitapaus jossa C-kieliseen ohjelmistoon kuuluu 3 tiedostoa

tiedosto1c

tiedosto2c

tiedosto1h

Ilman makefileauml ohjelma kaumlaumlnnettaumlisiin Unix-komentoriviltauml seuraavanlaisesti

gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Esimerkissauml ndashI optio kertoo kaumlaumlntaumljaumllle ettauml sen tulee etsiauml header-tiedostot tyoumlkansi-

osta Gcc-kaumlaumlntaumljauml kaumlaumlntaumlauml tiedostot ja luo sovellusohjelman rdquoesimerkkirdquo Taumlmauml laumlhes-

tymistapa ohjelmiston kaumlaumlntaumlmiseen tulee vaivalloiseksi viimeistaumlaumln siinauml vaiheessa

kun projektiin lisaumltaumlaumln tiedostoja kaumlaumlntaumlmiskomento muuttuu ja se on haettava ko-

mentorivihistoriasta tai kirjoitettava uudestaan Makefilen tekeminen ratkaisee taumlmaumln

ongelman [A Simple Makefile Tutorial]

Esimerkki makefilestauml naumlyttaumlauml taumlltauml

1 esimerkki tiedosto1c tiedosto2c

2 gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Jos yllauml olevat rivit kirjoitetaan rdquoMakefilerdquo- tai rdquomakefilerdquo-nimiseen tiedostoon ja kirjoi-

tetaan komentoriville rdquomakerdquo niin suoritetaan makefileen kirjoitettu komento (rivi 2)

Make ilman optioita suorittaa automaattisesti makefilen ensimmaumlisen kohteen (target)

joka taumlssauml tapauksessa on nimeltaumlaumln rdquoesimerkkirdquo Rivillauml 1 olevat tiedosto1c ja tiedos-

to2c kertoo makelle ettauml naumliden tiedostojen olemassaolo vaaditaan kohteen suoritta-

10

miseen Korostetaan ettauml make vaatii tabulaattorin kaumlytoumln ennen jokaista komentoa

(rivi 2) [A Simple Makefile Tutorial]

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 esimerkki tiedosto1o tiedosto2o

5 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

Edellisen esimerkin riveille 1 ja 2 on lisaumltty muuttujat rdquoKAANTAJArdquo ja rdquoOPTIOTrdquo Naumliden

muuttujien muuttaminen vaikuttaa koko tiedostoon ndash taumlssauml tapauksessa ainoastaan

riviin 5

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 all esimerkki

5

6 esimerkki tiedosto1o tiedosto2o

7 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

8

9 tiedosto1o tiedosto1c

10 gcc -c tiedosto1c

11 12 tiedosto2o tiedosto2c

13 gcc -c tiedosto2c

14 15 clean

16 rm -rf o esimerkki

Edellinen esimerkki koostuu viidestauml eri kohteesta

Ensimmaumlinen kohde rdquoallrdquo suoritetaan kun Make ajetaan ilman optioita Jotta rdquoallrdquo voi-

taisiin suorittaa pitaumlauml suorittaa ensin rdquoesimerkkirdquo (rivi 6) koska rdquoallrdquo on riippuvainen

kohteesta rdquoesimerkkirdquo

Seuraavaa kohdetta rdquoesimerkkirdquo ei voi kuitenkaan suorittaa ennen kuin Make on tar-

kastanut tiedostojen rdquotiedosto1ordquo ja rdquotiedosto2ordquo aikaleimat jos aikaleimat ovat van-

hentuneet eli tiedostot ovat muuttuneet on ajettava kohteet rdquotiedosto1ordquo sekauml rdquotie-

dosto2ordquo Naumlmauml kohteet ajettuaan voi Make siirtyauml suorittamaan kohdetta rdquoesimerkkirdquo

ja taumlmaumln jaumllkeen kohdetta rdquoallrdquo jolla ei ole toteutusta

11

Kohteella rdquocleanrdquo ei ole riippuvuuksia Taumlllaista kohdetta kutsutaan komentorivillauml ko-

mennolla rdquomake cleanrdquo Rivillauml 16 oleva komento poistaa kaikki tyoumlhakemistossa sijait-

sevat rdquoordquo-paumlaumltteiset tiedostot sekauml sovellusohjelman rdquoesimerkkirdquo

Viimeisin makefile-esimerkki on yksinkertainen ohjelmiston koonti vaikka se vaikuttaa

pelkaumlstaumlaumln ohjelman kaumlaumlntaumlmiseltauml Jos yllauml olevaa esimerkkiauml haluttaisiin kehittaumlauml li-

saumlauml voitaisiin siihen lisaumltauml esimerkiksi kohde joka hakee laumlhdekoodin tietovarastosta ja

poistaa paikalliset laumlhdekoodit kovalevyltauml ohjelman kaumlaumlntaumlmisen jaumllkeen

32 Ant

Luvussa 31 tutustuttiin makefileen joka on Maken koontikuvaustiedosto Taumlssauml luvus-

sa perehdytaumlaumln koontityoumlkalu Antin kaumlyttaumlmaumlaumln Xml-muotoiseen koontikuvaukseen

Apache Ant on Java kirjasto- ja komentorivityoumlkalu jonka tehtaumlvaumlnauml on ajaa prosesseja

jotka on kuvattu koontitiedostoissa rdquokohteinardquo joilla on keskinaumlisiauml riippuvaisuuksia

Ant on paumlaumlasiallisesti Java-sovellusten koontisovellus mutta sitauml voidaan kaumlyttaumlauml myoumls

C -ja C++ -ohjelmistojen kokoamiseen Taumlssauml luvussa on esimerkki Java-ohjelmiston

koonnista

Antin kaumlyttaumljaumlt voivat kehittaumlauml omia rdquoantlibsrdquo-kirjastoja joihin sisaumlltyy omia tehtaumlviauml

(tasks) ja tyyppejauml (types) Kaumlyttaumljille tarjotaan myoumls suuri maumlaumlrauml valmiiksi tehtyjauml

kaupallisia tai avoimia rdquoantlibsrdquo kirjastoja [Apache Ant Welcome]

Ant-koontitiedosto koostuu neljaumlstauml eri elementistauml projects targets tasks ja proper-

ties

Koontitiedostossa kuvatulla projektilla on kolme attribuuttia name default sekauml base-

dir Name kuvaa projektin nimeauml ja eikauml sitauml ole pakko maumlaumlritellauml Default kuvaa koon-

titiedoston oletuskohdetta (default target) jota kutsutaan kun kohdetta ei erikseen

anneta kokoamiskomennossa Basedir maumlaumlrittelee projektin tyoumlhakemiston jota kaumlyte-

taumlaumln hakemistopolkujen selvittaumlmiseksi Taumlmaumlkaumlaumln attribuutti ei ole pakollinen Jos

basedir-atribuuttia ei maumlaumlritellauml kaumlytetaumlaumln tyoumlhakemistona samaa hakemistoa jossa

koontitiedosto sijaitsee

12

Kohteilla (targets) on riippuvuuksia muista kohteista Kuten makefilessauml voidaan koh-

teiden vaumllille rakentaa riippuvuuksia ja luoda ohjelmiston kokoamisen kannalta jaumlrkevauml

riippuvaisuuksien verkosto

Tehtaumlvaumlt (tasks) ovat suoritettavia koodirivejauml Tehtaumlvillauml voi olla useita attribuutteja

kuten tulevasta esimerkissauml naumlhdaumlaumln

Ominaisuuksilla (properties) voidaan antaa oikoteitauml (shortcuts) komentoihin tai merk-

kijonoihin joita kaumlytetaumlaumln usein koontitiedostossa Ominaisuudella on nimi- sekauml arvo-

attribuutti [Apache Ant Using Apache Ant]

1 ltproject name=MyProject default=dist basedir=gt

2 ltdescriptiongt

3 Yksinkertainen koontikuvaustiedosto

4 ltdescriptiongt

5 lt--Asetetaan julkiset ominaisuudet --gt

6 ltproperty name=src location=srcgt

7 ltproperty name=build location=buildgt

8 ltproperty name=dist location=distgt

9

10 lttarget name=initgt

11 ltmdashLuodaan aikaleima --gt

12 lttstampgt

13 ltmdashLuodaan hakemistorakenne ldquocompilerdquo tehtaumlvaumllle --gt

14 ltmkdir dir=$buildgt

15 lttargetgt

16 17 lttarget name=compile depends=initgt

18 lt--Kaumlaumlnnetaumlaumln Java-koodi $srcstauml into $buildiin --gt

19 ltjavac srcdir=$src destdir=$buildgt

20 lttargetgt

21 22 lttarget name=dist depends=compile

23 description=Generoidaan distribuutio gt

24 lt--Luodaan distribuutio kansio --gt

25 ltmkdir dir=$distlibgt

26 27 lt-- Laitetaan $build sisaumlltouml MyProject-$DSTAMPjarriin --gt

28 ltjar jarfile=$distlibMyProject $DSTAMPjar basedir=$buildgt

29 lttargetgt

30 31 lttarget name=clean

32 description=clean up gt

33 ltmdashPoistetaan $build ja $dist hakemistot --gt

34 ltdelete dir=$buildgt

13

35 ltdelete dir=$distgt

36 lttargetgt

37 ltprojectgt

[Apache Ant Using Apache Ant Example Buildfile]

Edelliseen koontikuvaukseen on maumlaumlritelty projekti jonka nimi on ldquoMyProjectrdquo Kun

tutustutaan koonnin kuvaukseen huomataan ettauml koontitiedoston projektin oletuskoh-

teella rdquodistrdquo on riippuvuus kohteeseen rdquocompilerdquo jolla on riippuvuus kohteeseen rdquoinitrdquo

Initillauml ei ole riippuvaisuuksia Taumlten ensimmaumlinen koonnin yhteydessauml ajettava kohde

onkin rdquoinitrdquo eikauml rdquodistrdquo vaikka rdquodistrdquo on koontikuvauksen oletuskohde Voidaan sanoa

ettauml koonnin paumlaumlmaumlaumlrauml on suorittaa kohde rdquodistrdquo ja paumlaumlmaumlaumlraumln saavuttamiseksi on

suoritettava kohteita joista taumlmauml on riippuvainen Riippuvuudet toimivat samalla peri-

aatteella kuin aikaisemmissa makefile-esimerkeissauml

Ohjelmiston kokoamisen yhteydessauml halutaan edellisessauml esimerkissauml saada ohjelmisto

jakeluun Jotta ohjelmisto saataisiin jakeluun on se ensin kaumlaumlnnettaumlvauml ja sitauml ennen on

luotava ohjelmiston hakemistorakenne

Jos halutaan kehittaumlauml esimerkin koontikuvausta voidaan esimerkiksi suorittaa verk-

kosivujen paumlivitystehtaumlvauml yhden kohteen sisaumlllauml ja asettaa se riippuvaiseksi kohteesta

rdquodistrdquo Naumlin ohjelmasta saadaan paumlivitetty versio jakeluun ja verkkosivuille tulee taumlstauml

automaattinen ilmoitus ohjelmiston kaumlyttaumljille

33 Maven

Luvussa 32 tutustuttiin Anttiin joka on natiivi koontityoumlkalu Seuraavaksi tutustutaan

koonti- ja projektinhallintasovellukseen Maveniin jolla voidaan kuvata koontiprosessin

lisaumlksi myoumls projektin rakenne Maven rohkaisee kaumlyttaumlmaumlaumln parhaita kaumlytaumlntoumljauml (best

practises) joita kaumlyttaumlmaumlllauml ohjelmistoprojektista toiseen siirtyessauml oppimiskynnys

uuden koontikuvauksen ymmaumlrtaumlmiseen pienenee [Maven vs Ant or Ant vs Maven]

Maven on kaumlytoumlssauml Metropolian Ohjelmistotuotantoprojekti-kurssin ohjelmistoprojekti-

en koontityoumlkaluna

Apache Maven on ohjelmistoprojektin hallintatyoumlkalu Se perustuu projekti-olio-malli -

konseptiin (Project Object Model POM) Maven kykenee kokoamaan projektin testaa-

14

maan projektin antamaan kaumlyttaumljaumllle palautetta dokumentoimaan kokoamisen ja te-

kemaumlaumln useita muita tehtaumlviauml erillisillauml Mavenin tarjoamilla lisaumlosilla (plug-ins) [Apache

Maven Project Welcome to Apache Maven]

POM on XML-tiedosto joka sisaumlltaumlauml informaatiota projektista ja yksityiskohtaisen konfi-

guraation jota Maven kaumlyttaumlauml projektin kokoamiseen POM kostuu kohteista (goals)

jotka on maumlaumlritelty pomxml -tiedostossa Kun suoritetaan erillinen tehtaumlvauml tai kohde

Maven etsii POMmia tyoumlhakemistosta lukee POMmin hakee tarvittavan konfiguraati-

on ja suorittaa kohteen

Eraumlitauml POMissa maumlaumlriteltaumlviauml konfiguraatioita ovat projektin riippuvuudet kaumlytettaumlvaumlt

lisaumlosat ajettavat kohteet ja koontiprofiilit POMiin voi maumlaumlritellauml muutakin tietoa ku-

ten projektin version kehittaumljaumlt ja postituslistat [Apache Maven Project Introduction

to the POM]

Maven on Java-tyoumlkalu joten Java taumlytyy olla asennettuna Mavenia ajavalle koneelle

Taumlmauml luku perustuu Apachen verkkosivuilla sijaitsevaan Mavenin kaumlyttoumlohjeeseen

[Apache Maven Project Maven in 5 Minutes] Seuraavaksi luetellaan eri vaiheet Ma-

ven-projektin luomiseksi

Ensin on ladattava Maven ja kaumlytaumlvauml laumlpi asennusohjeet jotka loumlytyvaumlt osoitteesta

[httpmavenapacheorgdownloadhtmlInstallation] Taumlmaumln jaumllkeen on avattava

terminaali tai komentokehote ja kirjoitettava

mvn --version

Taumlmaumln tulostaa asennetun Mavenin ja Javan versio Esimerkiksi

1 Apache Maven 303 (r1075438 2011-02-28 183109+0100)

2 Maven home Dapache-maven-303bin

3 Java version 160_25 vendor Sun Microsystems Inc

4 Java home EProgram FilesJavajdk160_25jre

5 Default locale nl_NL platform encoding Cp1252

6 OS name windows 7 version 61 arch amd64 family windows

Maven-projekti luodaan ajamalla terminaalissa Maven kohde (goal)

15

mvn archetypegenerate -DgroupId=commycompanyapp -DartifactId=my-app -

DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Ensimmaumlisellauml ajolla taumlmauml komento lataa tarvittavat Maven lisaumlosat ja muita tiedostoja

paikalliseen tietovarastoon Huomataan ettauml rdquogeneraterdquo kohde loi rdquoartifactIdrdquonauml anne-

tun hakemiston

Kirjoitetaan komentoriville

cd my-app

Taumlmaumln kansion alta loumlytyy Mavenin standardi projektirakenne

my-app

|-- pomxml

`-- src

|-- main

| `-- java

| `-- com

| `-- mycompany

| `-- app

| `-- Appjava

`-- test

`-- java

`-- com

`-- mycompany

`-- app

`-- AppTestjava

Yllauml kuvatussa hakemistorakenteessa oleva rdquosrcmainjavardquo-hakemisto sisaumlltaumlauml projek-

tin laumlhdekoodin Vastaavasti rdquosrctestjavardquo-hakemisto sisaumlltaumlauml testien laumlhdekoodin

Pomxml-tiedosto kuvaa projektin konfiguraatiota ja sisaumlltaumlauml projektin kokoamisohjeet

Esimerkkiprojektin POM naumlyttaumlauml taumlltauml

1 ltpro-

ject xmlns=httpmavenapacheorgPOM400 xmlnsxsi=httpwwww3org20

01XMLSchema-instance

2 xsischemaLocation=httpmavenapacheorgPOM400 httpmavenapacheorg

xsdmaven-400xsdgt

3 ltmodelVersiongt400ltmodelVersiongt

4

5 ltgroupIdgtcommycompanyappltgroupIdgt

6 ltartifactIdgtmy-appltartifactIdgt

16

7 ltversiongt10-SNAPSHOTltversiongt

8 ltpackaginggtjarltpackaginggt

9

10 ltnamegtMaven Quick Start Archetypeltnamegt

11 lturlgthttpmavenapacheorglturlgt

12 13 ltdependenciesgt

14 ltdependencygt

15 ltgroupIdgtjunitltgroupIdgt

16 ltartifactIdgtjunitltartifactIdgt

17 ltversiongt482ltversiongt

18 ltscopegttestltscopegt

19 ltdependencygt

20 ltdependenciesgt

21 ltprojectgt

POM-tiedosto on Maven-projektin konfiguraation ydin Se sisaumlltaumlauml suurimman osan

informaatiosta joka vaaditaan projektin kokoamiseen halutulla tavalla

Aikaisemmassa esimerkissauml ajettiin Mavenin kohde (goal) archetypegenerate ja an-

nettiin sille parametreja Etuliite archetype on lisaumlosa joka sisaumlltaumlauml kohteen generate

Taumltauml voi verrata Antin tehtaumlvaumlaumln Taumlmauml kohde loi yksinkertaisen projektin joka perus-

tuu arkkityyppiin Yleisesti Mavenin lisaumlosat koostuvat kohteista joilla on yhteinen paumlauml-

tarkoitus Esimerkki taumlllaisesta lisaumlosasta on jboss-maven-plugin jonka tehtaumlvaumlnauml on

kaumlsitellauml erinaumlisiauml Jboss-komponentteja (items)

Maven-projekti kootaan komentoriviltauml seuraavanlaisesti

mvn package

Komentorivi tulostaa eri komentoja tulostus loppuu seuraavanlaisesti

[INFO] --------------------------

[INFO] BUILD SUCCESSFUL

[INFO] --------------------------

[INFO] Total time 2 seconds

[INFO] Finished at Thu Jul 07 213452 CEST 2011

[INFO] Final Memory 3M6M

[INFO] --------------------------

Toisin kuin ensimmaumliseksi suoritetussa komennossa (archetypegenerate) huomataan

taumlllauml kertaa kaumlytetty komento package on vain yksi sana Taumlllaista komentoa kutsutaan

17

kohteen (goal) sijaan vaiheeksi (phase) Vaihe on yksi askel koonnin elinkaaressa

(build lifecycle) joka on jaumlrjestetty sarja eri vaiheita Jos esimerkiksi ajetaan vaiheen

compile Maven itseasiassa suorittaa sarjan vaiheita

1 validate

2 generate-sources

3 process-sources

4 generate-resources

5 process-resources

6 compile

Compilen ajamisen jaumllkeen voidaan testata kaumlaumlnnettyauml JARia seuraavalla komennolla

java -cp targetmy-app-10-SNAPSHOTjar commycompanyappApp

Taumlmauml komento tulostaa

Hello World

Kaumlydaumlaumln laumlpi vielauml eri Mavenin yleisimmaumlt oletuselinkaaressa kaumlytetyt vaiheet Naumlitauml

ovat

-validate varmistaa ettauml projekti on ehjauml ja kaikki tarvittava tieto on saatavilla

-compile kaumlaumlntaumlauml projektin laumlhdekoodin

-test testaa kaumlaumlnnetyn laumlhdekoodin kaumlyttaumlen sopivaa yksikkoumltestikehystauml Naumliden

testien ei tulisi vaatia vaiheita package tai deploy

-package paketoi kaumlaumlnnetyn koodin sen jaettavaan muotoon esimerkiksi JARriksi

-integration-test prosessoi ja jaumlrjestaumlauml paketin ympaumlristoumloumln jossa integraatiotestejauml

voidaan ajaa jos tarpeellista

-verify tarkistaa onko paketti validi ja taumlyttaumlaumlkouml se laatukriteerit

-install asentaa paketin paikalliseen tietovarastoon muiden paikallisten projektien

kaumlyttoumloumln tai paikallisten projektien riippuvuudeksi

-deploy kopioi lopullisen paketin ulkoiseen tietovarastoon jaettavaksi muille kehittaumljil-

le ja projekteille Tehdaumlaumln integraatio- tai julkaisuympaumlristoumlssauml

On vielauml kaksi muuta mainitsemisen arvoista Maven-elinkaarta jotka eivaumlt sisaumllly yllauml

listattuun oletuselinkaareen Naumlitauml ovat

18

-clean poistaa aikaisempien koontien yhteydessauml luodut artifaktit

-site generoi verkkodokumentaation kyseiselle projektille

Jokainen vaihe sisaumlltaumlauml sarjan suoritettavia kohteita joiden ajaminen riippuu projektin

paketointityypistauml Jos projektin tyyppi on JAR niin package ajaa kohteen jarjar Vas-

taavasti WAR -tyyppisen projektin package -vaihe suorittaa kohteen warwar

34 Koonti ja kaumlyttoumloumlnotto

Ohjelmiston saattamista laumlhdekoodista loppukaumlyttaumljaumllle kaumlyttoumlkelpoiseen muotoon kut-

sutaan koonniksi Laumlhdekoodin kaumlaumlntaumlmisen lisaumlksi koonti voi sisaumlltaumlauml monia muita vai-

heita Aleksi Lukkarinen on opinnaumlytetyoumlssaumlaumln listannut esimerkkejauml erilaisista koon-

neista seuraavasti [Aleksi Lukkarinen opinnaumlytetyouml]

-ohjelmointikielisen laumlhdekoodin sekauml resurssien automatisoitua luomista

-eri ohjelmointikielillauml tuotetun laumlhdekoodin kaumlaumlntaumlmistauml kone- jatai vaumllikielille

-vaumlli- tai konekielisen ohjelmakoodin jaumllkikaumlsittelyauml esimerkiksi testauksen aspektioh-

jelmoinnin tai koodin tarkoituksellisen sotkemisen vuoksi

-sovelluksen testausta (esimerkiksi toimivuus tietoturvallisuus suorituskyky rakenteel-

linen ja koodaustekninen laatu sekauml kaumlyttoumltarkoitustaan vastaavuus)

-dokumentaation koontia (kuten varsinaisen sovelluksen koonti)

-koontituotteiden paketointia sekauml mahdollisten fyysisten jakelumedioiden luontia toi-

mivuus- ja virustarkistuksineen

-ohjelmistomoduulien integrointia

-palautteen antamista koonnin tuloksista

Lukkarinen jaumlsentelee opinnaumlytetyoumlssaumlaumln sovelluksen jakeluun ja kaumlyttoumloumlnottoon sisaumll-

tyviksi asioiksi

-Sovellusta suorittavien ja tukevien palvelinympaumlristoumljen luominen ja paumlivittaumlminen

-Sovelluksen sekauml sen kaumlyttaumlmien ohjelmistokomponenttien siirtaumlminen ja maumlaumlrittaumlmi-

nen esimerkiksi testaus- laadunvarmistus- esittely-koulutus- sekauml tuotantoympaumlris-

toumlihin Kohdeympaumlristoumlissauml olevat vanhat versiot on mahdollisesti paumlivitettaumlvauml jollei

uusia versiota asenneta niiden rinnalle

19

-Uusien tietokantojen luominen sekauml vanhojen paumlivittaumlminen uutta sovellusversiota

vastaaviksi

-Kirjanpidollisen materiaalin tuottaminen ja yllaumlpitaumlminen

-Palautteen antaminen jakelu- ja kaumlyttoumloumlnottoprosessin onnistumisesta

Taumlmaumln luvun tarkoitus oli perehdyttaumlauml lukija ymmaumlrtaumlmaumlaumln koontiprosessia koontiku-

vaus-esimerkkien avulla Koontiprosessin ymmaumlrtaumlminen on vaumllttaumlmaumltoumlntauml seuraavan

luvun ymmaumlrtaumlmiseen jossa perehdytaumlaumln koontiympaumlristouml -kaumlsitteeseen

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant

Taumlssauml luvussa luodaan nopea katsaus koonti- ja kaumlyttoumloumlnottoprosessien automatisoimi-

seen tutustutaan jatkuvaan integraatioon sekauml sovellukseen Jenkins CI

Lisaumlksi tutustutaan projektihallintaohjelmaan Agilefant Agilefant on yksi monipuoli-

simmista kevyistauml vapaan laumlhdekoodin projektinhallintasovelluksista ja se soveltuu

niin pieniin kuin suuriinkin projekteihin

Naumlmauml sovellukset esitellaumlaumln pohjustuksena lukuja 5 ja 6 varten joissa tutustutaan

koontiympaumlristoumln tarkkailuun

41 Jatkuva integraatio

Jatkuva integraatio (Continuous Integration CI) on modernin sovelluskehityksen kul-

makivi Itse asiassa se on mullistanut sovelluskehityksen Kun jatkuva integraatio ote-

taan kaumlyttoumloumln organisaatiossa se muuttaa radikaalisti sitauml miten tyoumlryhmauml ymmaumlrtaumlauml

koko kehitysprosessin Jatkuvalla integraatiolla on potentiaalia laukaista sarja paran-

nuksia organisaation tuotteen kehitysprosessiin Se alkaa yksinkertaisesta automaatti-

sesta koonnista kehittyen systeemiksi joka automaattisesti saattaa tuotteen tuotan-

toon Hyvauml CI-infrastruktuuri mahdollistaa virheiden helpon sekauml nopean huomaamisen

ja tarjoaa kojelaudan projektin hyvinvoinnin ja muiden statistiikkojen seuraamiseen

sekauml kehittaumljille ettauml muille projektin osapuolille Jenkins The Definite Guiden mukaan

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 14: Joakim Sandqvist - Theseus

8

Kuva 6 Esimerkki opiskelijaryhmaumln tietovaraston hakemistorakenteesta

Projektinhallintapalvelin sisaumlltaumlauml Agilefant-sovelluksen josta ajetaan yhtauml instanssia

kullekin kurssin ryhmaumllle Agilefant on projektinhallintasovellus joka soveltuu hyvin

ketteraumln kehityksen tarpeisiin Sitauml kaumlytetaumlaumln ryhmaumln tyoumltuntien merkkaamiseen ja

projektin kehityksen valvomiseen Agilefantista kerrotaan tarkemmin luvussa 4

Kurssiryhmien kaumlytoumlssauml olevalle varmuuskopiopalvelimelle on tarkoitus kopioida var-

muuskopiota projektinhallinta- ja versionhallintapalvelimien tiloista Varmuuskopiointi ei

ole automatisoitua jonka takia palvelimen kaumlyttoumlmaumlaumlrauml on jaumlaumlnyt pieneksi

3 Ohjelmiston kokoaminen

Ohjelmiston kokoaminen tarkoittaa yksinkertaisimmillaan ohjelmistokoodin kaumlaumlntaumlmistauml

ajettavaan muotoon Jos ohjelmisto on iso ja sen rakenne on modulaarinen voi kehit-

taumljaumlllauml olla tarve jakaa ohjelmiston kokoaminen useisiin operaatioihin joilla on keskinaumli-

siauml riippuvuuksia

Taumlssauml luvussa tutustutaan eri tapoihin toteuttaa ohjelmiston koonti Ensin perehdytaumlaumln

makefileen ja tutustutaan ohjelmiston kokoamiseen makefile-esimerkkien avulla Tauml-

9

maumln jaumllkeen perehdytaumlaumln modernimpiin koontisovelluksiin Ant ja Maven Naumlmauml luvut

ovat tarpeellisia koontiprosessin ymmaumlrtaumlmisen kannalta

31 Makefile

Makefile on tiedosto jota Unix-komento Make kaumlyttaumlauml ohjelman kokoamiseen Makefile

kuvaa ohjelman laumlhdekooditiedostojen vaumlliset riippuvuudet ja sisaumlltaumlauml ohjeet ohjelmis-

ton kaumlaumlntaumlmiseen Kaumlaumlntaumlmisen lisaumlksi makefileen voi sisaumlllyttaumlauml mitauml vain Unix-

komentoja ja siitauml voi kaumlynnistaumlauml testejauml

Otetaan esimerkkitapaus jossa C-kieliseen ohjelmistoon kuuluu 3 tiedostoa

tiedosto1c

tiedosto2c

tiedosto1h

Ilman makefileauml ohjelma kaumlaumlnnettaumlisiin Unix-komentoriviltauml seuraavanlaisesti

gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Esimerkissauml ndashI optio kertoo kaumlaumlntaumljaumllle ettauml sen tulee etsiauml header-tiedostot tyoumlkansi-

osta Gcc-kaumlaumlntaumljauml kaumlaumlntaumlauml tiedostot ja luo sovellusohjelman rdquoesimerkkirdquo Taumlmauml laumlhes-

tymistapa ohjelmiston kaumlaumlntaumlmiseen tulee vaivalloiseksi viimeistaumlaumln siinauml vaiheessa

kun projektiin lisaumltaumlaumln tiedostoja kaumlaumlntaumlmiskomento muuttuu ja se on haettava ko-

mentorivihistoriasta tai kirjoitettava uudestaan Makefilen tekeminen ratkaisee taumlmaumln

ongelman [A Simple Makefile Tutorial]

Esimerkki makefilestauml naumlyttaumlauml taumlltauml

1 esimerkki tiedosto1c tiedosto2c

2 gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Jos yllauml olevat rivit kirjoitetaan rdquoMakefilerdquo- tai rdquomakefilerdquo-nimiseen tiedostoon ja kirjoi-

tetaan komentoriville rdquomakerdquo niin suoritetaan makefileen kirjoitettu komento (rivi 2)

Make ilman optioita suorittaa automaattisesti makefilen ensimmaumlisen kohteen (target)

joka taumlssauml tapauksessa on nimeltaumlaumln rdquoesimerkkirdquo Rivillauml 1 olevat tiedosto1c ja tiedos-

to2c kertoo makelle ettauml naumliden tiedostojen olemassaolo vaaditaan kohteen suoritta-

10

miseen Korostetaan ettauml make vaatii tabulaattorin kaumlytoumln ennen jokaista komentoa

(rivi 2) [A Simple Makefile Tutorial]

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 esimerkki tiedosto1o tiedosto2o

5 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

Edellisen esimerkin riveille 1 ja 2 on lisaumltty muuttujat rdquoKAANTAJArdquo ja rdquoOPTIOTrdquo Naumliden

muuttujien muuttaminen vaikuttaa koko tiedostoon ndash taumlssauml tapauksessa ainoastaan

riviin 5

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 all esimerkki

5

6 esimerkki tiedosto1o tiedosto2o

7 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

8

9 tiedosto1o tiedosto1c

10 gcc -c tiedosto1c

11 12 tiedosto2o tiedosto2c

13 gcc -c tiedosto2c

14 15 clean

16 rm -rf o esimerkki

Edellinen esimerkki koostuu viidestauml eri kohteesta

Ensimmaumlinen kohde rdquoallrdquo suoritetaan kun Make ajetaan ilman optioita Jotta rdquoallrdquo voi-

taisiin suorittaa pitaumlauml suorittaa ensin rdquoesimerkkirdquo (rivi 6) koska rdquoallrdquo on riippuvainen

kohteesta rdquoesimerkkirdquo

Seuraavaa kohdetta rdquoesimerkkirdquo ei voi kuitenkaan suorittaa ennen kuin Make on tar-

kastanut tiedostojen rdquotiedosto1ordquo ja rdquotiedosto2ordquo aikaleimat jos aikaleimat ovat van-

hentuneet eli tiedostot ovat muuttuneet on ajettava kohteet rdquotiedosto1ordquo sekauml rdquotie-

dosto2ordquo Naumlmauml kohteet ajettuaan voi Make siirtyauml suorittamaan kohdetta rdquoesimerkkirdquo

ja taumlmaumln jaumllkeen kohdetta rdquoallrdquo jolla ei ole toteutusta

11

Kohteella rdquocleanrdquo ei ole riippuvuuksia Taumlllaista kohdetta kutsutaan komentorivillauml ko-

mennolla rdquomake cleanrdquo Rivillauml 16 oleva komento poistaa kaikki tyoumlhakemistossa sijait-

sevat rdquoordquo-paumlaumltteiset tiedostot sekauml sovellusohjelman rdquoesimerkkirdquo

Viimeisin makefile-esimerkki on yksinkertainen ohjelmiston koonti vaikka se vaikuttaa

pelkaumlstaumlaumln ohjelman kaumlaumlntaumlmiseltauml Jos yllauml olevaa esimerkkiauml haluttaisiin kehittaumlauml li-

saumlauml voitaisiin siihen lisaumltauml esimerkiksi kohde joka hakee laumlhdekoodin tietovarastosta ja

poistaa paikalliset laumlhdekoodit kovalevyltauml ohjelman kaumlaumlntaumlmisen jaumllkeen

32 Ant

Luvussa 31 tutustuttiin makefileen joka on Maken koontikuvaustiedosto Taumlssauml luvus-

sa perehdytaumlaumln koontityoumlkalu Antin kaumlyttaumlmaumlaumln Xml-muotoiseen koontikuvaukseen

Apache Ant on Java kirjasto- ja komentorivityoumlkalu jonka tehtaumlvaumlnauml on ajaa prosesseja

jotka on kuvattu koontitiedostoissa rdquokohteinardquo joilla on keskinaumlisiauml riippuvaisuuksia

Ant on paumlaumlasiallisesti Java-sovellusten koontisovellus mutta sitauml voidaan kaumlyttaumlauml myoumls

C -ja C++ -ohjelmistojen kokoamiseen Taumlssauml luvussa on esimerkki Java-ohjelmiston

koonnista

Antin kaumlyttaumljaumlt voivat kehittaumlauml omia rdquoantlibsrdquo-kirjastoja joihin sisaumlltyy omia tehtaumlviauml

(tasks) ja tyyppejauml (types) Kaumlyttaumljille tarjotaan myoumls suuri maumlaumlrauml valmiiksi tehtyjauml

kaupallisia tai avoimia rdquoantlibsrdquo kirjastoja [Apache Ant Welcome]

Ant-koontitiedosto koostuu neljaumlstauml eri elementistauml projects targets tasks ja proper-

ties

Koontitiedostossa kuvatulla projektilla on kolme attribuuttia name default sekauml base-

dir Name kuvaa projektin nimeauml ja eikauml sitauml ole pakko maumlaumlritellauml Default kuvaa koon-

titiedoston oletuskohdetta (default target) jota kutsutaan kun kohdetta ei erikseen

anneta kokoamiskomennossa Basedir maumlaumlrittelee projektin tyoumlhakemiston jota kaumlyte-

taumlaumln hakemistopolkujen selvittaumlmiseksi Taumlmaumlkaumlaumln attribuutti ei ole pakollinen Jos

basedir-atribuuttia ei maumlaumlritellauml kaumlytetaumlaumln tyoumlhakemistona samaa hakemistoa jossa

koontitiedosto sijaitsee

12

Kohteilla (targets) on riippuvuuksia muista kohteista Kuten makefilessauml voidaan koh-

teiden vaumllille rakentaa riippuvuuksia ja luoda ohjelmiston kokoamisen kannalta jaumlrkevauml

riippuvaisuuksien verkosto

Tehtaumlvaumlt (tasks) ovat suoritettavia koodirivejauml Tehtaumlvillauml voi olla useita attribuutteja

kuten tulevasta esimerkissauml naumlhdaumlaumln

Ominaisuuksilla (properties) voidaan antaa oikoteitauml (shortcuts) komentoihin tai merk-

kijonoihin joita kaumlytetaumlaumln usein koontitiedostossa Ominaisuudella on nimi- sekauml arvo-

attribuutti [Apache Ant Using Apache Ant]

1 ltproject name=MyProject default=dist basedir=gt

2 ltdescriptiongt

3 Yksinkertainen koontikuvaustiedosto

4 ltdescriptiongt

5 lt--Asetetaan julkiset ominaisuudet --gt

6 ltproperty name=src location=srcgt

7 ltproperty name=build location=buildgt

8 ltproperty name=dist location=distgt

9

10 lttarget name=initgt

11 ltmdashLuodaan aikaleima --gt

12 lttstampgt

13 ltmdashLuodaan hakemistorakenne ldquocompilerdquo tehtaumlvaumllle --gt

14 ltmkdir dir=$buildgt

15 lttargetgt

16 17 lttarget name=compile depends=initgt

18 lt--Kaumlaumlnnetaumlaumln Java-koodi $srcstauml into $buildiin --gt

19 ltjavac srcdir=$src destdir=$buildgt

20 lttargetgt

21 22 lttarget name=dist depends=compile

23 description=Generoidaan distribuutio gt

24 lt--Luodaan distribuutio kansio --gt

25 ltmkdir dir=$distlibgt

26 27 lt-- Laitetaan $build sisaumlltouml MyProject-$DSTAMPjarriin --gt

28 ltjar jarfile=$distlibMyProject $DSTAMPjar basedir=$buildgt

29 lttargetgt

30 31 lttarget name=clean

32 description=clean up gt

33 ltmdashPoistetaan $build ja $dist hakemistot --gt

34 ltdelete dir=$buildgt

13

35 ltdelete dir=$distgt

36 lttargetgt

37 ltprojectgt

[Apache Ant Using Apache Ant Example Buildfile]

Edelliseen koontikuvaukseen on maumlaumlritelty projekti jonka nimi on ldquoMyProjectrdquo Kun

tutustutaan koonnin kuvaukseen huomataan ettauml koontitiedoston projektin oletuskoh-

teella rdquodistrdquo on riippuvuus kohteeseen rdquocompilerdquo jolla on riippuvuus kohteeseen rdquoinitrdquo

Initillauml ei ole riippuvaisuuksia Taumlten ensimmaumlinen koonnin yhteydessauml ajettava kohde

onkin rdquoinitrdquo eikauml rdquodistrdquo vaikka rdquodistrdquo on koontikuvauksen oletuskohde Voidaan sanoa

ettauml koonnin paumlaumlmaumlaumlrauml on suorittaa kohde rdquodistrdquo ja paumlaumlmaumlaumlraumln saavuttamiseksi on

suoritettava kohteita joista taumlmauml on riippuvainen Riippuvuudet toimivat samalla peri-

aatteella kuin aikaisemmissa makefile-esimerkeissauml

Ohjelmiston kokoamisen yhteydessauml halutaan edellisessauml esimerkissauml saada ohjelmisto

jakeluun Jotta ohjelmisto saataisiin jakeluun on se ensin kaumlaumlnnettaumlvauml ja sitauml ennen on

luotava ohjelmiston hakemistorakenne

Jos halutaan kehittaumlauml esimerkin koontikuvausta voidaan esimerkiksi suorittaa verk-

kosivujen paumlivitystehtaumlvauml yhden kohteen sisaumlllauml ja asettaa se riippuvaiseksi kohteesta

rdquodistrdquo Naumlin ohjelmasta saadaan paumlivitetty versio jakeluun ja verkkosivuille tulee taumlstauml

automaattinen ilmoitus ohjelmiston kaumlyttaumljille

33 Maven

Luvussa 32 tutustuttiin Anttiin joka on natiivi koontityoumlkalu Seuraavaksi tutustutaan

koonti- ja projektinhallintasovellukseen Maveniin jolla voidaan kuvata koontiprosessin

lisaumlksi myoumls projektin rakenne Maven rohkaisee kaumlyttaumlmaumlaumln parhaita kaumlytaumlntoumljauml (best

practises) joita kaumlyttaumlmaumlllauml ohjelmistoprojektista toiseen siirtyessauml oppimiskynnys

uuden koontikuvauksen ymmaumlrtaumlmiseen pienenee [Maven vs Ant or Ant vs Maven]

Maven on kaumlytoumlssauml Metropolian Ohjelmistotuotantoprojekti-kurssin ohjelmistoprojekti-

en koontityoumlkaluna

Apache Maven on ohjelmistoprojektin hallintatyoumlkalu Se perustuu projekti-olio-malli -

konseptiin (Project Object Model POM) Maven kykenee kokoamaan projektin testaa-

14

maan projektin antamaan kaumlyttaumljaumllle palautetta dokumentoimaan kokoamisen ja te-

kemaumlaumln useita muita tehtaumlviauml erillisillauml Mavenin tarjoamilla lisaumlosilla (plug-ins) [Apache

Maven Project Welcome to Apache Maven]

POM on XML-tiedosto joka sisaumlltaumlauml informaatiota projektista ja yksityiskohtaisen konfi-

guraation jota Maven kaumlyttaumlauml projektin kokoamiseen POM kostuu kohteista (goals)

jotka on maumlaumlritelty pomxml -tiedostossa Kun suoritetaan erillinen tehtaumlvauml tai kohde

Maven etsii POMmia tyoumlhakemistosta lukee POMmin hakee tarvittavan konfiguraati-

on ja suorittaa kohteen

Eraumlitauml POMissa maumlaumlriteltaumlviauml konfiguraatioita ovat projektin riippuvuudet kaumlytettaumlvaumlt

lisaumlosat ajettavat kohteet ja koontiprofiilit POMiin voi maumlaumlritellauml muutakin tietoa ku-

ten projektin version kehittaumljaumlt ja postituslistat [Apache Maven Project Introduction

to the POM]

Maven on Java-tyoumlkalu joten Java taumlytyy olla asennettuna Mavenia ajavalle koneelle

Taumlmauml luku perustuu Apachen verkkosivuilla sijaitsevaan Mavenin kaumlyttoumlohjeeseen

[Apache Maven Project Maven in 5 Minutes] Seuraavaksi luetellaan eri vaiheet Ma-

ven-projektin luomiseksi

Ensin on ladattava Maven ja kaumlytaumlvauml laumlpi asennusohjeet jotka loumlytyvaumlt osoitteesta

[httpmavenapacheorgdownloadhtmlInstallation] Taumlmaumln jaumllkeen on avattava

terminaali tai komentokehote ja kirjoitettava

mvn --version

Taumlmaumln tulostaa asennetun Mavenin ja Javan versio Esimerkiksi

1 Apache Maven 303 (r1075438 2011-02-28 183109+0100)

2 Maven home Dapache-maven-303bin

3 Java version 160_25 vendor Sun Microsystems Inc

4 Java home EProgram FilesJavajdk160_25jre

5 Default locale nl_NL platform encoding Cp1252

6 OS name windows 7 version 61 arch amd64 family windows

Maven-projekti luodaan ajamalla terminaalissa Maven kohde (goal)

15

mvn archetypegenerate -DgroupId=commycompanyapp -DartifactId=my-app -

DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Ensimmaumlisellauml ajolla taumlmauml komento lataa tarvittavat Maven lisaumlosat ja muita tiedostoja

paikalliseen tietovarastoon Huomataan ettauml rdquogeneraterdquo kohde loi rdquoartifactIdrdquonauml anne-

tun hakemiston

Kirjoitetaan komentoriville

cd my-app

Taumlmaumln kansion alta loumlytyy Mavenin standardi projektirakenne

my-app

|-- pomxml

`-- src

|-- main

| `-- java

| `-- com

| `-- mycompany

| `-- app

| `-- Appjava

`-- test

`-- java

`-- com

`-- mycompany

`-- app

`-- AppTestjava

Yllauml kuvatussa hakemistorakenteessa oleva rdquosrcmainjavardquo-hakemisto sisaumlltaumlauml projek-

tin laumlhdekoodin Vastaavasti rdquosrctestjavardquo-hakemisto sisaumlltaumlauml testien laumlhdekoodin

Pomxml-tiedosto kuvaa projektin konfiguraatiota ja sisaumlltaumlauml projektin kokoamisohjeet

Esimerkkiprojektin POM naumlyttaumlauml taumlltauml

1 ltpro-

ject xmlns=httpmavenapacheorgPOM400 xmlnsxsi=httpwwww3org20

01XMLSchema-instance

2 xsischemaLocation=httpmavenapacheorgPOM400 httpmavenapacheorg

xsdmaven-400xsdgt

3 ltmodelVersiongt400ltmodelVersiongt

4

5 ltgroupIdgtcommycompanyappltgroupIdgt

6 ltartifactIdgtmy-appltartifactIdgt

16

7 ltversiongt10-SNAPSHOTltversiongt

8 ltpackaginggtjarltpackaginggt

9

10 ltnamegtMaven Quick Start Archetypeltnamegt

11 lturlgthttpmavenapacheorglturlgt

12 13 ltdependenciesgt

14 ltdependencygt

15 ltgroupIdgtjunitltgroupIdgt

16 ltartifactIdgtjunitltartifactIdgt

17 ltversiongt482ltversiongt

18 ltscopegttestltscopegt

19 ltdependencygt

20 ltdependenciesgt

21 ltprojectgt

POM-tiedosto on Maven-projektin konfiguraation ydin Se sisaumlltaumlauml suurimman osan

informaatiosta joka vaaditaan projektin kokoamiseen halutulla tavalla

Aikaisemmassa esimerkissauml ajettiin Mavenin kohde (goal) archetypegenerate ja an-

nettiin sille parametreja Etuliite archetype on lisaumlosa joka sisaumlltaumlauml kohteen generate

Taumltauml voi verrata Antin tehtaumlvaumlaumln Taumlmauml kohde loi yksinkertaisen projektin joka perus-

tuu arkkityyppiin Yleisesti Mavenin lisaumlosat koostuvat kohteista joilla on yhteinen paumlauml-

tarkoitus Esimerkki taumlllaisesta lisaumlosasta on jboss-maven-plugin jonka tehtaumlvaumlnauml on

kaumlsitellauml erinaumlisiauml Jboss-komponentteja (items)

Maven-projekti kootaan komentoriviltauml seuraavanlaisesti

mvn package

Komentorivi tulostaa eri komentoja tulostus loppuu seuraavanlaisesti

[INFO] --------------------------

[INFO] BUILD SUCCESSFUL

[INFO] --------------------------

[INFO] Total time 2 seconds

[INFO] Finished at Thu Jul 07 213452 CEST 2011

[INFO] Final Memory 3M6M

[INFO] --------------------------

Toisin kuin ensimmaumliseksi suoritetussa komennossa (archetypegenerate) huomataan

taumlllauml kertaa kaumlytetty komento package on vain yksi sana Taumlllaista komentoa kutsutaan

17

kohteen (goal) sijaan vaiheeksi (phase) Vaihe on yksi askel koonnin elinkaaressa

(build lifecycle) joka on jaumlrjestetty sarja eri vaiheita Jos esimerkiksi ajetaan vaiheen

compile Maven itseasiassa suorittaa sarjan vaiheita

1 validate

2 generate-sources

3 process-sources

4 generate-resources

5 process-resources

6 compile

Compilen ajamisen jaumllkeen voidaan testata kaumlaumlnnettyauml JARia seuraavalla komennolla

java -cp targetmy-app-10-SNAPSHOTjar commycompanyappApp

Taumlmauml komento tulostaa

Hello World

Kaumlydaumlaumln laumlpi vielauml eri Mavenin yleisimmaumlt oletuselinkaaressa kaumlytetyt vaiheet Naumlitauml

ovat

-validate varmistaa ettauml projekti on ehjauml ja kaikki tarvittava tieto on saatavilla

-compile kaumlaumlntaumlauml projektin laumlhdekoodin

-test testaa kaumlaumlnnetyn laumlhdekoodin kaumlyttaumlen sopivaa yksikkoumltestikehystauml Naumliden

testien ei tulisi vaatia vaiheita package tai deploy

-package paketoi kaumlaumlnnetyn koodin sen jaettavaan muotoon esimerkiksi JARriksi

-integration-test prosessoi ja jaumlrjestaumlauml paketin ympaumlristoumloumln jossa integraatiotestejauml

voidaan ajaa jos tarpeellista

-verify tarkistaa onko paketti validi ja taumlyttaumlaumlkouml se laatukriteerit

-install asentaa paketin paikalliseen tietovarastoon muiden paikallisten projektien

kaumlyttoumloumln tai paikallisten projektien riippuvuudeksi

-deploy kopioi lopullisen paketin ulkoiseen tietovarastoon jaettavaksi muille kehittaumljil-

le ja projekteille Tehdaumlaumln integraatio- tai julkaisuympaumlristoumlssauml

On vielauml kaksi muuta mainitsemisen arvoista Maven-elinkaarta jotka eivaumlt sisaumllly yllauml

listattuun oletuselinkaareen Naumlitauml ovat

18

-clean poistaa aikaisempien koontien yhteydessauml luodut artifaktit

-site generoi verkkodokumentaation kyseiselle projektille

Jokainen vaihe sisaumlltaumlauml sarjan suoritettavia kohteita joiden ajaminen riippuu projektin

paketointityypistauml Jos projektin tyyppi on JAR niin package ajaa kohteen jarjar Vas-

taavasti WAR -tyyppisen projektin package -vaihe suorittaa kohteen warwar

34 Koonti ja kaumlyttoumloumlnotto

Ohjelmiston saattamista laumlhdekoodista loppukaumlyttaumljaumllle kaumlyttoumlkelpoiseen muotoon kut-

sutaan koonniksi Laumlhdekoodin kaumlaumlntaumlmisen lisaumlksi koonti voi sisaumlltaumlauml monia muita vai-

heita Aleksi Lukkarinen on opinnaumlytetyoumlssaumlaumln listannut esimerkkejauml erilaisista koon-

neista seuraavasti [Aleksi Lukkarinen opinnaumlytetyouml]

-ohjelmointikielisen laumlhdekoodin sekauml resurssien automatisoitua luomista

-eri ohjelmointikielillauml tuotetun laumlhdekoodin kaumlaumlntaumlmistauml kone- jatai vaumllikielille

-vaumlli- tai konekielisen ohjelmakoodin jaumllkikaumlsittelyauml esimerkiksi testauksen aspektioh-

jelmoinnin tai koodin tarkoituksellisen sotkemisen vuoksi

-sovelluksen testausta (esimerkiksi toimivuus tietoturvallisuus suorituskyky rakenteel-

linen ja koodaustekninen laatu sekauml kaumlyttoumltarkoitustaan vastaavuus)

-dokumentaation koontia (kuten varsinaisen sovelluksen koonti)

-koontituotteiden paketointia sekauml mahdollisten fyysisten jakelumedioiden luontia toi-

mivuus- ja virustarkistuksineen

-ohjelmistomoduulien integrointia

-palautteen antamista koonnin tuloksista

Lukkarinen jaumlsentelee opinnaumlytetyoumlssaumlaumln sovelluksen jakeluun ja kaumlyttoumloumlnottoon sisaumll-

tyviksi asioiksi

-Sovellusta suorittavien ja tukevien palvelinympaumlristoumljen luominen ja paumlivittaumlminen

-Sovelluksen sekauml sen kaumlyttaumlmien ohjelmistokomponenttien siirtaumlminen ja maumlaumlrittaumlmi-

nen esimerkiksi testaus- laadunvarmistus- esittely-koulutus- sekauml tuotantoympaumlris-

toumlihin Kohdeympaumlristoumlissauml olevat vanhat versiot on mahdollisesti paumlivitettaumlvauml jollei

uusia versiota asenneta niiden rinnalle

19

-Uusien tietokantojen luominen sekauml vanhojen paumlivittaumlminen uutta sovellusversiota

vastaaviksi

-Kirjanpidollisen materiaalin tuottaminen ja yllaumlpitaumlminen

-Palautteen antaminen jakelu- ja kaumlyttoumloumlnottoprosessin onnistumisesta

Taumlmaumln luvun tarkoitus oli perehdyttaumlauml lukija ymmaumlrtaumlmaumlaumln koontiprosessia koontiku-

vaus-esimerkkien avulla Koontiprosessin ymmaumlrtaumlminen on vaumllttaumlmaumltoumlntauml seuraavan

luvun ymmaumlrtaumlmiseen jossa perehdytaumlaumln koontiympaumlristouml -kaumlsitteeseen

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant

Taumlssauml luvussa luodaan nopea katsaus koonti- ja kaumlyttoumloumlnottoprosessien automatisoimi-

seen tutustutaan jatkuvaan integraatioon sekauml sovellukseen Jenkins CI

Lisaumlksi tutustutaan projektihallintaohjelmaan Agilefant Agilefant on yksi monipuoli-

simmista kevyistauml vapaan laumlhdekoodin projektinhallintasovelluksista ja se soveltuu

niin pieniin kuin suuriinkin projekteihin

Naumlmauml sovellukset esitellaumlaumln pohjustuksena lukuja 5 ja 6 varten joissa tutustutaan

koontiympaumlristoumln tarkkailuun

41 Jatkuva integraatio

Jatkuva integraatio (Continuous Integration CI) on modernin sovelluskehityksen kul-

makivi Itse asiassa se on mullistanut sovelluskehityksen Kun jatkuva integraatio ote-

taan kaumlyttoumloumln organisaatiossa se muuttaa radikaalisti sitauml miten tyoumlryhmauml ymmaumlrtaumlauml

koko kehitysprosessin Jatkuvalla integraatiolla on potentiaalia laukaista sarja paran-

nuksia organisaation tuotteen kehitysprosessiin Se alkaa yksinkertaisesta automaatti-

sesta koonnista kehittyen systeemiksi joka automaattisesti saattaa tuotteen tuotan-

toon Hyvauml CI-infrastruktuuri mahdollistaa virheiden helpon sekauml nopean huomaamisen

ja tarjoaa kojelaudan projektin hyvinvoinnin ja muiden statistiikkojen seuraamiseen

sekauml kehittaumljille ettauml muille projektin osapuolille Jenkins The Definite Guiden mukaan

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 15: Joakim Sandqvist - Theseus

9

maumln jaumllkeen perehdytaumlaumln modernimpiin koontisovelluksiin Ant ja Maven Naumlmauml luvut

ovat tarpeellisia koontiprosessin ymmaumlrtaumlmisen kannalta

31 Makefile

Makefile on tiedosto jota Unix-komento Make kaumlyttaumlauml ohjelman kokoamiseen Makefile

kuvaa ohjelman laumlhdekooditiedostojen vaumlliset riippuvuudet ja sisaumlltaumlauml ohjeet ohjelmis-

ton kaumlaumlntaumlmiseen Kaumlaumlntaumlmisen lisaumlksi makefileen voi sisaumlllyttaumlauml mitauml vain Unix-

komentoja ja siitauml voi kaumlynnistaumlauml testejauml

Otetaan esimerkkitapaus jossa C-kieliseen ohjelmistoon kuuluu 3 tiedostoa

tiedosto1c

tiedosto2c

tiedosto1h

Ilman makefileauml ohjelma kaumlaumlnnettaumlisiin Unix-komentoriviltauml seuraavanlaisesti

gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Esimerkissauml ndashI optio kertoo kaumlaumlntaumljaumllle ettauml sen tulee etsiauml header-tiedostot tyoumlkansi-

osta Gcc-kaumlaumlntaumljauml kaumlaumlntaumlauml tiedostot ja luo sovellusohjelman rdquoesimerkkirdquo Taumlmauml laumlhes-

tymistapa ohjelmiston kaumlaumlntaumlmiseen tulee vaivalloiseksi viimeistaumlaumln siinauml vaiheessa

kun projektiin lisaumltaumlaumln tiedostoja kaumlaumlntaumlmiskomento muuttuu ja se on haettava ko-

mentorivihistoriasta tai kirjoitettava uudestaan Makefilen tekeminen ratkaisee taumlmaumln

ongelman [A Simple Makefile Tutorial]

Esimerkki makefilestauml naumlyttaumlauml taumlltauml

1 esimerkki tiedosto1c tiedosto2c

2 gcc ndasho esimerkki tiedosto1c tiedosto2c ndashI

Jos yllauml olevat rivit kirjoitetaan rdquoMakefilerdquo- tai rdquomakefilerdquo-nimiseen tiedostoon ja kirjoi-

tetaan komentoriville rdquomakerdquo niin suoritetaan makefileen kirjoitettu komento (rivi 2)

Make ilman optioita suorittaa automaattisesti makefilen ensimmaumlisen kohteen (target)

joka taumlssauml tapauksessa on nimeltaumlaumln rdquoesimerkkirdquo Rivillauml 1 olevat tiedosto1c ja tiedos-

to2c kertoo makelle ettauml naumliden tiedostojen olemassaolo vaaditaan kohteen suoritta-

10

miseen Korostetaan ettauml make vaatii tabulaattorin kaumlytoumln ennen jokaista komentoa

(rivi 2) [A Simple Makefile Tutorial]

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 esimerkki tiedosto1o tiedosto2o

5 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

Edellisen esimerkin riveille 1 ja 2 on lisaumltty muuttujat rdquoKAANTAJArdquo ja rdquoOPTIOTrdquo Naumliden

muuttujien muuttaminen vaikuttaa koko tiedostoon ndash taumlssauml tapauksessa ainoastaan

riviin 5

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 all esimerkki

5

6 esimerkki tiedosto1o tiedosto2o

7 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

8

9 tiedosto1o tiedosto1c

10 gcc -c tiedosto1c

11 12 tiedosto2o tiedosto2c

13 gcc -c tiedosto2c

14 15 clean

16 rm -rf o esimerkki

Edellinen esimerkki koostuu viidestauml eri kohteesta

Ensimmaumlinen kohde rdquoallrdquo suoritetaan kun Make ajetaan ilman optioita Jotta rdquoallrdquo voi-

taisiin suorittaa pitaumlauml suorittaa ensin rdquoesimerkkirdquo (rivi 6) koska rdquoallrdquo on riippuvainen

kohteesta rdquoesimerkkirdquo

Seuraavaa kohdetta rdquoesimerkkirdquo ei voi kuitenkaan suorittaa ennen kuin Make on tar-

kastanut tiedostojen rdquotiedosto1ordquo ja rdquotiedosto2ordquo aikaleimat jos aikaleimat ovat van-

hentuneet eli tiedostot ovat muuttuneet on ajettava kohteet rdquotiedosto1ordquo sekauml rdquotie-

dosto2ordquo Naumlmauml kohteet ajettuaan voi Make siirtyauml suorittamaan kohdetta rdquoesimerkkirdquo

ja taumlmaumln jaumllkeen kohdetta rdquoallrdquo jolla ei ole toteutusta

11

Kohteella rdquocleanrdquo ei ole riippuvuuksia Taumlllaista kohdetta kutsutaan komentorivillauml ko-

mennolla rdquomake cleanrdquo Rivillauml 16 oleva komento poistaa kaikki tyoumlhakemistossa sijait-

sevat rdquoordquo-paumlaumltteiset tiedostot sekauml sovellusohjelman rdquoesimerkkirdquo

Viimeisin makefile-esimerkki on yksinkertainen ohjelmiston koonti vaikka se vaikuttaa

pelkaumlstaumlaumln ohjelman kaumlaumlntaumlmiseltauml Jos yllauml olevaa esimerkkiauml haluttaisiin kehittaumlauml li-

saumlauml voitaisiin siihen lisaumltauml esimerkiksi kohde joka hakee laumlhdekoodin tietovarastosta ja

poistaa paikalliset laumlhdekoodit kovalevyltauml ohjelman kaumlaumlntaumlmisen jaumllkeen

32 Ant

Luvussa 31 tutustuttiin makefileen joka on Maken koontikuvaustiedosto Taumlssauml luvus-

sa perehdytaumlaumln koontityoumlkalu Antin kaumlyttaumlmaumlaumln Xml-muotoiseen koontikuvaukseen

Apache Ant on Java kirjasto- ja komentorivityoumlkalu jonka tehtaumlvaumlnauml on ajaa prosesseja

jotka on kuvattu koontitiedostoissa rdquokohteinardquo joilla on keskinaumlisiauml riippuvaisuuksia

Ant on paumlaumlasiallisesti Java-sovellusten koontisovellus mutta sitauml voidaan kaumlyttaumlauml myoumls

C -ja C++ -ohjelmistojen kokoamiseen Taumlssauml luvussa on esimerkki Java-ohjelmiston

koonnista

Antin kaumlyttaumljaumlt voivat kehittaumlauml omia rdquoantlibsrdquo-kirjastoja joihin sisaumlltyy omia tehtaumlviauml

(tasks) ja tyyppejauml (types) Kaumlyttaumljille tarjotaan myoumls suuri maumlaumlrauml valmiiksi tehtyjauml

kaupallisia tai avoimia rdquoantlibsrdquo kirjastoja [Apache Ant Welcome]

Ant-koontitiedosto koostuu neljaumlstauml eri elementistauml projects targets tasks ja proper-

ties

Koontitiedostossa kuvatulla projektilla on kolme attribuuttia name default sekauml base-

dir Name kuvaa projektin nimeauml ja eikauml sitauml ole pakko maumlaumlritellauml Default kuvaa koon-

titiedoston oletuskohdetta (default target) jota kutsutaan kun kohdetta ei erikseen

anneta kokoamiskomennossa Basedir maumlaumlrittelee projektin tyoumlhakemiston jota kaumlyte-

taumlaumln hakemistopolkujen selvittaumlmiseksi Taumlmaumlkaumlaumln attribuutti ei ole pakollinen Jos

basedir-atribuuttia ei maumlaumlritellauml kaumlytetaumlaumln tyoumlhakemistona samaa hakemistoa jossa

koontitiedosto sijaitsee

12

Kohteilla (targets) on riippuvuuksia muista kohteista Kuten makefilessauml voidaan koh-

teiden vaumllille rakentaa riippuvuuksia ja luoda ohjelmiston kokoamisen kannalta jaumlrkevauml

riippuvaisuuksien verkosto

Tehtaumlvaumlt (tasks) ovat suoritettavia koodirivejauml Tehtaumlvillauml voi olla useita attribuutteja

kuten tulevasta esimerkissauml naumlhdaumlaumln

Ominaisuuksilla (properties) voidaan antaa oikoteitauml (shortcuts) komentoihin tai merk-

kijonoihin joita kaumlytetaumlaumln usein koontitiedostossa Ominaisuudella on nimi- sekauml arvo-

attribuutti [Apache Ant Using Apache Ant]

1 ltproject name=MyProject default=dist basedir=gt

2 ltdescriptiongt

3 Yksinkertainen koontikuvaustiedosto

4 ltdescriptiongt

5 lt--Asetetaan julkiset ominaisuudet --gt

6 ltproperty name=src location=srcgt

7 ltproperty name=build location=buildgt

8 ltproperty name=dist location=distgt

9

10 lttarget name=initgt

11 ltmdashLuodaan aikaleima --gt

12 lttstampgt

13 ltmdashLuodaan hakemistorakenne ldquocompilerdquo tehtaumlvaumllle --gt

14 ltmkdir dir=$buildgt

15 lttargetgt

16 17 lttarget name=compile depends=initgt

18 lt--Kaumlaumlnnetaumlaumln Java-koodi $srcstauml into $buildiin --gt

19 ltjavac srcdir=$src destdir=$buildgt

20 lttargetgt

21 22 lttarget name=dist depends=compile

23 description=Generoidaan distribuutio gt

24 lt--Luodaan distribuutio kansio --gt

25 ltmkdir dir=$distlibgt

26 27 lt-- Laitetaan $build sisaumlltouml MyProject-$DSTAMPjarriin --gt

28 ltjar jarfile=$distlibMyProject $DSTAMPjar basedir=$buildgt

29 lttargetgt

30 31 lttarget name=clean

32 description=clean up gt

33 ltmdashPoistetaan $build ja $dist hakemistot --gt

34 ltdelete dir=$buildgt

13

35 ltdelete dir=$distgt

36 lttargetgt

37 ltprojectgt

[Apache Ant Using Apache Ant Example Buildfile]

Edelliseen koontikuvaukseen on maumlaumlritelty projekti jonka nimi on ldquoMyProjectrdquo Kun

tutustutaan koonnin kuvaukseen huomataan ettauml koontitiedoston projektin oletuskoh-

teella rdquodistrdquo on riippuvuus kohteeseen rdquocompilerdquo jolla on riippuvuus kohteeseen rdquoinitrdquo

Initillauml ei ole riippuvaisuuksia Taumlten ensimmaumlinen koonnin yhteydessauml ajettava kohde

onkin rdquoinitrdquo eikauml rdquodistrdquo vaikka rdquodistrdquo on koontikuvauksen oletuskohde Voidaan sanoa

ettauml koonnin paumlaumlmaumlaumlrauml on suorittaa kohde rdquodistrdquo ja paumlaumlmaumlaumlraumln saavuttamiseksi on

suoritettava kohteita joista taumlmauml on riippuvainen Riippuvuudet toimivat samalla peri-

aatteella kuin aikaisemmissa makefile-esimerkeissauml

Ohjelmiston kokoamisen yhteydessauml halutaan edellisessauml esimerkissauml saada ohjelmisto

jakeluun Jotta ohjelmisto saataisiin jakeluun on se ensin kaumlaumlnnettaumlvauml ja sitauml ennen on

luotava ohjelmiston hakemistorakenne

Jos halutaan kehittaumlauml esimerkin koontikuvausta voidaan esimerkiksi suorittaa verk-

kosivujen paumlivitystehtaumlvauml yhden kohteen sisaumlllauml ja asettaa se riippuvaiseksi kohteesta

rdquodistrdquo Naumlin ohjelmasta saadaan paumlivitetty versio jakeluun ja verkkosivuille tulee taumlstauml

automaattinen ilmoitus ohjelmiston kaumlyttaumljille

33 Maven

Luvussa 32 tutustuttiin Anttiin joka on natiivi koontityoumlkalu Seuraavaksi tutustutaan

koonti- ja projektinhallintasovellukseen Maveniin jolla voidaan kuvata koontiprosessin

lisaumlksi myoumls projektin rakenne Maven rohkaisee kaumlyttaumlmaumlaumln parhaita kaumlytaumlntoumljauml (best

practises) joita kaumlyttaumlmaumlllauml ohjelmistoprojektista toiseen siirtyessauml oppimiskynnys

uuden koontikuvauksen ymmaumlrtaumlmiseen pienenee [Maven vs Ant or Ant vs Maven]

Maven on kaumlytoumlssauml Metropolian Ohjelmistotuotantoprojekti-kurssin ohjelmistoprojekti-

en koontityoumlkaluna

Apache Maven on ohjelmistoprojektin hallintatyoumlkalu Se perustuu projekti-olio-malli -

konseptiin (Project Object Model POM) Maven kykenee kokoamaan projektin testaa-

14

maan projektin antamaan kaumlyttaumljaumllle palautetta dokumentoimaan kokoamisen ja te-

kemaumlaumln useita muita tehtaumlviauml erillisillauml Mavenin tarjoamilla lisaumlosilla (plug-ins) [Apache

Maven Project Welcome to Apache Maven]

POM on XML-tiedosto joka sisaumlltaumlauml informaatiota projektista ja yksityiskohtaisen konfi-

guraation jota Maven kaumlyttaumlauml projektin kokoamiseen POM kostuu kohteista (goals)

jotka on maumlaumlritelty pomxml -tiedostossa Kun suoritetaan erillinen tehtaumlvauml tai kohde

Maven etsii POMmia tyoumlhakemistosta lukee POMmin hakee tarvittavan konfiguraati-

on ja suorittaa kohteen

Eraumlitauml POMissa maumlaumlriteltaumlviauml konfiguraatioita ovat projektin riippuvuudet kaumlytettaumlvaumlt

lisaumlosat ajettavat kohteet ja koontiprofiilit POMiin voi maumlaumlritellauml muutakin tietoa ku-

ten projektin version kehittaumljaumlt ja postituslistat [Apache Maven Project Introduction

to the POM]

Maven on Java-tyoumlkalu joten Java taumlytyy olla asennettuna Mavenia ajavalle koneelle

Taumlmauml luku perustuu Apachen verkkosivuilla sijaitsevaan Mavenin kaumlyttoumlohjeeseen

[Apache Maven Project Maven in 5 Minutes] Seuraavaksi luetellaan eri vaiheet Ma-

ven-projektin luomiseksi

Ensin on ladattava Maven ja kaumlytaumlvauml laumlpi asennusohjeet jotka loumlytyvaumlt osoitteesta

[httpmavenapacheorgdownloadhtmlInstallation] Taumlmaumln jaumllkeen on avattava

terminaali tai komentokehote ja kirjoitettava

mvn --version

Taumlmaumln tulostaa asennetun Mavenin ja Javan versio Esimerkiksi

1 Apache Maven 303 (r1075438 2011-02-28 183109+0100)

2 Maven home Dapache-maven-303bin

3 Java version 160_25 vendor Sun Microsystems Inc

4 Java home EProgram FilesJavajdk160_25jre

5 Default locale nl_NL platform encoding Cp1252

6 OS name windows 7 version 61 arch amd64 family windows

Maven-projekti luodaan ajamalla terminaalissa Maven kohde (goal)

15

mvn archetypegenerate -DgroupId=commycompanyapp -DartifactId=my-app -

DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Ensimmaumlisellauml ajolla taumlmauml komento lataa tarvittavat Maven lisaumlosat ja muita tiedostoja

paikalliseen tietovarastoon Huomataan ettauml rdquogeneraterdquo kohde loi rdquoartifactIdrdquonauml anne-

tun hakemiston

Kirjoitetaan komentoriville

cd my-app

Taumlmaumln kansion alta loumlytyy Mavenin standardi projektirakenne

my-app

|-- pomxml

`-- src

|-- main

| `-- java

| `-- com

| `-- mycompany

| `-- app

| `-- Appjava

`-- test

`-- java

`-- com

`-- mycompany

`-- app

`-- AppTestjava

Yllauml kuvatussa hakemistorakenteessa oleva rdquosrcmainjavardquo-hakemisto sisaumlltaumlauml projek-

tin laumlhdekoodin Vastaavasti rdquosrctestjavardquo-hakemisto sisaumlltaumlauml testien laumlhdekoodin

Pomxml-tiedosto kuvaa projektin konfiguraatiota ja sisaumlltaumlauml projektin kokoamisohjeet

Esimerkkiprojektin POM naumlyttaumlauml taumlltauml

1 ltpro-

ject xmlns=httpmavenapacheorgPOM400 xmlnsxsi=httpwwww3org20

01XMLSchema-instance

2 xsischemaLocation=httpmavenapacheorgPOM400 httpmavenapacheorg

xsdmaven-400xsdgt

3 ltmodelVersiongt400ltmodelVersiongt

4

5 ltgroupIdgtcommycompanyappltgroupIdgt

6 ltartifactIdgtmy-appltartifactIdgt

16

7 ltversiongt10-SNAPSHOTltversiongt

8 ltpackaginggtjarltpackaginggt

9

10 ltnamegtMaven Quick Start Archetypeltnamegt

11 lturlgthttpmavenapacheorglturlgt

12 13 ltdependenciesgt

14 ltdependencygt

15 ltgroupIdgtjunitltgroupIdgt

16 ltartifactIdgtjunitltartifactIdgt

17 ltversiongt482ltversiongt

18 ltscopegttestltscopegt

19 ltdependencygt

20 ltdependenciesgt

21 ltprojectgt

POM-tiedosto on Maven-projektin konfiguraation ydin Se sisaumlltaumlauml suurimman osan

informaatiosta joka vaaditaan projektin kokoamiseen halutulla tavalla

Aikaisemmassa esimerkissauml ajettiin Mavenin kohde (goal) archetypegenerate ja an-

nettiin sille parametreja Etuliite archetype on lisaumlosa joka sisaumlltaumlauml kohteen generate

Taumltauml voi verrata Antin tehtaumlvaumlaumln Taumlmauml kohde loi yksinkertaisen projektin joka perus-

tuu arkkityyppiin Yleisesti Mavenin lisaumlosat koostuvat kohteista joilla on yhteinen paumlauml-

tarkoitus Esimerkki taumlllaisesta lisaumlosasta on jboss-maven-plugin jonka tehtaumlvaumlnauml on

kaumlsitellauml erinaumlisiauml Jboss-komponentteja (items)

Maven-projekti kootaan komentoriviltauml seuraavanlaisesti

mvn package

Komentorivi tulostaa eri komentoja tulostus loppuu seuraavanlaisesti

[INFO] --------------------------

[INFO] BUILD SUCCESSFUL

[INFO] --------------------------

[INFO] Total time 2 seconds

[INFO] Finished at Thu Jul 07 213452 CEST 2011

[INFO] Final Memory 3M6M

[INFO] --------------------------

Toisin kuin ensimmaumliseksi suoritetussa komennossa (archetypegenerate) huomataan

taumlllauml kertaa kaumlytetty komento package on vain yksi sana Taumlllaista komentoa kutsutaan

17

kohteen (goal) sijaan vaiheeksi (phase) Vaihe on yksi askel koonnin elinkaaressa

(build lifecycle) joka on jaumlrjestetty sarja eri vaiheita Jos esimerkiksi ajetaan vaiheen

compile Maven itseasiassa suorittaa sarjan vaiheita

1 validate

2 generate-sources

3 process-sources

4 generate-resources

5 process-resources

6 compile

Compilen ajamisen jaumllkeen voidaan testata kaumlaumlnnettyauml JARia seuraavalla komennolla

java -cp targetmy-app-10-SNAPSHOTjar commycompanyappApp

Taumlmauml komento tulostaa

Hello World

Kaumlydaumlaumln laumlpi vielauml eri Mavenin yleisimmaumlt oletuselinkaaressa kaumlytetyt vaiheet Naumlitauml

ovat

-validate varmistaa ettauml projekti on ehjauml ja kaikki tarvittava tieto on saatavilla

-compile kaumlaumlntaumlauml projektin laumlhdekoodin

-test testaa kaumlaumlnnetyn laumlhdekoodin kaumlyttaumlen sopivaa yksikkoumltestikehystauml Naumliden

testien ei tulisi vaatia vaiheita package tai deploy

-package paketoi kaumlaumlnnetyn koodin sen jaettavaan muotoon esimerkiksi JARriksi

-integration-test prosessoi ja jaumlrjestaumlauml paketin ympaumlristoumloumln jossa integraatiotestejauml

voidaan ajaa jos tarpeellista

-verify tarkistaa onko paketti validi ja taumlyttaumlaumlkouml se laatukriteerit

-install asentaa paketin paikalliseen tietovarastoon muiden paikallisten projektien

kaumlyttoumloumln tai paikallisten projektien riippuvuudeksi

-deploy kopioi lopullisen paketin ulkoiseen tietovarastoon jaettavaksi muille kehittaumljil-

le ja projekteille Tehdaumlaumln integraatio- tai julkaisuympaumlristoumlssauml

On vielauml kaksi muuta mainitsemisen arvoista Maven-elinkaarta jotka eivaumlt sisaumllly yllauml

listattuun oletuselinkaareen Naumlitauml ovat

18

-clean poistaa aikaisempien koontien yhteydessauml luodut artifaktit

-site generoi verkkodokumentaation kyseiselle projektille

Jokainen vaihe sisaumlltaumlauml sarjan suoritettavia kohteita joiden ajaminen riippuu projektin

paketointityypistauml Jos projektin tyyppi on JAR niin package ajaa kohteen jarjar Vas-

taavasti WAR -tyyppisen projektin package -vaihe suorittaa kohteen warwar

34 Koonti ja kaumlyttoumloumlnotto

Ohjelmiston saattamista laumlhdekoodista loppukaumlyttaumljaumllle kaumlyttoumlkelpoiseen muotoon kut-

sutaan koonniksi Laumlhdekoodin kaumlaumlntaumlmisen lisaumlksi koonti voi sisaumlltaumlauml monia muita vai-

heita Aleksi Lukkarinen on opinnaumlytetyoumlssaumlaumln listannut esimerkkejauml erilaisista koon-

neista seuraavasti [Aleksi Lukkarinen opinnaumlytetyouml]

-ohjelmointikielisen laumlhdekoodin sekauml resurssien automatisoitua luomista

-eri ohjelmointikielillauml tuotetun laumlhdekoodin kaumlaumlntaumlmistauml kone- jatai vaumllikielille

-vaumlli- tai konekielisen ohjelmakoodin jaumllkikaumlsittelyauml esimerkiksi testauksen aspektioh-

jelmoinnin tai koodin tarkoituksellisen sotkemisen vuoksi

-sovelluksen testausta (esimerkiksi toimivuus tietoturvallisuus suorituskyky rakenteel-

linen ja koodaustekninen laatu sekauml kaumlyttoumltarkoitustaan vastaavuus)

-dokumentaation koontia (kuten varsinaisen sovelluksen koonti)

-koontituotteiden paketointia sekauml mahdollisten fyysisten jakelumedioiden luontia toi-

mivuus- ja virustarkistuksineen

-ohjelmistomoduulien integrointia

-palautteen antamista koonnin tuloksista

Lukkarinen jaumlsentelee opinnaumlytetyoumlssaumlaumln sovelluksen jakeluun ja kaumlyttoumloumlnottoon sisaumll-

tyviksi asioiksi

-Sovellusta suorittavien ja tukevien palvelinympaumlristoumljen luominen ja paumlivittaumlminen

-Sovelluksen sekauml sen kaumlyttaumlmien ohjelmistokomponenttien siirtaumlminen ja maumlaumlrittaumlmi-

nen esimerkiksi testaus- laadunvarmistus- esittely-koulutus- sekauml tuotantoympaumlris-

toumlihin Kohdeympaumlristoumlissauml olevat vanhat versiot on mahdollisesti paumlivitettaumlvauml jollei

uusia versiota asenneta niiden rinnalle

19

-Uusien tietokantojen luominen sekauml vanhojen paumlivittaumlminen uutta sovellusversiota

vastaaviksi

-Kirjanpidollisen materiaalin tuottaminen ja yllaumlpitaumlminen

-Palautteen antaminen jakelu- ja kaumlyttoumloumlnottoprosessin onnistumisesta

Taumlmaumln luvun tarkoitus oli perehdyttaumlauml lukija ymmaumlrtaumlmaumlaumln koontiprosessia koontiku-

vaus-esimerkkien avulla Koontiprosessin ymmaumlrtaumlminen on vaumllttaumlmaumltoumlntauml seuraavan

luvun ymmaumlrtaumlmiseen jossa perehdytaumlaumln koontiympaumlristouml -kaumlsitteeseen

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant

Taumlssauml luvussa luodaan nopea katsaus koonti- ja kaumlyttoumloumlnottoprosessien automatisoimi-

seen tutustutaan jatkuvaan integraatioon sekauml sovellukseen Jenkins CI

Lisaumlksi tutustutaan projektihallintaohjelmaan Agilefant Agilefant on yksi monipuoli-

simmista kevyistauml vapaan laumlhdekoodin projektinhallintasovelluksista ja se soveltuu

niin pieniin kuin suuriinkin projekteihin

Naumlmauml sovellukset esitellaumlaumln pohjustuksena lukuja 5 ja 6 varten joissa tutustutaan

koontiympaumlristoumln tarkkailuun

41 Jatkuva integraatio

Jatkuva integraatio (Continuous Integration CI) on modernin sovelluskehityksen kul-

makivi Itse asiassa se on mullistanut sovelluskehityksen Kun jatkuva integraatio ote-

taan kaumlyttoumloumln organisaatiossa se muuttaa radikaalisti sitauml miten tyoumlryhmauml ymmaumlrtaumlauml

koko kehitysprosessin Jatkuvalla integraatiolla on potentiaalia laukaista sarja paran-

nuksia organisaation tuotteen kehitysprosessiin Se alkaa yksinkertaisesta automaatti-

sesta koonnista kehittyen systeemiksi joka automaattisesti saattaa tuotteen tuotan-

toon Hyvauml CI-infrastruktuuri mahdollistaa virheiden helpon sekauml nopean huomaamisen

ja tarjoaa kojelaudan projektin hyvinvoinnin ja muiden statistiikkojen seuraamiseen

sekauml kehittaumljille ettauml muille projektin osapuolille Jenkins The Definite Guiden mukaan

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 16: Joakim Sandqvist - Theseus

10

miseen Korostetaan ettauml make vaatii tabulaattorin kaumlytoumln ennen jokaista komentoa

(rivi 2) [A Simple Makefile Tutorial]

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 esimerkki tiedosto1o tiedosto2o

5 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

Edellisen esimerkin riveille 1 ja 2 on lisaumltty muuttujat rdquoKAANTAJArdquo ja rdquoOPTIOTrdquo Naumliden

muuttujien muuttaminen vaikuttaa koko tiedostoon ndash taumlssauml tapauksessa ainoastaan

riviin 5

1 KAANTAJA=gcc

2 OPTIOT=-I

3

4 all esimerkki

5

6 esimerkki tiedosto1o tiedosto2o

7 $(CC) -o esimerkki tiedosto1o tiedosto2o $(OPTIOT)

8

9 tiedosto1o tiedosto1c

10 gcc -c tiedosto1c

11 12 tiedosto2o tiedosto2c

13 gcc -c tiedosto2c

14 15 clean

16 rm -rf o esimerkki

Edellinen esimerkki koostuu viidestauml eri kohteesta

Ensimmaumlinen kohde rdquoallrdquo suoritetaan kun Make ajetaan ilman optioita Jotta rdquoallrdquo voi-

taisiin suorittaa pitaumlauml suorittaa ensin rdquoesimerkkirdquo (rivi 6) koska rdquoallrdquo on riippuvainen

kohteesta rdquoesimerkkirdquo

Seuraavaa kohdetta rdquoesimerkkirdquo ei voi kuitenkaan suorittaa ennen kuin Make on tar-

kastanut tiedostojen rdquotiedosto1ordquo ja rdquotiedosto2ordquo aikaleimat jos aikaleimat ovat van-

hentuneet eli tiedostot ovat muuttuneet on ajettava kohteet rdquotiedosto1ordquo sekauml rdquotie-

dosto2ordquo Naumlmauml kohteet ajettuaan voi Make siirtyauml suorittamaan kohdetta rdquoesimerkkirdquo

ja taumlmaumln jaumllkeen kohdetta rdquoallrdquo jolla ei ole toteutusta

11

Kohteella rdquocleanrdquo ei ole riippuvuuksia Taumlllaista kohdetta kutsutaan komentorivillauml ko-

mennolla rdquomake cleanrdquo Rivillauml 16 oleva komento poistaa kaikki tyoumlhakemistossa sijait-

sevat rdquoordquo-paumlaumltteiset tiedostot sekauml sovellusohjelman rdquoesimerkkirdquo

Viimeisin makefile-esimerkki on yksinkertainen ohjelmiston koonti vaikka se vaikuttaa

pelkaumlstaumlaumln ohjelman kaumlaumlntaumlmiseltauml Jos yllauml olevaa esimerkkiauml haluttaisiin kehittaumlauml li-

saumlauml voitaisiin siihen lisaumltauml esimerkiksi kohde joka hakee laumlhdekoodin tietovarastosta ja

poistaa paikalliset laumlhdekoodit kovalevyltauml ohjelman kaumlaumlntaumlmisen jaumllkeen

32 Ant

Luvussa 31 tutustuttiin makefileen joka on Maken koontikuvaustiedosto Taumlssauml luvus-

sa perehdytaumlaumln koontityoumlkalu Antin kaumlyttaumlmaumlaumln Xml-muotoiseen koontikuvaukseen

Apache Ant on Java kirjasto- ja komentorivityoumlkalu jonka tehtaumlvaumlnauml on ajaa prosesseja

jotka on kuvattu koontitiedostoissa rdquokohteinardquo joilla on keskinaumlisiauml riippuvaisuuksia

Ant on paumlaumlasiallisesti Java-sovellusten koontisovellus mutta sitauml voidaan kaumlyttaumlauml myoumls

C -ja C++ -ohjelmistojen kokoamiseen Taumlssauml luvussa on esimerkki Java-ohjelmiston

koonnista

Antin kaumlyttaumljaumlt voivat kehittaumlauml omia rdquoantlibsrdquo-kirjastoja joihin sisaumlltyy omia tehtaumlviauml

(tasks) ja tyyppejauml (types) Kaumlyttaumljille tarjotaan myoumls suuri maumlaumlrauml valmiiksi tehtyjauml

kaupallisia tai avoimia rdquoantlibsrdquo kirjastoja [Apache Ant Welcome]

Ant-koontitiedosto koostuu neljaumlstauml eri elementistauml projects targets tasks ja proper-

ties

Koontitiedostossa kuvatulla projektilla on kolme attribuuttia name default sekauml base-

dir Name kuvaa projektin nimeauml ja eikauml sitauml ole pakko maumlaumlritellauml Default kuvaa koon-

titiedoston oletuskohdetta (default target) jota kutsutaan kun kohdetta ei erikseen

anneta kokoamiskomennossa Basedir maumlaumlrittelee projektin tyoumlhakemiston jota kaumlyte-

taumlaumln hakemistopolkujen selvittaumlmiseksi Taumlmaumlkaumlaumln attribuutti ei ole pakollinen Jos

basedir-atribuuttia ei maumlaumlritellauml kaumlytetaumlaumln tyoumlhakemistona samaa hakemistoa jossa

koontitiedosto sijaitsee

12

Kohteilla (targets) on riippuvuuksia muista kohteista Kuten makefilessauml voidaan koh-

teiden vaumllille rakentaa riippuvuuksia ja luoda ohjelmiston kokoamisen kannalta jaumlrkevauml

riippuvaisuuksien verkosto

Tehtaumlvaumlt (tasks) ovat suoritettavia koodirivejauml Tehtaumlvillauml voi olla useita attribuutteja

kuten tulevasta esimerkissauml naumlhdaumlaumln

Ominaisuuksilla (properties) voidaan antaa oikoteitauml (shortcuts) komentoihin tai merk-

kijonoihin joita kaumlytetaumlaumln usein koontitiedostossa Ominaisuudella on nimi- sekauml arvo-

attribuutti [Apache Ant Using Apache Ant]

1 ltproject name=MyProject default=dist basedir=gt

2 ltdescriptiongt

3 Yksinkertainen koontikuvaustiedosto

4 ltdescriptiongt

5 lt--Asetetaan julkiset ominaisuudet --gt

6 ltproperty name=src location=srcgt

7 ltproperty name=build location=buildgt

8 ltproperty name=dist location=distgt

9

10 lttarget name=initgt

11 ltmdashLuodaan aikaleima --gt

12 lttstampgt

13 ltmdashLuodaan hakemistorakenne ldquocompilerdquo tehtaumlvaumllle --gt

14 ltmkdir dir=$buildgt

15 lttargetgt

16 17 lttarget name=compile depends=initgt

18 lt--Kaumlaumlnnetaumlaumln Java-koodi $srcstauml into $buildiin --gt

19 ltjavac srcdir=$src destdir=$buildgt

20 lttargetgt

21 22 lttarget name=dist depends=compile

23 description=Generoidaan distribuutio gt

24 lt--Luodaan distribuutio kansio --gt

25 ltmkdir dir=$distlibgt

26 27 lt-- Laitetaan $build sisaumlltouml MyProject-$DSTAMPjarriin --gt

28 ltjar jarfile=$distlibMyProject $DSTAMPjar basedir=$buildgt

29 lttargetgt

30 31 lttarget name=clean

32 description=clean up gt

33 ltmdashPoistetaan $build ja $dist hakemistot --gt

34 ltdelete dir=$buildgt

13

35 ltdelete dir=$distgt

36 lttargetgt

37 ltprojectgt

[Apache Ant Using Apache Ant Example Buildfile]

Edelliseen koontikuvaukseen on maumlaumlritelty projekti jonka nimi on ldquoMyProjectrdquo Kun

tutustutaan koonnin kuvaukseen huomataan ettauml koontitiedoston projektin oletuskoh-

teella rdquodistrdquo on riippuvuus kohteeseen rdquocompilerdquo jolla on riippuvuus kohteeseen rdquoinitrdquo

Initillauml ei ole riippuvaisuuksia Taumlten ensimmaumlinen koonnin yhteydessauml ajettava kohde

onkin rdquoinitrdquo eikauml rdquodistrdquo vaikka rdquodistrdquo on koontikuvauksen oletuskohde Voidaan sanoa

ettauml koonnin paumlaumlmaumlaumlrauml on suorittaa kohde rdquodistrdquo ja paumlaumlmaumlaumlraumln saavuttamiseksi on

suoritettava kohteita joista taumlmauml on riippuvainen Riippuvuudet toimivat samalla peri-

aatteella kuin aikaisemmissa makefile-esimerkeissauml

Ohjelmiston kokoamisen yhteydessauml halutaan edellisessauml esimerkissauml saada ohjelmisto

jakeluun Jotta ohjelmisto saataisiin jakeluun on se ensin kaumlaumlnnettaumlvauml ja sitauml ennen on

luotava ohjelmiston hakemistorakenne

Jos halutaan kehittaumlauml esimerkin koontikuvausta voidaan esimerkiksi suorittaa verk-

kosivujen paumlivitystehtaumlvauml yhden kohteen sisaumlllauml ja asettaa se riippuvaiseksi kohteesta

rdquodistrdquo Naumlin ohjelmasta saadaan paumlivitetty versio jakeluun ja verkkosivuille tulee taumlstauml

automaattinen ilmoitus ohjelmiston kaumlyttaumljille

33 Maven

Luvussa 32 tutustuttiin Anttiin joka on natiivi koontityoumlkalu Seuraavaksi tutustutaan

koonti- ja projektinhallintasovellukseen Maveniin jolla voidaan kuvata koontiprosessin

lisaumlksi myoumls projektin rakenne Maven rohkaisee kaumlyttaumlmaumlaumln parhaita kaumlytaumlntoumljauml (best

practises) joita kaumlyttaumlmaumlllauml ohjelmistoprojektista toiseen siirtyessauml oppimiskynnys

uuden koontikuvauksen ymmaumlrtaumlmiseen pienenee [Maven vs Ant or Ant vs Maven]

Maven on kaumlytoumlssauml Metropolian Ohjelmistotuotantoprojekti-kurssin ohjelmistoprojekti-

en koontityoumlkaluna

Apache Maven on ohjelmistoprojektin hallintatyoumlkalu Se perustuu projekti-olio-malli -

konseptiin (Project Object Model POM) Maven kykenee kokoamaan projektin testaa-

14

maan projektin antamaan kaumlyttaumljaumllle palautetta dokumentoimaan kokoamisen ja te-

kemaumlaumln useita muita tehtaumlviauml erillisillauml Mavenin tarjoamilla lisaumlosilla (plug-ins) [Apache

Maven Project Welcome to Apache Maven]

POM on XML-tiedosto joka sisaumlltaumlauml informaatiota projektista ja yksityiskohtaisen konfi-

guraation jota Maven kaumlyttaumlauml projektin kokoamiseen POM kostuu kohteista (goals)

jotka on maumlaumlritelty pomxml -tiedostossa Kun suoritetaan erillinen tehtaumlvauml tai kohde

Maven etsii POMmia tyoumlhakemistosta lukee POMmin hakee tarvittavan konfiguraati-

on ja suorittaa kohteen

Eraumlitauml POMissa maumlaumlriteltaumlviauml konfiguraatioita ovat projektin riippuvuudet kaumlytettaumlvaumlt

lisaumlosat ajettavat kohteet ja koontiprofiilit POMiin voi maumlaumlritellauml muutakin tietoa ku-

ten projektin version kehittaumljaumlt ja postituslistat [Apache Maven Project Introduction

to the POM]

Maven on Java-tyoumlkalu joten Java taumlytyy olla asennettuna Mavenia ajavalle koneelle

Taumlmauml luku perustuu Apachen verkkosivuilla sijaitsevaan Mavenin kaumlyttoumlohjeeseen

[Apache Maven Project Maven in 5 Minutes] Seuraavaksi luetellaan eri vaiheet Ma-

ven-projektin luomiseksi

Ensin on ladattava Maven ja kaumlytaumlvauml laumlpi asennusohjeet jotka loumlytyvaumlt osoitteesta

[httpmavenapacheorgdownloadhtmlInstallation] Taumlmaumln jaumllkeen on avattava

terminaali tai komentokehote ja kirjoitettava

mvn --version

Taumlmaumln tulostaa asennetun Mavenin ja Javan versio Esimerkiksi

1 Apache Maven 303 (r1075438 2011-02-28 183109+0100)

2 Maven home Dapache-maven-303bin

3 Java version 160_25 vendor Sun Microsystems Inc

4 Java home EProgram FilesJavajdk160_25jre

5 Default locale nl_NL platform encoding Cp1252

6 OS name windows 7 version 61 arch amd64 family windows

Maven-projekti luodaan ajamalla terminaalissa Maven kohde (goal)

15

mvn archetypegenerate -DgroupId=commycompanyapp -DartifactId=my-app -

DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Ensimmaumlisellauml ajolla taumlmauml komento lataa tarvittavat Maven lisaumlosat ja muita tiedostoja

paikalliseen tietovarastoon Huomataan ettauml rdquogeneraterdquo kohde loi rdquoartifactIdrdquonauml anne-

tun hakemiston

Kirjoitetaan komentoriville

cd my-app

Taumlmaumln kansion alta loumlytyy Mavenin standardi projektirakenne

my-app

|-- pomxml

`-- src

|-- main

| `-- java

| `-- com

| `-- mycompany

| `-- app

| `-- Appjava

`-- test

`-- java

`-- com

`-- mycompany

`-- app

`-- AppTestjava

Yllauml kuvatussa hakemistorakenteessa oleva rdquosrcmainjavardquo-hakemisto sisaumlltaumlauml projek-

tin laumlhdekoodin Vastaavasti rdquosrctestjavardquo-hakemisto sisaumlltaumlauml testien laumlhdekoodin

Pomxml-tiedosto kuvaa projektin konfiguraatiota ja sisaumlltaumlauml projektin kokoamisohjeet

Esimerkkiprojektin POM naumlyttaumlauml taumlltauml

1 ltpro-

ject xmlns=httpmavenapacheorgPOM400 xmlnsxsi=httpwwww3org20

01XMLSchema-instance

2 xsischemaLocation=httpmavenapacheorgPOM400 httpmavenapacheorg

xsdmaven-400xsdgt

3 ltmodelVersiongt400ltmodelVersiongt

4

5 ltgroupIdgtcommycompanyappltgroupIdgt

6 ltartifactIdgtmy-appltartifactIdgt

16

7 ltversiongt10-SNAPSHOTltversiongt

8 ltpackaginggtjarltpackaginggt

9

10 ltnamegtMaven Quick Start Archetypeltnamegt

11 lturlgthttpmavenapacheorglturlgt

12 13 ltdependenciesgt

14 ltdependencygt

15 ltgroupIdgtjunitltgroupIdgt

16 ltartifactIdgtjunitltartifactIdgt

17 ltversiongt482ltversiongt

18 ltscopegttestltscopegt

19 ltdependencygt

20 ltdependenciesgt

21 ltprojectgt

POM-tiedosto on Maven-projektin konfiguraation ydin Se sisaumlltaumlauml suurimman osan

informaatiosta joka vaaditaan projektin kokoamiseen halutulla tavalla

Aikaisemmassa esimerkissauml ajettiin Mavenin kohde (goal) archetypegenerate ja an-

nettiin sille parametreja Etuliite archetype on lisaumlosa joka sisaumlltaumlauml kohteen generate

Taumltauml voi verrata Antin tehtaumlvaumlaumln Taumlmauml kohde loi yksinkertaisen projektin joka perus-

tuu arkkityyppiin Yleisesti Mavenin lisaumlosat koostuvat kohteista joilla on yhteinen paumlauml-

tarkoitus Esimerkki taumlllaisesta lisaumlosasta on jboss-maven-plugin jonka tehtaumlvaumlnauml on

kaumlsitellauml erinaumlisiauml Jboss-komponentteja (items)

Maven-projekti kootaan komentoriviltauml seuraavanlaisesti

mvn package

Komentorivi tulostaa eri komentoja tulostus loppuu seuraavanlaisesti

[INFO] --------------------------

[INFO] BUILD SUCCESSFUL

[INFO] --------------------------

[INFO] Total time 2 seconds

[INFO] Finished at Thu Jul 07 213452 CEST 2011

[INFO] Final Memory 3M6M

[INFO] --------------------------

Toisin kuin ensimmaumliseksi suoritetussa komennossa (archetypegenerate) huomataan

taumlllauml kertaa kaumlytetty komento package on vain yksi sana Taumlllaista komentoa kutsutaan

17

kohteen (goal) sijaan vaiheeksi (phase) Vaihe on yksi askel koonnin elinkaaressa

(build lifecycle) joka on jaumlrjestetty sarja eri vaiheita Jos esimerkiksi ajetaan vaiheen

compile Maven itseasiassa suorittaa sarjan vaiheita

1 validate

2 generate-sources

3 process-sources

4 generate-resources

5 process-resources

6 compile

Compilen ajamisen jaumllkeen voidaan testata kaumlaumlnnettyauml JARia seuraavalla komennolla

java -cp targetmy-app-10-SNAPSHOTjar commycompanyappApp

Taumlmauml komento tulostaa

Hello World

Kaumlydaumlaumln laumlpi vielauml eri Mavenin yleisimmaumlt oletuselinkaaressa kaumlytetyt vaiheet Naumlitauml

ovat

-validate varmistaa ettauml projekti on ehjauml ja kaikki tarvittava tieto on saatavilla

-compile kaumlaumlntaumlauml projektin laumlhdekoodin

-test testaa kaumlaumlnnetyn laumlhdekoodin kaumlyttaumlen sopivaa yksikkoumltestikehystauml Naumliden

testien ei tulisi vaatia vaiheita package tai deploy

-package paketoi kaumlaumlnnetyn koodin sen jaettavaan muotoon esimerkiksi JARriksi

-integration-test prosessoi ja jaumlrjestaumlauml paketin ympaumlristoumloumln jossa integraatiotestejauml

voidaan ajaa jos tarpeellista

-verify tarkistaa onko paketti validi ja taumlyttaumlaumlkouml se laatukriteerit

-install asentaa paketin paikalliseen tietovarastoon muiden paikallisten projektien

kaumlyttoumloumln tai paikallisten projektien riippuvuudeksi

-deploy kopioi lopullisen paketin ulkoiseen tietovarastoon jaettavaksi muille kehittaumljil-

le ja projekteille Tehdaumlaumln integraatio- tai julkaisuympaumlristoumlssauml

On vielauml kaksi muuta mainitsemisen arvoista Maven-elinkaarta jotka eivaumlt sisaumllly yllauml

listattuun oletuselinkaareen Naumlitauml ovat

18

-clean poistaa aikaisempien koontien yhteydessauml luodut artifaktit

-site generoi verkkodokumentaation kyseiselle projektille

Jokainen vaihe sisaumlltaumlauml sarjan suoritettavia kohteita joiden ajaminen riippuu projektin

paketointityypistauml Jos projektin tyyppi on JAR niin package ajaa kohteen jarjar Vas-

taavasti WAR -tyyppisen projektin package -vaihe suorittaa kohteen warwar

34 Koonti ja kaumlyttoumloumlnotto

Ohjelmiston saattamista laumlhdekoodista loppukaumlyttaumljaumllle kaumlyttoumlkelpoiseen muotoon kut-

sutaan koonniksi Laumlhdekoodin kaumlaumlntaumlmisen lisaumlksi koonti voi sisaumlltaumlauml monia muita vai-

heita Aleksi Lukkarinen on opinnaumlytetyoumlssaumlaumln listannut esimerkkejauml erilaisista koon-

neista seuraavasti [Aleksi Lukkarinen opinnaumlytetyouml]

-ohjelmointikielisen laumlhdekoodin sekauml resurssien automatisoitua luomista

-eri ohjelmointikielillauml tuotetun laumlhdekoodin kaumlaumlntaumlmistauml kone- jatai vaumllikielille

-vaumlli- tai konekielisen ohjelmakoodin jaumllkikaumlsittelyauml esimerkiksi testauksen aspektioh-

jelmoinnin tai koodin tarkoituksellisen sotkemisen vuoksi

-sovelluksen testausta (esimerkiksi toimivuus tietoturvallisuus suorituskyky rakenteel-

linen ja koodaustekninen laatu sekauml kaumlyttoumltarkoitustaan vastaavuus)

-dokumentaation koontia (kuten varsinaisen sovelluksen koonti)

-koontituotteiden paketointia sekauml mahdollisten fyysisten jakelumedioiden luontia toi-

mivuus- ja virustarkistuksineen

-ohjelmistomoduulien integrointia

-palautteen antamista koonnin tuloksista

Lukkarinen jaumlsentelee opinnaumlytetyoumlssaumlaumln sovelluksen jakeluun ja kaumlyttoumloumlnottoon sisaumll-

tyviksi asioiksi

-Sovellusta suorittavien ja tukevien palvelinympaumlristoumljen luominen ja paumlivittaumlminen

-Sovelluksen sekauml sen kaumlyttaumlmien ohjelmistokomponenttien siirtaumlminen ja maumlaumlrittaumlmi-

nen esimerkiksi testaus- laadunvarmistus- esittely-koulutus- sekauml tuotantoympaumlris-

toumlihin Kohdeympaumlristoumlissauml olevat vanhat versiot on mahdollisesti paumlivitettaumlvauml jollei

uusia versiota asenneta niiden rinnalle

19

-Uusien tietokantojen luominen sekauml vanhojen paumlivittaumlminen uutta sovellusversiota

vastaaviksi

-Kirjanpidollisen materiaalin tuottaminen ja yllaumlpitaumlminen

-Palautteen antaminen jakelu- ja kaumlyttoumloumlnottoprosessin onnistumisesta

Taumlmaumln luvun tarkoitus oli perehdyttaumlauml lukija ymmaumlrtaumlmaumlaumln koontiprosessia koontiku-

vaus-esimerkkien avulla Koontiprosessin ymmaumlrtaumlminen on vaumllttaumlmaumltoumlntauml seuraavan

luvun ymmaumlrtaumlmiseen jossa perehdytaumlaumln koontiympaumlristouml -kaumlsitteeseen

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant

Taumlssauml luvussa luodaan nopea katsaus koonti- ja kaumlyttoumloumlnottoprosessien automatisoimi-

seen tutustutaan jatkuvaan integraatioon sekauml sovellukseen Jenkins CI

Lisaumlksi tutustutaan projektihallintaohjelmaan Agilefant Agilefant on yksi monipuoli-

simmista kevyistauml vapaan laumlhdekoodin projektinhallintasovelluksista ja se soveltuu

niin pieniin kuin suuriinkin projekteihin

Naumlmauml sovellukset esitellaumlaumln pohjustuksena lukuja 5 ja 6 varten joissa tutustutaan

koontiympaumlristoumln tarkkailuun

41 Jatkuva integraatio

Jatkuva integraatio (Continuous Integration CI) on modernin sovelluskehityksen kul-

makivi Itse asiassa se on mullistanut sovelluskehityksen Kun jatkuva integraatio ote-

taan kaumlyttoumloumln organisaatiossa se muuttaa radikaalisti sitauml miten tyoumlryhmauml ymmaumlrtaumlauml

koko kehitysprosessin Jatkuvalla integraatiolla on potentiaalia laukaista sarja paran-

nuksia organisaation tuotteen kehitysprosessiin Se alkaa yksinkertaisesta automaatti-

sesta koonnista kehittyen systeemiksi joka automaattisesti saattaa tuotteen tuotan-

toon Hyvauml CI-infrastruktuuri mahdollistaa virheiden helpon sekauml nopean huomaamisen

ja tarjoaa kojelaudan projektin hyvinvoinnin ja muiden statistiikkojen seuraamiseen

sekauml kehittaumljille ettauml muille projektin osapuolille Jenkins The Definite Guiden mukaan

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 17: Joakim Sandqvist - Theseus

11

Kohteella rdquocleanrdquo ei ole riippuvuuksia Taumlllaista kohdetta kutsutaan komentorivillauml ko-

mennolla rdquomake cleanrdquo Rivillauml 16 oleva komento poistaa kaikki tyoumlhakemistossa sijait-

sevat rdquoordquo-paumlaumltteiset tiedostot sekauml sovellusohjelman rdquoesimerkkirdquo

Viimeisin makefile-esimerkki on yksinkertainen ohjelmiston koonti vaikka se vaikuttaa

pelkaumlstaumlaumln ohjelman kaumlaumlntaumlmiseltauml Jos yllauml olevaa esimerkkiauml haluttaisiin kehittaumlauml li-

saumlauml voitaisiin siihen lisaumltauml esimerkiksi kohde joka hakee laumlhdekoodin tietovarastosta ja

poistaa paikalliset laumlhdekoodit kovalevyltauml ohjelman kaumlaumlntaumlmisen jaumllkeen

32 Ant

Luvussa 31 tutustuttiin makefileen joka on Maken koontikuvaustiedosto Taumlssauml luvus-

sa perehdytaumlaumln koontityoumlkalu Antin kaumlyttaumlmaumlaumln Xml-muotoiseen koontikuvaukseen

Apache Ant on Java kirjasto- ja komentorivityoumlkalu jonka tehtaumlvaumlnauml on ajaa prosesseja

jotka on kuvattu koontitiedostoissa rdquokohteinardquo joilla on keskinaumlisiauml riippuvaisuuksia

Ant on paumlaumlasiallisesti Java-sovellusten koontisovellus mutta sitauml voidaan kaumlyttaumlauml myoumls

C -ja C++ -ohjelmistojen kokoamiseen Taumlssauml luvussa on esimerkki Java-ohjelmiston

koonnista

Antin kaumlyttaumljaumlt voivat kehittaumlauml omia rdquoantlibsrdquo-kirjastoja joihin sisaumlltyy omia tehtaumlviauml

(tasks) ja tyyppejauml (types) Kaumlyttaumljille tarjotaan myoumls suuri maumlaumlrauml valmiiksi tehtyjauml

kaupallisia tai avoimia rdquoantlibsrdquo kirjastoja [Apache Ant Welcome]

Ant-koontitiedosto koostuu neljaumlstauml eri elementistauml projects targets tasks ja proper-

ties

Koontitiedostossa kuvatulla projektilla on kolme attribuuttia name default sekauml base-

dir Name kuvaa projektin nimeauml ja eikauml sitauml ole pakko maumlaumlritellauml Default kuvaa koon-

titiedoston oletuskohdetta (default target) jota kutsutaan kun kohdetta ei erikseen

anneta kokoamiskomennossa Basedir maumlaumlrittelee projektin tyoumlhakemiston jota kaumlyte-

taumlaumln hakemistopolkujen selvittaumlmiseksi Taumlmaumlkaumlaumln attribuutti ei ole pakollinen Jos

basedir-atribuuttia ei maumlaumlritellauml kaumlytetaumlaumln tyoumlhakemistona samaa hakemistoa jossa

koontitiedosto sijaitsee

12

Kohteilla (targets) on riippuvuuksia muista kohteista Kuten makefilessauml voidaan koh-

teiden vaumllille rakentaa riippuvuuksia ja luoda ohjelmiston kokoamisen kannalta jaumlrkevauml

riippuvaisuuksien verkosto

Tehtaumlvaumlt (tasks) ovat suoritettavia koodirivejauml Tehtaumlvillauml voi olla useita attribuutteja

kuten tulevasta esimerkissauml naumlhdaumlaumln

Ominaisuuksilla (properties) voidaan antaa oikoteitauml (shortcuts) komentoihin tai merk-

kijonoihin joita kaumlytetaumlaumln usein koontitiedostossa Ominaisuudella on nimi- sekauml arvo-

attribuutti [Apache Ant Using Apache Ant]

1 ltproject name=MyProject default=dist basedir=gt

2 ltdescriptiongt

3 Yksinkertainen koontikuvaustiedosto

4 ltdescriptiongt

5 lt--Asetetaan julkiset ominaisuudet --gt

6 ltproperty name=src location=srcgt

7 ltproperty name=build location=buildgt

8 ltproperty name=dist location=distgt

9

10 lttarget name=initgt

11 ltmdashLuodaan aikaleima --gt

12 lttstampgt

13 ltmdashLuodaan hakemistorakenne ldquocompilerdquo tehtaumlvaumllle --gt

14 ltmkdir dir=$buildgt

15 lttargetgt

16 17 lttarget name=compile depends=initgt

18 lt--Kaumlaumlnnetaumlaumln Java-koodi $srcstauml into $buildiin --gt

19 ltjavac srcdir=$src destdir=$buildgt

20 lttargetgt

21 22 lttarget name=dist depends=compile

23 description=Generoidaan distribuutio gt

24 lt--Luodaan distribuutio kansio --gt

25 ltmkdir dir=$distlibgt

26 27 lt-- Laitetaan $build sisaumlltouml MyProject-$DSTAMPjarriin --gt

28 ltjar jarfile=$distlibMyProject $DSTAMPjar basedir=$buildgt

29 lttargetgt

30 31 lttarget name=clean

32 description=clean up gt

33 ltmdashPoistetaan $build ja $dist hakemistot --gt

34 ltdelete dir=$buildgt

13

35 ltdelete dir=$distgt

36 lttargetgt

37 ltprojectgt

[Apache Ant Using Apache Ant Example Buildfile]

Edelliseen koontikuvaukseen on maumlaumlritelty projekti jonka nimi on ldquoMyProjectrdquo Kun

tutustutaan koonnin kuvaukseen huomataan ettauml koontitiedoston projektin oletuskoh-

teella rdquodistrdquo on riippuvuus kohteeseen rdquocompilerdquo jolla on riippuvuus kohteeseen rdquoinitrdquo

Initillauml ei ole riippuvaisuuksia Taumlten ensimmaumlinen koonnin yhteydessauml ajettava kohde

onkin rdquoinitrdquo eikauml rdquodistrdquo vaikka rdquodistrdquo on koontikuvauksen oletuskohde Voidaan sanoa

ettauml koonnin paumlaumlmaumlaumlrauml on suorittaa kohde rdquodistrdquo ja paumlaumlmaumlaumlraumln saavuttamiseksi on

suoritettava kohteita joista taumlmauml on riippuvainen Riippuvuudet toimivat samalla peri-

aatteella kuin aikaisemmissa makefile-esimerkeissauml

Ohjelmiston kokoamisen yhteydessauml halutaan edellisessauml esimerkissauml saada ohjelmisto

jakeluun Jotta ohjelmisto saataisiin jakeluun on se ensin kaumlaumlnnettaumlvauml ja sitauml ennen on

luotava ohjelmiston hakemistorakenne

Jos halutaan kehittaumlauml esimerkin koontikuvausta voidaan esimerkiksi suorittaa verk-

kosivujen paumlivitystehtaumlvauml yhden kohteen sisaumlllauml ja asettaa se riippuvaiseksi kohteesta

rdquodistrdquo Naumlin ohjelmasta saadaan paumlivitetty versio jakeluun ja verkkosivuille tulee taumlstauml

automaattinen ilmoitus ohjelmiston kaumlyttaumljille

33 Maven

Luvussa 32 tutustuttiin Anttiin joka on natiivi koontityoumlkalu Seuraavaksi tutustutaan

koonti- ja projektinhallintasovellukseen Maveniin jolla voidaan kuvata koontiprosessin

lisaumlksi myoumls projektin rakenne Maven rohkaisee kaumlyttaumlmaumlaumln parhaita kaumlytaumlntoumljauml (best

practises) joita kaumlyttaumlmaumlllauml ohjelmistoprojektista toiseen siirtyessauml oppimiskynnys

uuden koontikuvauksen ymmaumlrtaumlmiseen pienenee [Maven vs Ant or Ant vs Maven]

Maven on kaumlytoumlssauml Metropolian Ohjelmistotuotantoprojekti-kurssin ohjelmistoprojekti-

en koontityoumlkaluna

Apache Maven on ohjelmistoprojektin hallintatyoumlkalu Se perustuu projekti-olio-malli -

konseptiin (Project Object Model POM) Maven kykenee kokoamaan projektin testaa-

14

maan projektin antamaan kaumlyttaumljaumllle palautetta dokumentoimaan kokoamisen ja te-

kemaumlaumln useita muita tehtaumlviauml erillisillauml Mavenin tarjoamilla lisaumlosilla (plug-ins) [Apache

Maven Project Welcome to Apache Maven]

POM on XML-tiedosto joka sisaumlltaumlauml informaatiota projektista ja yksityiskohtaisen konfi-

guraation jota Maven kaumlyttaumlauml projektin kokoamiseen POM kostuu kohteista (goals)

jotka on maumlaumlritelty pomxml -tiedostossa Kun suoritetaan erillinen tehtaumlvauml tai kohde

Maven etsii POMmia tyoumlhakemistosta lukee POMmin hakee tarvittavan konfiguraati-

on ja suorittaa kohteen

Eraumlitauml POMissa maumlaumlriteltaumlviauml konfiguraatioita ovat projektin riippuvuudet kaumlytettaumlvaumlt

lisaumlosat ajettavat kohteet ja koontiprofiilit POMiin voi maumlaumlritellauml muutakin tietoa ku-

ten projektin version kehittaumljaumlt ja postituslistat [Apache Maven Project Introduction

to the POM]

Maven on Java-tyoumlkalu joten Java taumlytyy olla asennettuna Mavenia ajavalle koneelle

Taumlmauml luku perustuu Apachen verkkosivuilla sijaitsevaan Mavenin kaumlyttoumlohjeeseen

[Apache Maven Project Maven in 5 Minutes] Seuraavaksi luetellaan eri vaiheet Ma-

ven-projektin luomiseksi

Ensin on ladattava Maven ja kaumlytaumlvauml laumlpi asennusohjeet jotka loumlytyvaumlt osoitteesta

[httpmavenapacheorgdownloadhtmlInstallation] Taumlmaumln jaumllkeen on avattava

terminaali tai komentokehote ja kirjoitettava

mvn --version

Taumlmaumln tulostaa asennetun Mavenin ja Javan versio Esimerkiksi

1 Apache Maven 303 (r1075438 2011-02-28 183109+0100)

2 Maven home Dapache-maven-303bin

3 Java version 160_25 vendor Sun Microsystems Inc

4 Java home EProgram FilesJavajdk160_25jre

5 Default locale nl_NL platform encoding Cp1252

6 OS name windows 7 version 61 arch amd64 family windows

Maven-projekti luodaan ajamalla terminaalissa Maven kohde (goal)

15

mvn archetypegenerate -DgroupId=commycompanyapp -DartifactId=my-app -

DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Ensimmaumlisellauml ajolla taumlmauml komento lataa tarvittavat Maven lisaumlosat ja muita tiedostoja

paikalliseen tietovarastoon Huomataan ettauml rdquogeneraterdquo kohde loi rdquoartifactIdrdquonauml anne-

tun hakemiston

Kirjoitetaan komentoriville

cd my-app

Taumlmaumln kansion alta loumlytyy Mavenin standardi projektirakenne

my-app

|-- pomxml

`-- src

|-- main

| `-- java

| `-- com

| `-- mycompany

| `-- app

| `-- Appjava

`-- test

`-- java

`-- com

`-- mycompany

`-- app

`-- AppTestjava

Yllauml kuvatussa hakemistorakenteessa oleva rdquosrcmainjavardquo-hakemisto sisaumlltaumlauml projek-

tin laumlhdekoodin Vastaavasti rdquosrctestjavardquo-hakemisto sisaumlltaumlauml testien laumlhdekoodin

Pomxml-tiedosto kuvaa projektin konfiguraatiota ja sisaumlltaumlauml projektin kokoamisohjeet

Esimerkkiprojektin POM naumlyttaumlauml taumlltauml

1 ltpro-

ject xmlns=httpmavenapacheorgPOM400 xmlnsxsi=httpwwww3org20

01XMLSchema-instance

2 xsischemaLocation=httpmavenapacheorgPOM400 httpmavenapacheorg

xsdmaven-400xsdgt

3 ltmodelVersiongt400ltmodelVersiongt

4

5 ltgroupIdgtcommycompanyappltgroupIdgt

6 ltartifactIdgtmy-appltartifactIdgt

16

7 ltversiongt10-SNAPSHOTltversiongt

8 ltpackaginggtjarltpackaginggt

9

10 ltnamegtMaven Quick Start Archetypeltnamegt

11 lturlgthttpmavenapacheorglturlgt

12 13 ltdependenciesgt

14 ltdependencygt

15 ltgroupIdgtjunitltgroupIdgt

16 ltartifactIdgtjunitltartifactIdgt

17 ltversiongt482ltversiongt

18 ltscopegttestltscopegt

19 ltdependencygt

20 ltdependenciesgt

21 ltprojectgt

POM-tiedosto on Maven-projektin konfiguraation ydin Se sisaumlltaumlauml suurimman osan

informaatiosta joka vaaditaan projektin kokoamiseen halutulla tavalla

Aikaisemmassa esimerkissauml ajettiin Mavenin kohde (goal) archetypegenerate ja an-

nettiin sille parametreja Etuliite archetype on lisaumlosa joka sisaumlltaumlauml kohteen generate

Taumltauml voi verrata Antin tehtaumlvaumlaumln Taumlmauml kohde loi yksinkertaisen projektin joka perus-

tuu arkkityyppiin Yleisesti Mavenin lisaumlosat koostuvat kohteista joilla on yhteinen paumlauml-

tarkoitus Esimerkki taumlllaisesta lisaumlosasta on jboss-maven-plugin jonka tehtaumlvaumlnauml on

kaumlsitellauml erinaumlisiauml Jboss-komponentteja (items)

Maven-projekti kootaan komentoriviltauml seuraavanlaisesti

mvn package

Komentorivi tulostaa eri komentoja tulostus loppuu seuraavanlaisesti

[INFO] --------------------------

[INFO] BUILD SUCCESSFUL

[INFO] --------------------------

[INFO] Total time 2 seconds

[INFO] Finished at Thu Jul 07 213452 CEST 2011

[INFO] Final Memory 3M6M

[INFO] --------------------------

Toisin kuin ensimmaumliseksi suoritetussa komennossa (archetypegenerate) huomataan

taumlllauml kertaa kaumlytetty komento package on vain yksi sana Taumlllaista komentoa kutsutaan

17

kohteen (goal) sijaan vaiheeksi (phase) Vaihe on yksi askel koonnin elinkaaressa

(build lifecycle) joka on jaumlrjestetty sarja eri vaiheita Jos esimerkiksi ajetaan vaiheen

compile Maven itseasiassa suorittaa sarjan vaiheita

1 validate

2 generate-sources

3 process-sources

4 generate-resources

5 process-resources

6 compile

Compilen ajamisen jaumllkeen voidaan testata kaumlaumlnnettyauml JARia seuraavalla komennolla

java -cp targetmy-app-10-SNAPSHOTjar commycompanyappApp

Taumlmauml komento tulostaa

Hello World

Kaumlydaumlaumln laumlpi vielauml eri Mavenin yleisimmaumlt oletuselinkaaressa kaumlytetyt vaiheet Naumlitauml

ovat

-validate varmistaa ettauml projekti on ehjauml ja kaikki tarvittava tieto on saatavilla

-compile kaumlaumlntaumlauml projektin laumlhdekoodin

-test testaa kaumlaumlnnetyn laumlhdekoodin kaumlyttaumlen sopivaa yksikkoumltestikehystauml Naumliden

testien ei tulisi vaatia vaiheita package tai deploy

-package paketoi kaumlaumlnnetyn koodin sen jaettavaan muotoon esimerkiksi JARriksi

-integration-test prosessoi ja jaumlrjestaumlauml paketin ympaumlristoumloumln jossa integraatiotestejauml

voidaan ajaa jos tarpeellista

-verify tarkistaa onko paketti validi ja taumlyttaumlaumlkouml se laatukriteerit

-install asentaa paketin paikalliseen tietovarastoon muiden paikallisten projektien

kaumlyttoumloumln tai paikallisten projektien riippuvuudeksi

-deploy kopioi lopullisen paketin ulkoiseen tietovarastoon jaettavaksi muille kehittaumljil-

le ja projekteille Tehdaumlaumln integraatio- tai julkaisuympaumlristoumlssauml

On vielauml kaksi muuta mainitsemisen arvoista Maven-elinkaarta jotka eivaumlt sisaumllly yllauml

listattuun oletuselinkaareen Naumlitauml ovat

18

-clean poistaa aikaisempien koontien yhteydessauml luodut artifaktit

-site generoi verkkodokumentaation kyseiselle projektille

Jokainen vaihe sisaumlltaumlauml sarjan suoritettavia kohteita joiden ajaminen riippuu projektin

paketointityypistauml Jos projektin tyyppi on JAR niin package ajaa kohteen jarjar Vas-

taavasti WAR -tyyppisen projektin package -vaihe suorittaa kohteen warwar

34 Koonti ja kaumlyttoumloumlnotto

Ohjelmiston saattamista laumlhdekoodista loppukaumlyttaumljaumllle kaumlyttoumlkelpoiseen muotoon kut-

sutaan koonniksi Laumlhdekoodin kaumlaumlntaumlmisen lisaumlksi koonti voi sisaumlltaumlauml monia muita vai-

heita Aleksi Lukkarinen on opinnaumlytetyoumlssaumlaumln listannut esimerkkejauml erilaisista koon-

neista seuraavasti [Aleksi Lukkarinen opinnaumlytetyouml]

-ohjelmointikielisen laumlhdekoodin sekauml resurssien automatisoitua luomista

-eri ohjelmointikielillauml tuotetun laumlhdekoodin kaumlaumlntaumlmistauml kone- jatai vaumllikielille

-vaumlli- tai konekielisen ohjelmakoodin jaumllkikaumlsittelyauml esimerkiksi testauksen aspektioh-

jelmoinnin tai koodin tarkoituksellisen sotkemisen vuoksi

-sovelluksen testausta (esimerkiksi toimivuus tietoturvallisuus suorituskyky rakenteel-

linen ja koodaustekninen laatu sekauml kaumlyttoumltarkoitustaan vastaavuus)

-dokumentaation koontia (kuten varsinaisen sovelluksen koonti)

-koontituotteiden paketointia sekauml mahdollisten fyysisten jakelumedioiden luontia toi-

mivuus- ja virustarkistuksineen

-ohjelmistomoduulien integrointia

-palautteen antamista koonnin tuloksista

Lukkarinen jaumlsentelee opinnaumlytetyoumlssaumlaumln sovelluksen jakeluun ja kaumlyttoumloumlnottoon sisaumll-

tyviksi asioiksi

-Sovellusta suorittavien ja tukevien palvelinympaumlristoumljen luominen ja paumlivittaumlminen

-Sovelluksen sekauml sen kaumlyttaumlmien ohjelmistokomponenttien siirtaumlminen ja maumlaumlrittaumlmi-

nen esimerkiksi testaus- laadunvarmistus- esittely-koulutus- sekauml tuotantoympaumlris-

toumlihin Kohdeympaumlristoumlissauml olevat vanhat versiot on mahdollisesti paumlivitettaumlvauml jollei

uusia versiota asenneta niiden rinnalle

19

-Uusien tietokantojen luominen sekauml vanhojen paumlivittaumlminen uutta sovellusversiota

vastaaviksi

-Kirjanpidollisen materiaalin tuottaminen ja yllaumlpitaumlminen

-Palautteen antaminen jakelu- ja kaumlyttoumloumlnottoprosessin onnistumisesta

Taumlmaumln luvun tarkoitus oli perehdyttaumlauml lukija ymmaumlrtaumlmaumlaumln koontiprosessia koontiku-

vaus-esimerkkien avulla Koontiprosessin ymmaumlrtaumlminen on vaumllttaumlmaumltoumlntauml seuraavan

luvun ymmaumlrtaumlmiseen jossa perehdytaumlaumln koontiympaumlristouml -kaumlsitteeseen

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant

Taumlssauml luvussa luodaan nopea katsaus koonti- ja kaumlyttoumloumlnottoprosessien automatisoimi-

seen tutustutaan jatkuvaan integraatioon sekauml sovellukseen Jenkins CI

Lisaumlksi tutustutaan projektihallintaohjelmaan Agilefant Agilefant on yksi monipuoli-

simmista kevyistauml vapaan laumlhdekoodin projektinhallintasovelluksista ja se soveltuu

niin pieniin kuin suuriinkin projekteihin

Naumlmauml sovellukset esitellaumlaumln pohjustuksena lukuja 5 ja 6 varten joissa tutustutaan

koontiympaumlristoumln tarkkailuun

41 Jatkuva integraatio

Jatkuva integraatio (Continuous Integration CI) on modernin sovelluskehityksen kul-

makivi Itse asiassa se on mullistanut sovelluskehityksen Kun jatkuva integraatio ote-

taan kaumlyttoumloumln organisaatiossa se muuttaa radikaalisti sitauml miten tyoumlryhmauml ymmaumlrtaumlauml

koko kehitysprosessin Jatkuvalla integraatiolla on potentiaalia laukaista sarja paran-

nuksia organisaation tuotteen kehitysprosessiin Se alkaa yksinkertaisesta automaatti-

sesta koonnista kehittyen systeemiksi joka automaattisesti saattaa tuotteen tuotan-

toon Hyvauml CI-infrastruktuuri mahdollistaa virheiden helpon sekauml nopean huomaamisen

ja tarjoaa kojelaudan projektin hyvinvoinnin ja muiden statistiikkojen seuraamiseen

sekauml kehittaumljille ettauml muille projektin osapuolille Jenkins The Definite Guiden mukaan

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 18: Joakim Sandqvist - Theseus

12

Kohteilla (targets) on riippuvuuksia muista kohteista Kuten makefilessauml voidaan koh-

teiden vaumllille rakentaa riippuvuuksia ja luoda ohjelmiston kokoamisen kannalta jaumlrkevauml

riippuvaisuuksien verkosto

Tehtaumlvaumlt (tasks) ovat suoritettavia koodirivejauml Tehtaumlvillauml voi olla useita attribuutteja

kuten tulevasta esimerkissauml naumlhdaumlaumln

Ominaisuuksilla (properties) voidaan antaa oikoteitauml (shortcuts) komentoihin tai merk-

kijonoihin joita kaumlytetaumlaumln usein koontitiedostossa Ominaisuudella on nimi- sekauml arvo-

attribuutti [Apache Ant Using Apache Ant]

1 ltproject name=MyProject default=dist basedir=gt

2 ltdescriptiongt

3 Yksinkertainen koontikuvaustiedosto

4 ltdescriptiongt

5 lt--Asetetaan julkiset ominaisuudet --gt

6 ltproperty name=src location=srcgt

7 ltproperty name=build location=buildgt

8 ltproperty name=dist location=distgt

9

10 lttarget name=initgt

11 ltmdashLuodaan aikaleima --gt

12 lttstampgt

13 ltmdashLuodaan hakemistorakenne ldquocompilerdquo tehtaumlvaumllle --gt

14 ltmkdir dir=$buildgt

15 lttargetgt

16 17 lttarget name=compile depends=initgt

18 lt--Kaumlaumlnnetaumlaumln Java-koodi $srcstauml into $buildiin --gt

19 ltjavac srcdir=$src destdir=$buildgt

20 lttargetgt

21 22 lttarget name=dist depends=compile

23 description=Generoidaan distribuutio gt

24 lt--Luodaan distribuutio kansio --gt

25 ltmkdir dir=$distlibgt

26 27 lt-- Laitetaan $build sisaumlltouml MyProject-$DSTAMPjarriin --gt

28 ltjar jarfile=$distlibMyProject $DSTAMPjar basedir=$buildgt

29 lttargetgt

30 31 lttarget name=clean

32 description=clean up gt

33 ltmdashPoistetaan $build ja $dist hakemistot --gt

34 ltdelete dir=$buildgt

13

35 ltdelete dir=$distgt

36 lttargetgt

37 ltprojectgt

[Apache Ant Using Apache Ant Example Buildfile]

Edelliseen koontikuvaukseen on maumlaumlritelty projekti jonka nimi on ldquoMyProjectrdquo Kun

tutustutaan koonnin kuvaukseen huomataan ettauml koontitiedoston projektin oletuskoh-

teella rdquodistrdquo on riippuvuus kohteeseen rdquocompilerdquo jolla on riippuvuus kohteeseen rdquoinitrdquo

Initillauml ei ole riippuvaisuuksia Taumlten ensimmaumlinen koonnin yhteydessauml ajettava kohde

onkin rdquoinitrdquo eikauml rdquodistrdquo vaikka rdquodistrdquo on koontikuvauksen oletuskohde Voidaan sanoa

ettauml koonnin paumlaumlmaumlaumlrauml on suorittaa kohde rdquodistrdquo ja paumlaumlmaumlaumlraumln saavuttamiseksi on

suoritettava kohteita joista taumlmauml on riippuvainen Riippuvuudet toimivat samalla peri-

aatteella kuin aikaisemmissa makefile-esimerkeissauml

Ohjelmiston kokoamisen yhteydessauml halutaan edellisessauml esimerkissauml saada ohjelmisto

jakeluun Jotta ohjelmisto saataisiin jakeluun on se ensin kaumlaumlnnettaumlvauml ja sitauml ennen on

luotava ohjelmiston hakemistorakenne

Jos halutaan kehittaumlauml esimerkin koontikuvausta voidaan esimerkiksi suorittaa verk-

kosivujen paumlivitystehtaumlvauml yhden kohteen sisaumlllauml ja asettaa se riippuvaiseksi kohteesta

rdquodistrdquo Naumlin ohjelmasta saadaan paumlivitetty versio jakeluun ja verkkosivuille tulee taumlstauml

automaattinen ilmoitus ohjelmiston kaumlyttaumljille

33 Maven

Luvussa 32 tutustuttiin Anttiin joka on natiivi koontityoumlkalu Seuraavaksi tutustutaan

koonti- ja projektinhallintasovellukseen Maveniin jolla voidaan kuvata koontiprosessin

lisaumlksi myoumls projektin rakenne Maven rohkaisee kaumlyttaumlmaumlaumln parhaita kaumlytaumlntoumljauml (best

practises) joita kaumlyttaumlmaumlllauml ohjelmistoprojektista toiseen siirtyessauml oppimiskynnys

uuden koontikuvauksen ymmaumlrtaumlmiseen pienenee [Maven vs Ant or Ant vs Maven]

Maven on kaumlytoumlssauml Metropolian Ohjelmistotuotantoprojekti-kurssin ohjelmistoprojekti-

en koontityoumlkaluna

Apache Maven on ohjelmistoprojektin hallintatyoumlkalu Se perustuu projekti-olio-malli -

konseptiin (Project Object Model POM) Maven kykenee kokoamaan projektin testaa-

14

maan projektin antamaan kaumlyttaumljaumllle palautetta dokumentoimaan kokoamisen ja te-

kemaumlaumln useita muita tehtaumlviauml erillisillauml Mavenin tarjoamilla lisaumlosilla (plug-ins) [Apache

Maven Project Welcome to Apache Maven]

POM on XML-tiedosto joka sisaumlltaumlauml informaatiota projektista ja yksityiskohtaisen konfi-

guraation jota Maven kaumlyttaumlauml projektin kokoamiseen POM kostuu kohteista (goals)

jotka on maumlaumlritelty pomxml -tiedostossa Kun suoritetaan erillinen tehtaumlvauml tai kohde

Maven etsii POMmia tyoumlhakemistosta lukee POMmin hakee tarvittavan konfiguraati-

on ja suorittaa kohteen

Eraumlitauml POMissa maumlaumlriteltaumlviauml konfiguraatioita ovat projektin riippuvuudet kaumlytettaumlvaumlt

lisaumlosat ajettavat kohteet ja koontiprofiilit POMiin voi maumlaumlritellauml muutakin tietoa ku-

ten projektin version kehittaumljaumlt ja postituslistat [Apache Maven Project Introduction

to the POM]

Maven on Java-tyoumlkalu joten Java taumlytyy olla asennettuna Mavenia ajavalle koneelle

Taumlmauml luku perustuu Apachen verkkosivuilla sijaitsevaan Mavenin kaumlyttoumlohjeeseen

[Apache Maven Project Maven in 5 Minutes] Seuraavaksi luetellaan eri vaiheet Ma-

ven-projektin luomiseksi

Ensin on ladattava Maven ja kaumlytaumlvauml laumlpi asennusohjeet jotka loumlytyvaumlt osoitteesta

[httpmavenapacheorgdownloadhtmlInstallation] Taumlmaumln jaumllkeen on avattava

terminaali tai komentokehote ja kirjoitettava

mvn --version

Taumlmaumln tulostaa asennetun Mavenin ja Javan versio Esimerkiksi

1 Apache Maven 303 (r1075438 2011-02-28 183109+0100)

2 Maven home Dapache-maven-303bin

3 Java version 160_25 vendor Sun Microsystems Inc

4 Java home EProgram FilesJavajdk160_25jre

5 Default locale nl_NL platform encoding Cp1252

6 OS name windows 7 version 61 arch amd64 family windows

Maven-projekti luodaan ajamalla terminaalissa Maven kohde (goal)

15

mvn archetypegenerate -DgroupId=commycompanyapp -DartifactId=my-app -

DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Ensimmaumlisellauml ajolla taumlmauml komento lataa tarvittavat Maven lisaumlosat ja muita tiedostoja

paikalliseen tietovarastoon Huomataan ettauml rdquogeneraterdquo kohde loi rdquoartifactIdrdquonauml anne-

tun hakemiston

Kirjoitetaan komentoriville

cd my-app

Taumlmaumln kansion alta loumlytyy Mavenin standardi projektirakenne

my-app

|-- pomxml

`-- src

|-- main

| `-- java

| `-- com

| `-- mycompany

| `-- app

| `-- Appjava

`-- test

`-- java

`-- com

`-- mycompany

`-- app

`-- AppTestjava

Yllauml kuvatussa hakemistorakenteessa oleva rdquosrcmainjavardquo-hakemisto sisaumlltaumlauml projek-

tin laumlhdekoodin Vastaavasti rdquosrctestjavardquo-hakemisto sisaumlltaumlauml testien laumlhdekoodin

Pomxml-tiedosto kuvaa projektin konfiguraatiota ja sisaumlltaumlauml projektin kokoamisohjeet

Esimerkkiprojektin POM naumlyttaumlauml taumlltauml

1 ltpro-

ject xmlns=httpmavenapacheorgPOM400 xmlnsxsi=httpwwww3org20

01XMLSchema-instance

2 xsischemaLocation=httpmavenapacheorgPOM400 httpmavenapacheorg

xsdmaven-400xsdgt

3 ltmodelVersiongt400ltmodelVersiongt

4

5 ltgroupIdgtcommycompanyappltgroupIdgt

6 ltartifactIdgtmy-appltartifactIdgt

16

7 ltversiongt10-SNAPSHOTltversiongt

8 ltpackaginggtjarltpackaginggt

9

10 ltnamegtMaven Quick Start Archetypeltnamegt

11 lturlgthttpmavenapacheorglturlgt

12 13 ltdependenciesgt

14 ltdependencygt

15 ltgroupIdgtjunitltgroupIdgt

16 ltartifactIdgtjunitltartifactIdgt

17 ltversiongt482ltversiongt

18 ltscopegttestltscopegt

19 ltdependencygt

20 ltdependenciesgt

21 ltprojectgt

POM-tiedosto on Maven-projektin konfiguraation ydin Se sisaumlltaumlauml suurimman osan

informaatiosta joka vaaditaan projektin kokoamiseen halutulla tavalla

Aikaisemmassa esimerkissauml ajettiin Mavenin kohde (goal) archetypegenerate ja an-

nettiin sille parametreja Etuliite archetype on lisaumlosa joka sisaumlltaumlauml kohteen generate

Taumltauml voi verrata Antin tehtaumlvaumlaumln Taumlmauml kohde loi yksinkertaisen projektin joka perus-

tuu arkkityyppiin Yleisesti Mavenin lisaumlosat koostuvat kohteista joilla on yhteinen paumlauml-

tarkoitus Esimerkki taumlllaisesta lisaumlosasta on jboss-maven-plugin jonka tehtaumlvaumlnauml on

kaumlsitellauml erinaumlisiauml Jboss-komponentteja (items)

Maven-projekti kootaan komentoriviltauml seuraavanlaisesti

mvn package

Komentorivi tulostaa eri komentoja tulostus loppuu seuraavanlaisesti

[INFO] --------------------------

[INFO] BUILD SUCCESSFUL

[INFO] --------------------------

[INFO] Total time 2 seconds

[INFO] Finished at Thu Jul 07 213452 CEST 2011

[INFO] Final Memory 3M6M

[INFO] --------------------------

Toisin kuin ensimmaumliseksi suoritetussa komennossa (archetypegenerate) huomataan

taumlllauml kertaa kaumlytetty komento package on vain yksi sana Taumlllaista komentoa kutsutaan

17

kohteen (goal) sijaan vaiheeksi (phase) Vaihe on yksi askel koonnin elinkaaressa

(build lifecycle) joka on jaumlrjestetty sarja eri vaiheita Jos esimerkiksi ajetaan vaiheen

compile Maven itseasiassa suorittaa sarjan vaiheita

1 validate

2 generate-sources

3 process-sources

4 generate-resources

5 process-resources

6 compile

Compilen ajamisen jaumllkeen voidaan testata kaumlaumlnnettyauml JARia seuraavalla komennolla

java -cp targetmy-app-10-SNAPSHOTjar commycompanyappApp

Taumlmauml komento tulostaa

Hello World

Kaumlydaumlaumln laumlpi vielauml eri Mavenin yleisimmaumlt oletuselinkaaressa kaumlytetyt vaiheet Naumlitauml

ovat

-validate varmistaa ettauml projekti on ehjauml ja kaikki tarvittava tieto on saatavilla

-compile kaumlaumlntaumlauml projektin laumlhdekoodin

-test testaa kaumlaumlnnetyn laumlhdekoodin kaumlyttaumlen sopivaa yksikkoumltestikehystauml Naumliden

testien ei tulisi vaatia vaiheita package tai deploy

-package paketoi kaumlaumlnnetyn koodin sen jaettavaan muotoon esimerkiksi JARriksi

-integration-test prosessoi ja jaumlrjestaumlauml paketin ympaumlristoumloumln jossa integraatiotestejauml

voidaan ajaa jos tarpeellista

-verify tarkistaa onko paketti validi ja taumlyttaumlaumlkouml se laatukriteerit

-install asentaa paketin paikalliseen tietovarastoon muiden paikallisten projektien

kaumlyttoumloumln tai paikallisten projektien riippuvuudeksi

-deploy kopioi lopullisen paketin ulkoiseen tietovarastoon jaettavaksi muille kehittaumljil-

le ja projekteille Tehdaumlaumln integraatio- tai julkaisuympaumlristoumlssauml

On vielauml kaksi muuta mainitsemisen arvoista Maven-elinkaarta jotka eivaumlt sisaumllly yllauml

listattuun oletuselinkaareen Naumlitauml ovat

18

-clean poistaa aikaisempien koontien yhteydessauml luodut artifaktit

-site generoi verkkodokumentaation kyseiselle projektille

Jokainen vaihe sisaumlltaumlauml sarjan suoritettavia kohteita joiden ajaminen riippuu projektin

paketointityypistauml Jos projektin tyyppi on JAR niin package ajaa kohteen jarjar Vas-

taavasti WAR -tyyppisen projektin package -vaihe suorittaa kohteen warwar

34 Koonti ja kaumlyttoumloumlnotto

Ohjelmiston saattamista laumlhdekoodista loppukaumlyttaumljaumllle kaumlyttoumlkelpoiseen muotoon kut-

sutaan koonniksi Laumlhdekoodin kaumlaumlntaumlmisen lisaumlksi koonti voi sisaumlltaumlauml monia muita vai-

heita Aleksi Lukkarinen on opinnaumlytetyoumlssaumlaumln listannut esimerkkejauml erilaisista koon-

neista seuraavasti [Aleksi Lukkarinen opinnaumlytetyouml]

-ohjelmointikielisen laumlhdekoodin sekauml resurssien automatisoitua luomista

-eri ohjelmointikielillauml tuotetun laumlhdekoodin kaumlaumlntaumlmistauml kone- jatai vaumllikielille

-vaumlli- tai konekielisen ohjelmakoodin jaumllkikaumlsittelyauml esimerkiksi testauksen aspektioh-

jelmoinnin tai koodin tarkoituksellisen sotkemisen vuoksi

-sovelluksen testausta (esimerkiksi toimivuus tietoturvallisuus suorituskyky rakenteel-

linen ja koodaustekninen laatu sekauml kaumlyttoumltarkoitustaan vastaavuus)

-dokumentaation koontia (kuten varsinaisen sovelluksen koonti)

-koontituotteiden paketointia sekauml mahdollisten fyysisten jakelumedioiden luontia toi-

mivuus- ja virustarkistuksineen

-ohjelmistomoduulien integrointia

-palautteen antamista koonnin tuloksista

Lukkarinen jaumlsentelee opinnaumlytetyoumlssaumlaumln sovelluksen jakeluun ja kaumlyttoumloumlnottoon sisaumll-

tyviksi asioiksi

-Sovellusta suorittavien ja tukevien palvelinympaumlristoumljen luominen ja paumlivittaumlminen

-Sovelluksen sekauml sen kaumlyttaumlmien ohjelmistokomponenttien siirtaumlminen ja maumlaumlrittaumlmi-

nen esimerkiksi testaus- laadunvarmistus- esittely-koulutus- sekauml tuotantoympaumlris-

toumlihin Kohdeympaumlristoumlissauml olevat vanhat versiot on mahdollisesti paumlivitettaumlvauml jollei

uusia versiota asenneta niiden rinnalle

19

-Uusien tietokantojen luominen sekauml vanhojen paumlivittaumlminen uutta sovellusversiota

vastaaviksi

-Kirjanpidollisen materiaalin tuottaminen ja yllaumlpitaumlminen

-Palautteen antaminen jakelu- ja kaumlyttoumloumlnottoprosessin onnistumisesta

Taumlmaumln luvun tarkoitus oli perehdyttaumlauml lukija ymmaumlrtaumlmaumlaumln koontiprosessia koontiku-

vaus-esimerkkien avulla Koontiprosessin ymmaumlrtaumlminen on vaumllttaumlmaumltoumlntauml seuraavan

luvun ymmaumlrtaumlmiseen jossa perehdytaumlaumln koontiympaumlristouml -kaumlsitteeseen

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant

Taumlssauml luvussa luodaan nopea katsaus koonti- ja kaumlyttoumloumlnottoprosessien automatisoimi-

seen tutustutaan jatkuvaan integraatioon sekauml sovellukseen Jenkins CI

Lisaumlksi tutustutaan projektihallintaohjelmaan Agilefant Agilefant on yksi monipuoli-

simmista kevyistauml vapaan laumlhdekoodin projektinhallintasovelluksista ja se soveltuu

niin pieniin kuin suuriinkin projekteihin

Naumlmauml sovellukset esitellaumlaumln pohjustuksena lukuja 5 ja 6 varten joissa tutustutaan

koontiympaumlristoumln tarkkailuun

41 Jatkuva integraatio

Jatkuva integraatio (Continuous Integration CI) on modernin sovelluskehityksen kul-

makivi Itse asiassa se on mullistanut sovelluskehityksen Kun jatkuva integraatio ote-

taan kaumlyttoumloumln organisaatiossa se muuttaa radikaalisti sitauml miten tyoumlryhmauml ymmaumlrtaumlauml

koko kehitysprosessin Jatkuvalla integraatiolla on potentiaalia laukaista sarja paran-

nuksia organisaation tuotteen kehitysprosessiin Se alkaa yksinkertaisesta automaatti-

sesta koonnista kehittyen systeemiksi joka automaattisesti saattaa tuotteen tuotan-

toon Hyvauml CI-infrastruktuuri mahdollistaa virheiden helpon sekauml nopean huomaamisen

ja tarjoaa kojelaudan projektin hyvinvoinnin ja muiden statistiikkojen seuraamiseen

sekauml kehittaumljille ettauml muille projektin osapuolille Jenkins The Definite Guiden mukaan

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 19: Joakim Sandqvist - Theseus

13

35 ltdelete dir=$distgt

36 lttargetgt

37 ltprojectgt

[Apache Ant Using Apache Ant Example Buildfile]

Edelliseen koontikuvaukseen on maumlaumlritelty projekti jonka nimi on ldquoMyProjectrdquo Kun

tutustutaan koonnin kuvaukseen huomataan ettauml koontitiedoston projektin oletuskoh-

teella rdquodistrdquo on riippuvuus kohteeseen rdquocompilerdquo jolla on riippuvuus kohteeseen rdquoinitrdquo

Initillauml ei ole riippuvaisuuksia Taumlten ensimmaumlinen koonnin yhteydessauml ajettava kohde

onkin rdquoinitrdquo eikauml rdquodistrdquo vaikka rdquodistrdquo on koontikuvauksen oletuskohde Voidaan sanoa

ettauml koonnin paumlaumlmaumlaumlrauml on suorittaa kohde rdquodistrdquo ja paumlaumlmaumlaumlraumln saavuttamiseksi on

suoritettava kohteita joista taumlmauml on riippuvainen Riippuvuudet toimivat samalla peri-

aatteella kuin aikaisemmissa makefile-esimerkeissauml

Ohjelmiston kokoamisen yhteydessauml halutaan edellisessauml esimerkissauml saada ohjelmisto

jakeluun Jotta ohjelmisto saataisiin jakeluun on se ensin kaumlaumlnnettaumlvauml ja sitauml ennen on

luotava ohjelmiston hakemistorakenne

Jos halutaan kehittaumlauml esimerkin koontikuvausta voidaan esimerkiksi suorittaa verk-

kosivujen paumlivitystehtaumlvauml yhden kohteen sisaumlllauml ja asettaa se riippuvaiseksi kohteesta

rdquodistrdquo Naumlin ohjelmasta saadaan paumlivitetty versio jakeluun ja verkkosivuille tulee taumlstauml

automaattinen ilmoitus ohjelmiston kaumlyttaumljille

33 Maven

Luvussa 32 tutustuttiin Anttiin joka on natiivi koontityoumlkalu Seuraavaksi tutustutaan

koonti- ja projektinhallintasovellukseen Maveniin jolla voidaan kuvata koontiprosessin

lisaumlksi myoumls projektin rakenne Maven rohkaisee kaumlyttaumlmaumlaumln parhaita kaumlytaumlntoumljauml (best

practises) joita kaumlyttaumlmaumlllauml ohjelmistoprojektista toiseen siirtyessauml oppimiskynnys

uuden koontikuvauksen ymmaumlrtaumlmiseen pienenee [Maven vs Ant or Ant vs Maven]

Maven on kaumlytoumlssauml Metropolian Ohjelmistotuotantoprojekti-kurssin ohjelmistoprojekti-

en koontityoumlkaluna

Apache Maven on ohjelmistoprojektin hallintatyoumlkalu Se perustuu projekti-olio-malli -

konseptiin (Project Object Model POM) Maven kykenee kokoamaan projektin testaa-

14

maan projektin antamaan kaumlyttaumljaumllle palautetta dokumentoimaan kokoamisen ja te-

kemaumlaumln useita muita tehtaumlviauml erillisillauml Mavenin tarjoamilla lisaumlosilla (plug-ins) [Apache

Maven Project Welcome to Apache Maven]

POM on XML-tiedosto joka sisaumlltaumlauml informaatiota projektista ja yksityiskohtaisen konfi-

guraation jota Maven kaumlyttaumlauml projektin kokoamiseen POM kostuu kohteista (goals)

jotka on maumlaumlritelty pomxml -tiedostossa Kun suoritetaan erillinen tehtaumlvauml tai kohde

Maven etsii POMmia tyoumlhakemistosta lukee POMmin hakee tarvittavan konfiguraati-

on ja suorittaa kohteen

Eraumlitauml POMissa maumlaumlriteltaumlviauml konfiguraatioita ovat projektin riippuvuudet kaumlytettaumlvaumlt

lisaumlosat ajettavat kohteet ja koontiprofiilit POMiin voi maumlaumlritellauml muutakin tietoa ku-

ten projektin version kehittaumljaumlt ja postituslistat [Apache Maven Project Introduction

to the POM]

Maven on Java-tyoumlkalu joten Java taumlytyy olla asennettuna Mavenia ajavalle koneelle

Taumlmauml luku perustuu Apachen verkkosivuilla sijaitsevaan Mavenin kaumlyttoumlohjeeseen

[Apache Maven Project Maven in 5 Minutes] Seuraavaksi luetellaan eri vaiheet Ma-

ven-projektin luomiseksi

Ensin on ladattava Maven ja kaumlytaumlvauml laumlpi asennusohjeet jotka loumlytyvaumlt osoitteesta

[httpmavenapacheorgdownloadhtmlInstallation] Taumlmaumln jaumllkeen on avattava

terminaali tai komentokehote ja kirjoitettava

mvn --version

Taumlmaumln tulostaa asennetun Mavenin ja Javan versio Esimerkiksi

1 Apache Maven 303 (r1075438 2011-02-28 183109+0100)

2 Maven home Dapache-maven-303bin

3 Java version 160_25 vendor Sun Microsystems Inc

4 Java home EProgram FilesJavajdk160_25jre

5 Default locale nl_NL platform encoding Cp1252

6 OS name windows 7 version 61 arch amd64 family windows

Maven-projekti luodaan ajamalla terminaalissa Maven kohde (goal)

15

mvn archetypegenerate -DgroupId=commycompanyapp -DartifactId=my-app -

DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Ensimmaumlisellauml ajolla taumlmauml komento lataa tarvittavat Maven lisaumlosat ja muita tiedostoja

paikalliseen tietovarastoon Huomataan ettauml rdquogeneraterdquo kohde loi rdquoartifactIdrdquonauml anne-

tun hakemiston

Kirjoitetaan komentoriville

cd my-app

Taumlmaumln kansion alta loumlytyy Mavenin standardi projektirakenne

my-app

|-- pomxml

`-- src

|-- main

| `-- java

| `-- com

| `-- mycompany

| `-- app

| `-- Appjava

`-- test

`-- java

`-- com

`-- mycompany

`-- app

`-- AppTestjava

Yllauml kuvatussa hakemistorakenteessa oleva rdquosrcmainjavardquo-hakemisto sisaumlltaumlauml projek-

tin laumlhdekoodin Vastaavasti rdquosrctestjavardquo-hakemisto sisaumlltaumlauml testien laumlhdekoodin

Pomxml-tiedosto kuvaa projektin konfiguraatiota ja sisaumlltaumlauml projektin kokoamisohjeet

Esimerkkiprojektin POM naumlyttaumlauml taumlltauml

1 ltpro-

ject xmlns=httpmavenapacheorgPOM400 xmlnsxsi=httpwwww3org20

01XMLSchema-instance

2 xsischemaLocation=httpmavenapacheorgPOM400 httpmavenapacheorg

xsdmaven-400xsdgt

3 ltmodelVersiongt400ltmodelVersiongt

4

5 ltgroupIdgtcommycompanyappltgroupIdgt

6 ltartifactIdgtmy-appltartifactIdgt

16

7 ltversiongt10-SNAPSHOTltversiongt

8 ltpackaginggtjarltpackaginggt

9

10 ltnamegtMaven Quick Start Archetypeltnamegt

11 lturlgthttpmavenapacheorglturlgt

12 13 ltdependenciesgt

14 ltdependencygt

15 ltgroupIdgtjunitltgroupIdgt

16 ltartifactIdgtjunitltartifactIdgt

17 ltversiongt482ltversiongt

18 ltscopegttestltscopegt

19 ltdependencygt

20 ltdependenciesgt

21 ltprojectgt

POM-tiedosto on Maven-projektin konfiguraation ydin Se sisaumlltaumlauml suurimman osan

informaatiosta joka vaaditaan projektin kokoamiseen halutulla tavalla

Aikaisemmassa esimerkissauml ajettiin Mavenin kohde (goal) archetypegenerate ja an-

nettiin sille parametreja Etuliite archetype on lisaumlosa joka sisaumlltaumlauml kohteen generate

Taumltauml voi verrata Antin tehtaumlvaumlaumln Taumlmauml kohde loi yksinkertaisen projektin joka perus-

tuu arkkityyppiin Yleisesti Mavenin lisaumlosat koostuvat kohteista joilla on yhteinen paumlauml-

tarkoitus Esimerkki taumlllaisesta lisaumlosasta on jboss-maven-plugin jonka tehtaumlvaumlnauml on

kaumlsitellauml erinaumlisiauml Jboss-komponentteja (items)

Maven-projekti kootaan komentoriviltauml seuraavanlaisesti

mvn package

Komentorivi tulostaa eri komentoja tulostus loppuu seuraavanlaisesti

[INFO] --------------------------

[INFO] BUILD SUCCESSFUL

[INFO] --------------------------

[INFO] Total time 2 seconds

[INFO] Finished at Thu Jul 07 213452 CEST 2011

[INFO] Final Memory 3M6M

[INFO] --------------------------

Toisin kuin ensimmaumliseksi suoritetussa komennossa (archetypegenerate) huomataan

taumlllauml kertaa kaumlytetty komento package on vain yksi sana Taumlllaista komentoa kutsutaan

17

kohteen (goal) sijaan vaiheeksi (phase) Vaihe on yksi askel koonnin elinkaaressa

(build lifecycle) joka on jaumlrjestetty sarja eri vaiheita Jos esimerkiksi ajetaan vaiheen

compile Maven itseasiassa suorittaa sarjan vaiheita

1 validate

2 generate-sources

3 process-sources

4 generate-resources

5 process-resources

6 compile

Compilen ajamisen jaumllkeen voidaan testata kaumlaumlnnettyauml JARia seuraavalla komennolla

java -cp targetmy-app-10-SNAPSHOTjar commycompanyappApp

Taumlmauml komento tulostaa

Hello World

Kaumlydaumlaumln laumlpi vielauml eri Mavenin yleisimmaumlt oletuselinkaaressa kaumlytetyt vaiheet Naumlitauml

ovat

-validate varmistaa ettauml projekti on ehjauml ja kaikki tarvittava tieto on saatavilla

-compile kaumlaumlntaumlauml projektin laumlhdekoodin

-test testaa kaumlaumlnnetyn laumlhdekoodin kaumlyttaumlen sopivaa yksikkoumltestikehystauml Naumliden

testien ei tulisi vaatia vaiheita package tai deploy

-package paketoi kaumlaumlnnetyn koodin sen jaettavaan muotoon esimerkiksi JARriksi

-integration-test prosessoi ja jaumlrjestaumlauml paketin ympaumlristoumloumln jossa integraatiotestejauml

voidaan ajaa jos tarpeellista

-verify tarkistaa onko paketti validi ja taumlyttaumlaumlkouml se laatukriteerit

-install asentaa paketin paikalliseen tietovarastoon muiden paikallisten projektien

kaumlyttoumloumln tai paikallisten projektien riippuvuudeksi

-deploy kopioi lopullisen paketin ulkoiseen tietovarastoon jaettavaksi muille kehittaumljil-

le ja projekteille Tehdaumlaumln integraatio- tai julkaisuympaumlristoumlssauml

On vielauml kaksi muuta mainitsemisen arvoista Maven-elinkaarta jotka eivaumlt sisaumllly yllauml

listattuun oletuselinkaareen Naumlitauml ovat

18

-clean poistaa aikaisempien koontien yhteydessauml luodut artifaktit

-site generoi verkkodokumentaation kyseiselle projektille

Jokainen vaihe sisaumlltaumlauml sarjan suoritettavia kohteita joiden ajaminen riippuu projektin

paketointityypistauml Jos projektin tyyppi on JAR niin package ajaa kohteen jarjar Vas-

taavasti WAR -tyyppisen projektin package -vaihe suorittaa kohteen warwar

34 Koonti ja kaumlyttoumloumlnotto

Ohjelmiston saattamista laumlhdekoodista loppukaumlyttaumljaumllle kaumlyttoumlkelpoiseen muotoon kut-

sutaan koonniksi Laumlhdekoodin kaumlaumlntaumlmisen lisaumlksi koonti voi sisaumlltaumlauml monia muita vai-

heita Aleksi Lukkarinen on opinnaumlytetyoumlssaumlaumln listannut esimerkkejauml erilaisista koon-

neista seuraavasti [Aleksi Lukkarinen opinnaumlytetyouml]

-ohjelmointikielisen laumlhdekoodin sekauml resurssien automatisoitua luomista

-eri ohjelmointikielillauml tuotetun laumlhdekoodin kaumlaumlntaumlmistauml kone- jatai vaumllikielille

-vaumlli- tai konekielisen ohjelmakoodin jaumllkikaumlsittelyauml esimerkiksi testauksen aspektioh-

jelmoinnin tai koodin tarkoituksellisen sotkemisen vuoksi

-sovelluksen testausta (esimerkiksi toimivuus tietoturvallisuus suorituskyky rakenteel-

linen ja koodaustekninen laatu sekauml kaumlyttoumltarkoitustaan vastaavuus)

-dokumentaation koontia (kuten varsinaisen sovelluksen koonti)

-koontituotteiden paketointia sekauml mahdollisten fyysisten jakelumedioiden luontia toi-

mivuus- ja virustarkistuksineen

-ohjelmistomoduulien integrointia

-palautteen antamista koonnin tuloksista

Lukkarinen jaumlsentelee opinnaumlytetyoumlssaumlaumln sovelluksen jakeluun ja kaumlyttoumloumlnottoon sisaumll-

tyviksi asioiksi

-Sovellusta suorittavien ja tukevien palvelinympaumlristoumljen luominen ja paumlivittaumlminen

-Sovelluksen sekauml sen kaumlyttaumlmien ohjelmistokomponenttien siirtaumlminen ja maumlaumlrittaumlmi-

nen esimerkiksi testaus- laadunvarmistus- esittely-koulutus- sekauml tuotantoympaumlris-

toumlihin Kohdeympaumlristoumlissauml olevat vanhat versiot on mahdollisesti paumlivitettaumlvauml jollei

uusia versiota asenneta niiden rinnalle

19

-Uusien tietokantojen luominen sekauml vanhojen paumlivittaumlminen uutta sovellusversiota

vastaaviksi

-Kirjanpidollisen materiaalin tuottaminen ja yllaumlpitaumlminen

-Palautteen antaminen jakelu- ja kaumlyttoumloumlnottoprosessin onnistumisesta

Taumlmaumln luvun tarkoitus oli perehdyttaumlauml lukija ymmaumlrtaumlmaumlaumln koontiprosessia koontiku-

vaus-esimerkkien avulla Koontiprosessin ymmaumlrtaumlminen on vaumllttaumlmaumltoumlntauml seuraavan

luvun ymmaumlrtaumlmiseen jossa perehdytaumlaumln koontiympaumlristouml -kaumlsitteeseen

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant

Taumlssauml luvussa luodaan nopea katsaus koonti- ja kaumlyttoumloumlnottoprosessien automatisoimi-

seen tutustutaan jatkuvaan integraatioon sekauml sovellukseen Jenkins CI

Lisaumlksi tutustutaan projektihallintaohjelmaan Agilefant Agilefant on yksi monipuoli-

simmista kevyistauml vapaan laumlhdekoodin projektinhallintasovelluksista ja se soveltuu

niin pieniin kuin suuriinkin projekteihin

Naumlmauml sovellukset esitellaumlaumln pohjustuksena lukuja 5 ja 6 varten joissa tutustutaan

koontiympaumlristoumln tarkkailuun

41 Jatkuva integraatio

Jatkuva integraatio (Continuous Integration CI) on modernin sovelluskehityksen kul-

makivi Itse asiassa se on mullistanut sovelluskehityksen Kun jatkuva integraatio ote-

taan kaumlyttoumloumln organisaatiossa se muuttaa radikaalisti sitauml miten tyoumlryhmauml ymmaumlrtaumlauml

koko kehitysprosessin Jatkuvalla integraatiolla on potentiaalia laukaista sarja paran-

nuksia organisaation tuotteen kehitysprosessiin Se alkaa yksinkertaisesta automaatti-

sesta koonnista kehittyen systeemiksi joka automaattisesti saattaa tuotteen tuotan-

toon Hyvauml CI-infrastruktuuri mahdollistaa virheiden helpon sekauml nopean huomaamisen

ja tarjoaa kojelaudan projektin hyvinvoinnin ja muiden statistiikkojen seuraamiseen

sekauml kehittaumljille ettauml muille projektin osapuolille Jenkins The Definite Guiden mukaan

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 20: Joakim Sandqvist - Theseus

14

maan projektin antamaan kaumlyttaumljaumllle palautetta dokumentoimaan kokoamisen ja te-

kemaumlaumln useita muita tehtaumlviauml erillisillauml Mavenin tarjoamilla lisaumlosilla (plug-ins) [Apache

Maven Project Welcome to Apache Maven]

POM on XML-tiedosto joka sisaumlltaumlauml informaatiota projektista ja yksityiskohtaisen konfi-

guraation jota Maven kaumlyttaumlauml projektin kokoamiseen POM kostuu kohteista (goals)

jotka on maumlaumlritelty pomxml -tiedostossa Kun suoritetaan erillinen tehtaumlvauml tai kohde

Maven etsii POMmia tyoumlhakemistosta lukee POMmin hakee tarvittavan konfiguraati-

on ja suorittaa kohteen

Eraumlitauml POMissa maumlaumlriteltaumlviauml konfiguraatioita ovat projektin riippuvuudet kaumlytettaumlvaumlt

lisaumlosat ajettavat kohteet ja koontiprofiilit POMiin voi maumlaumlritellauml muutakin tietoa ku-

ten projektin version kehittaumljaumlt ja postituslistat [Apache Maven Project Introduction

to the POM]

Maven on Java-tyoumlkalu joten Java taumlytyy olla asennettuna Mavenia ajavalle koneelle

Taumlmauml luku perustuu Apachen verkkosivuilla sijaitsevaan Mavenin kaumlyttoumlohjeeseen

[Apache Maven Project Maven in 5 Minutes] Seuraavaksi luetellaan eri vaiheet Ma-

ven-projektin luomiseksi

Ensin on ladattava Maven ja kaumlytaumlvauml laumlpi asennusohjeet jotka loumlytyvaumlt osoitteesta

[httpmavenapacheorgdownloadhtmlInstallation] Taumlmaumln jaumllkeen on avattava

terminaali tai komentokehote ja kirjoitettava

mvn --version

Taumlmaumln tulostaa asennetun Mavenin ja Javan versio Esimerkiksi

1 Apache Maven 303 (r1075438 2011-02-28 183109+0100)

2 Maven home Dapache-maven-303bin

3 Java version 160_25 vendor Sun Microsystems Inc

4 Java home EProgram FilesJavajdk160_25jre

5 Default locale nl_NL platform encoding Cp1252

6 OS name windows 7 version 61 arch amd64 family windows

Maven-projekti luodaan ajamalla terminaalissa Maven kohde (goal)

15

mvn archetypegenerate -DgroupId=commycompanyapp -DartifactId=my-app -

DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Ensimmaumlisellauml ajolla taumlmauml komento lataa tarvittavat Maven lisaumlosat ja muita tiedostoja

paikalliseen tietovarastoon Huomataan ettauml rdquogeneraterdquo kohde loi rdquoartifactIdrdquonauml anne-

tun hakemiston

Kirjoitetaan komentoriville

cd my-app

Taumlmaumln kansion alta loumlytyy Mavenin standardi projektirakenne

my-app

|-- pomxml

`-- src

|-- main

| `-- java

| `-- com

| `-- mycompany

| `-- app

| `-- Appjava

`-- test

`-- java

`-- com

`-- mycompany

`-- app

`-- AppTestjava

Yllauml kuvatussa hakemistorakenteessa oleva rdquosrcmainjavardquo-hakemisto sisaumlltaumlauml projek-

tin laumlhdekoodin Vastaavasti rdquosrctestjavardquo-hakemisto sisaumlltaumlauml testien laumlhdekoodin

Pomxml-tiedosto kuvaa projektin konfiguraatiota ja sisaumlltaumlauml projektin kokoamisohjeet

Esimerkkiprojektin POM naumlyttaumlauml taumlltauml

1 ltpro-

ject xmlns=httpmavenapacheorgPOM400 xmlnsxsi=httpwwww3org20

01XMLSchema-instance

2 xsischemaLocation=httpmavenapacheorgPOM400 httpmavenapacheorg

xsdmaven-400xsdgt

3 ltmodelVersiongt400ltmodelVersiongt

4

5 ltgroupIdgtcommycompanyappltgroupIdgt

6 ltartifactIdgtmy-appltartifactIdgt

16

7 ltversiongt10-SNAPSHOTltversiongt

8 ltpackaginggtjarltpackaginggt

9

10 ltnamegtMaven Quick Start Archetypeltnamegt

11 lturlgthttpmavenapacheorglturlgt

12 13 ltdependenciesgt

14 ltdependencygt

15 ltgroupIdgtjunitltgroupIdgt

16 ltartifactIdgtjunitltartifactIdgt

17 ltversiongt482ltversiongt

18 ltscopegttestltscopegt

19 ltdependencygt

20 ltdependenciesgt

21 ltprojectgt

POM-tiedosto on Maven-projektin konfiguraation ydin Se sisaumlltaumlauml suurimman osan

informaatiosta joka vaaditaan projektin kokoamiseen halutulla tavalla

Aikaisemmassa esimerkissauml ajettiin Mavenin kohde (goal) archetypegenerate ja an-

nettiin sille parametreja Etuliite archetype on lisaumlosa joka sisaumlltaumlauml kohteen generate

Taumltauml voi verrata Antin tehtaumlvaumlaumln Taumlmauml kohde loi yksinkertaisen projektin joka perus-

tuu arkkityyppiin Yleisesti Mavenin lisaumlosat koostuvat kohteista joilla on yhteinen paumlauml-

tarkoitus Esimerkki taumlllaisesta lisaumlosasta on jboss-maven-plugin jonka tehtaumlvaumlnauml on

kaumlsitellauml erinaumlisiauml Jboss-komponentteja (items)

Maven-projekti kootaan komentoriviltauml seuraavanlaisesti

mvn package

Komentorivi tulostaa eri komentoja tulostus loppuu seuraavanlaisesti

[INFO] --------------------------

[INFO] BUILD SUCCESSFUL

[INFO] --------------------------

[INFO] Total time 2 seconds

[INFO] Finished at Thu Jul 07 213452 CEST 2011

[INFO] Final Memory 3M6M

[INFO] --------------------------

Toisin kuin ensimmaumliseksi suoritetussa komennossa (archetypegenerate) huomataan

taumlllauml kertaa kaumlytetty komento package on vain yksi sana Taumlllaista komentoa kutsutaan

17

kohteen (goal) sijaan vaiheeksi (phase) Vaihe on yksi askel koonnin elinkaaressa

(build lifecycle) joka on jaumlrjestetty sarja eri vaiheita Jos esimerkiksi ajetaan vaiheen

compile Maven itseasiassa suorittaa sarjan vaiheita

1 validate

2 generate-sources

3 process-sources

4 generate-resources

5 process-resources

6 compile

Compilen ajamisen jaumllkeen voidaan testata kaumlaumlnnettyauml JARia seuraavalla komennolla

java -cp targetmy-app-10-SNAPSHOTjar commycompanyappApp

Taumlmauml komento tulostaa

Hello World

Kaumlydaumlaumln laumlpi vielauml eri Mavenin yleisimmaumlt oletuselinkaaressa kaumlytetyt vaiheet Naumlitauml

ovat

-validate varmistaa ettauml projekti on ehjauml ja kaikki tarvittava tieto on saatavilla

-compile kaumlaumlntaumlauml projektin laumlhdekoodin

-test testaa kaumlaumlnnetyn laumlhdekoodin kaumlyttaumlen sopivaa yksikkoumltestikehystauml Naumliden

testien ei tulisi vaatia vaiheita package tai deploy

-package paketoi kaumlaumlnnetyn koodin sen jaettavaan muotoon esimerkiksi JARriksi

-integration-test prosessoi ja jaumlrjestaumlauml paketin ympaumlristoumloumln jossa integraatiotestejauml

voidaan ajaa jos tarpeellista

-verify tarkistaa onko paketti validi ja taumlyttaumlaumlkouml se laatukriteerit

-install asentaa paketin paikalliseen tietovarastoon muiden paikallisten projektien

kaumlyttoumloumln tai paikallisten projektien riippuvuudeksi

-deploy kopioi lopullisen paketin ulkoiseen tietovarastoon jaettavaksi muille kehittaumljil-

le ja projekteille Tehdaumlaumln integraatio- tai julkaisuympaumlristoumlssauml

On vielauml kaksi muuta mainitsemisen arvoista Maven-elinkaarta jotka eivaumlt sisaumllly yllauml

listattuun oletuselinkaareen Naumlitauml ovat

18

-clean poistaa aikaisempien koontien yhteydessauml luodut artifaktit

-site generoi verkkodokumentaation kyseiselle projektille

Jokainen vaihe sisaumlltaumlauml sarjan suoritettavia kohteita joiden ajaminen riippuu projektin

paketointityypistauml Jos projektin tyyppi on JAR niin package ajaa kohteen jarjar Vas-

taavasti WAR -tyyppisen projektin package -vaihe suorittaa kohteen warwar

34 Koonti ja kaumlyttoumloumlnotto

Ohjelmiston saattamista laumlhdekoodista loppukaumlyttaumljaumllle kaumlyttoumlkelpoiseen muotoon kut-

sutaan koonniksi Laumlhdekoodin kaumlaumlntaumlmisen lisaumlksi koonti voi sisaumlltaumlauml monia muita vai-

heita Aleksi Lukkarinen on opinnaumlytetyoumlssaumlaumln listannut esimerkkejauml erilaisista koon-

neista seuraavasti [Aleksi Lukkarinen opinnaumlytetyouml]

-ohjelmointikielisen laumlhdekoodin sekauml resurssien automatisoitua luomista

-eri ohjelmointikielillauml tuotetun laumlhdekoodin kaumlaumlntaumlmistauml kone- jatai vaumllikielille

-vaumlli- tai konekielisen ohjelmakoodin jaumllkikaumlsittelyauml esimerkiksi testauksen aspektioh-

jelmoinnin tai koodin tarkoituksellisen sotkemisen vuoksi

-sovelluksen testausta (esimerkiksi toimivuus tietoturvallisuus suorituskyky rakenteel-

linen ja koodaustekninen laatu sekauml kaumlyttoumltarkoitustaan vastaavuus)

-dokumentaation koontia (kuten varsinaisen sovelluksen koonti)

-koontituotteiden paketointia sekauml mahdollisten fyysisten jakelumedioiden luontia toi-

mivuus- ja virustarkistuksineen

-ohjelmistomoduulien integrointia

-palautteen antamista koonnin tuloksista

Lukkarinen jaumlsentelee opinnaumlytetyoumlssaumlaumln sovelluksen jakeluun ja kaumlyttoumloumlnottoon sisaumll-

tyviksi asioiksi

-Sovellusta suorittavien ja tukevien palvelinympaumlristoumljen luominen ja paumlivittaumlminen

-Sovelluksen sekauml sen kaumlyttaumlmien ohjelmistokomponenttien siirtaumlminen ja maumlaumlrittaumlmi-

nen esimerkiksi testaus- laadunvarmistus- esittely-koulutus- sekauml tuotantoympaumlris-

toumlihin Kohdeympaumlristoumlissauml olevat vanhat versiot on mahdollisesti paumlivitettaumlvauml jollei

uusia versiota asenneta niiden rinnalle

19

-Uusien tietokantojen luominen sekauml vanhojen paumlivittaumlminen uutta sovellusversiota

vastaaviksi

-Kirjanpidollisen materiaalin tuottaminen ja yllaumlpitaumlminen

-Palautteen antaminen jakelu- ja kaumlyttoumloumlnottoprosessin onnistumisesta

Taumlmaumln luvun tarkoitus oli perehdyttaumlauml lukija ymmaumlrtaumlmaumlaumln koontiprosessia koontiku-

vaus-esimerkkien avulla Koontiprosessin ymmaumlrtaumlminen on vaumllttaumlmaumltoumlntauml seuraavan

luvun ymmaumlrtaumlmiseen jossa perehdytaumlaumln koontiympaumlristouml -kaumlsitteeseen

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant

Taumlssauml luvussa luodaan nopea katsaus koonti- ja kaumlyttoumloumlnottoprosessien automatisoimi-

seen tutustutaan jatkuvaan integraatioon sekauml sovellukseen Jenkins CI

Lisaumlksi tutustutaan projektihallintaohjelmaan Agilefant Agilefant on yksi monipuoli-

simmista kevyistauml vapaan laumlhdekoodin projektinhallintasovelluksista ja se soveltuu

niin pieniin kuin suuriinkin projekteihin

Naumlmauml sovellukset esitellaumlaumln pohjustuksena lukuja 5 ja 6 varten joissa tutustutaan

koontiympaumlristoumln tarkkailuun

41 Jatkuva integraatio

Jatkuva integraatio (Continuous Integration CI) on modernin sovelluskehityksen kul-

makivi Itse asiassa se on mullistanut sovelluskehityksen Kun jatkuva integraatio ote-

taan kaumlyttoumloumln organisaatiossa se muuttaa radikaalisti sitauml miten tyoumlryhmauml ymmaumlrtaumlauml

koko kehitysprosessin Jatkuvalla integraatiolla on potentiaalia laukaista sarja paran-

nuksia organisaation tuotteen kehitysprosessiin Se alkaa yksinkertaisesta automaatti-

sesta koonnista kehittyen systeemiksi joka automaattisesti saattaa tuotteen tuotan-

toon Hyvauml CI-infrastruktuuri mahdollistaa virheiden helpon sekauml nopean huomaamisen

ja tarjoaa kojelaudan projektin hyvinvoinnin ja muiden statistiikkojen seuraamiseen

sekauml kehittaumljille ettauml muille projektin osapuolille Jenkins The Definite Guiden mukaan

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 21: Joakim Sandqvist - Theseus

15

mvn archetypegenerate -DgroupId=commycompanyapp -DartifactId=my-app -

DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Ensimmaumlisellauml ajolla taumlmauml komento lataa tarvittavat Maven lisaumlosat ja muita tiedostoja

paikalliseen tietovarastoon Huomataan ettauml rdquogeneraterdquo kohde loi rdquoartifactIdrdquonauml anne-

tun hakemiston

Kirjoitetaan komentoriville

cd my-app

Taumlmaumln kansion alta loumlytyy Mavenin standardi projektirakenne

my-app

|-- pomxml

`-- src

|-- main

| `-- java

| `-- com

| `-- mycompany

| `-- app

| `-- Appjava

`-- test

`-- java

`-- com

`-- mycompany

`-- app

`-- AppTestjava

Yllauml kuvatussa hakemistorakenteessa oleva rdquosrcmainjavardquo-hakemisto sisaumlltaumlauml projek-

tin laumlhdekoodin Vastaavasti rdquosrctestjavardquo-hakemisto sisaumlltaumlauml testien laumlhdekoodin

Pomxml-tiedosto kuvaa projektin konfiguraatiota ja sisaumlltaumlauml projektin kokoamisohjeet

Esimerkkiprojektin POM naumlyttaumlauml taumlltauml

1 ltpro-

ject xmlns=httpmavenapacheorgPOM400 xmlnsxsi=httpwwww3org20

01XMLSchema-instance

2 xsischemaLocation=httpmavenapacheorgPOM400 httpmavenapacheorg

xsdmaven-400xsdgt

3 ltmodelVersiongt400ltmodelVersiongt

4

5 ltgroupIdgtcommycompanyappltgroupIdgt

6 ltartifactIdgtmy-appltartifactIdgt

16

7 ltversiongt10-SNAPSHOTltversiongt

8 ltpackaginggtjarltpackaginggt

9

10 ltnamegtMaven Quick Start Archetypeltnamegt

11 lturlgthttpmavenapacheorglturlgt

12 13 ltdependenciesgt

14 ltdependencygt

15 ltgroupIdgtjunitltgroupIdgt

16 ltartifactIdgtjunitltartifactIdgt

17 ltversiongt482ltversiongt

18 ltscopegttestltscopegt

19 ltdependencygt

20 ltdependenciesgt

21 ltprojectgt

POM-tiedosto on Maven-projektin konfiguraation ydin Se sisaumlltaumlauml suurimman osan

informaatiosta joka vaaditaan projektin kokoamiseen halutulla tavalla

Aikaisemmassa esimerkissauml ajettiin Mavenin kohde (goal) archetypegenerate ja an-

nettiin sille parametreja Etuliite archetype on lisaumlosa joka sisaumlltaumlauml kohteen generate

Taumltauml voi verrata Antin tehtaumlvaumlaumln Taumlmauml kohde loi yksinkertaisen projektin joka perus-

tuu arkkityyppiin Yleisesti Mavenin lisaumlosat koostuvat kohteista joilla on yhteinen paumlauml-

tarkoitus Esimerkki taumlllaisesta lisaumlosasta on jboss-maven-plugin jonka tehtaumlvaumlnauml on

kaumlsitellauml erinaumlisiauml Jboss-komponentteja (items)

Maven-projekti kootaan komentoriviltauml seuraavanlaisesti

mvn package

Komentorivi tulostaa eri komentoja tulostus loppuu seuraavanlaisesti

[INFO] --------------------------

[INFO] BUILD SUCCESSFUL

[INFO] --------------------------

[INFO] Total time 2 seconds

[INFO] Finished at Thu Jul 07 213452 CEST 2011

[INFO] Final Memory 3M6M

[INFO] --------------------------

Toisin kuin ensimmaumliseksi suoritetussa komennossa (archetypegenerate) huomataan

taumlllauml kertaa kaumlytetty komento package on vain yksi sana Taumlllaista komentoa kutsutaan

17

kohteen (goal) sijaan vaiheeksi (phase) Vaihe on yksi askel koonnin elinkaaressa

(build lifecycle) joka on jaumlrjestetty sarja eri vaiheita Jos esimerkiksi ajetaan vaiheen

compile Maven itseasiassa suorittaa sarjan vaiheita

1 validate

2 generate-sources

3 process-sources

4 generate-resources

5 process-resources

6 compile

Compilen ajamisen jaumllkeen voidaan testata kaumlaumlnnettyauml JARia seuraavalla komennolla

java -cp targetmy-app-10-SNAPSHOTjar commycompanyappApp

Taumlmauml komento tulostaa

Hello World

Kaumlydaumlaumln laumlpi vielauml eri Mavenin yleisimmaumlt oletuselinkaaressa kaumlytetyt vaiheet Naumlitauml

ovat

-validate varmistaa ettauml projekti on ehjauml ja kaikki tarvittava tieto on saatavilla

-compile kaumlaumlntaumlauml projektin laumlhdekoodin

-test testaa kaumlaumlnnetyn laumlhdekoodin kaumlyttaumlen sopivaa yksikkoumltestikehystauml Naumliden

testien ei tulisi vaatia vaiheita package tai deploy

-package paketoi kaumlaumlnnetyn koodin sen jaettavaan muotoon esimerkiksi JARriksi

-integration-test prosessoi ja jaumlrjestaumlauml paketin ympaumlristoumloumln jossa integraatiotestejauml

voidaan ajaa jos tarpeellista

-verify tarkistaa onko paketti validi ja taumlyttaumlaumlkouml se laatukriteerit

-install asentaa paketin paikalliseen tietovarastoon muiden paikallisten projektien

kaumlyttoumloumln tai paikallisten projektien riippuvuudeksi

-deploy kopioi lopullisen paketin ulkoiseen tietovarastoon jaettavaksi muille kehittaumljil-

le ja projekteille Tehdaumlaumln integraatio- tai julkaisuympaumlristoumlssauml

On vielauml kaksi muuta mainitsemisen arvoista Maven-elinkaarta jotka eivaumlt sisaumllly yllauml

listattuun oletuselinkaareen Naumlitauml ovat

18

-clean poistaa aikaisempien koontien yhteydessauml luodut artifaktit

-site generoi verkkodokumentaation kyseiselle projektille

Jokainen vaihe sisaumlltaumlauml sarjan suoritettavia kohteita joiden ajaminen riippuu projektin

paketointityypistauml Jos projektin tyyppi on JAR niin package ajaa kohteen jarjar Vas-

taavasti WAR -tyyppisen projektin package -vaihe suorittaa kohteen warwar

34 Koonti ja kaumlyttoumloumlnotto

Ohjelmiston saattamista laumlhdekoodista loppukaumlyttaumljaumllle kaumlyttoumlkelpoiseen muotoon kut-

sutaan koonniksi Laumlhdekoodin kaumlaumlntaumlmisen lisaumlksi koonti voi sisaumlltaumlauml monia muita vai-

heita Aleksi Lukkarinen on opinnaumlytetyoumlssaumlaumln listannut esimerkkejauml erilaisista koon-

neista seuraavasti [Aleksi Lukkarinen opinnaumlytetyouml]

-ohjelmointikielisen laumlhdekoodin sekauml resurssien automatisoitua luomista

-eri ohjelmointikielillauml tuotetun laumlhdekoodin kaumlaumlntaumlmistauml kone- jatai vaumllikielille

-vaumlli- tai konekielisen ohjelmakoodin jaumllkikaumlsittelyauml esimerkiksi testauksen aspektioh-

jelmoinnin tai koodin tarkoituksellisen sotkemisen vuoksi

-sovelluksen testausta (esimerkiksi toimivuus tietoturvallisuus suorituskyky rakenteel-

linen ja koodaustekninen laatu sekauml kaumlyttoumltarkoitustaan vastaavuus)

-dokumentaation koontia (kuten varsinaisen sovelluksen koonti)

-koontituotteiden paketointia sekauml mahdollisten fyysisten jakelumedioiden luontia toi-

mivuus- ja virustarkistuksineen

-ohjelmistomoduulien integrointia

-palautteen antamista koonnin tuloksista

Lukkarinen jaumlsentelee opinnaumlytetyoumlssaumlaumln sovelluksen jakeluun ja kaumlyttoumloumlnottoon sisaumll-

tyviksi asioiksi

-Sovellusta suorittavien ja tukevien palvelinympaumlristoumljen luominen ja paumlivittaumlminen

-Sovelluksen sekauml sen kaumlyttaumlmien ohjelmistokomponenttien siirtaumlminen ja maumlaumlrittaumlmi-

nen esimerkiksi testaus- laadunvarmistus- esittely-koulutus- sekauml tuotantoympaumlris-

toumlihin Kohdeympaumlristoumlissauml olevat vanhat versiot on mahdollisesti paumlivitettaumlvauml jollei

uusia versiota asenneta niiden rinnalle

19

-Uusien tietokantojen luominen sekauml vanhojen paumlivittaumlminen uutta sovellusversiota

vastaaviksi

-Kirjanpidollisen materiaalin tuottaminen ja yllaumlpitaumlminen

-Palautteen antaminen jakelu- ja kaumlyttoumloumlnottoprosessin onnistumisesta

Taumlmaumln luvun tarkoitus oli perehdyttaumlauml lukija ymmaumlrtaumlmaumlaumln koontiprosessia koontiku-

vaus-esimerkkien avulla Koontiprosessin ymmaumlrtaumlminen on vaumllttaumlmaumltoumlntauml seuraavan

luvun ymmaumlrtaumlmiseen jossa perehdytaumlaumln koontiympaumlristouml -kaumlsitteeseen

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant

Taumlssauml luvussa luodaan nopea katsaus koonti- ja kaumlyttoumloumlnottoprosessien automatisoimi-

seen tutustutaan jatkuvaan integraatioon sekauml sovellukseen Jenkins CI

Lisaumlksi tutustutaan projektihallintaohjelmaan Agilefant Agilefant on yksi monipuoli-

simmista kevyistauml vapaan laumlhdekoodin projektinhallintasovelluksista ja se soveltuu

niin pieniin kuin suuriinkin projekteihin

Naumlmauml sovellukset esitellaumlaumln pohjustuksena lukuja 5 ja 6 varten joissa tutustutaan

koontiympaumlristoumln tarkkailuun

41 Jatkuva integraatio

Jatkuva integraatio (Continuous Integration CI) on modernin sovelluskehityksen kul-

makivi Itse asiassa se on mullistanut sovelluskehityksen Kun jatkuva integraatio ote-

taan kaumlyttoumloumln organisaatiossa se muuttaa radikaalisti sitauml miten tyoumlryhmauml ymmaumlrtaumlauml

koko kehitysprosessin Jatkuvalla integraatiolla on potentiaalia laukaista sarja paran-

nuksia organisaation tuotteen kehitysprosessiin Se alkaa yksinkertaisesta automaatti-

sesta koonnista kehittyen systeemiksi joka automaattisesti saattaa tuotteen tuotan-

toon Hyvauml CI-infrastruktuuri mahdollistaa virheiden helpon sekauml nopean huomaamisen

ja tarjoaa kojelaudan projektin hyvinvoinnin ja muiden statistiikkojen seuraamiseen

sekauml kehittaumljille ettauml muille projektin osapuolille Jenkins The Definite Guiden mukaan

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 22: Joakim Sandqvist - Theseus

16

7 ltversiongt10-SNAPSHOTltversiongt

8 ltpackaginggtjarltpackaginggt

9

10 ltnamegtMaven Quick Start Archetypeltnamegt

11 lturlgthttpmavenapacheorglturlgt

12 13 ltdependenciesgt

14 ltdependencygt

15 ltgroupIdgtjunitltgroupIdgt

16 ltartifactIdgtjunitltartifactIdgt

17 ltversiongt482ltversiongt

18 ltscopegttestltscopegt

19 ltdependencygt

20 ltdependenciesgt

21 ltprojectgt

POM-tiedosto on Maven-projektin konfiguraation ydin Se sisaumlltaumlauml suurimman osan

informaatiosta joka vaaditaan projektin kokoamiseen halutulla tavalla

Aikaisemmassa esimerkissauml ajettiin Mavenin kohde (goal) archetypegenerate ja an-

nettiin sille parametreja Etuliite archetype on lisaumlosa joka sisaumlltaumlauml kohteen generate

Taumltauml voi verrata Antin tehtaumlvaumlaumln Taumlmauml kohde loi yksinkertaisen projektin joka perus-

tuu arkkityyppiin Yleisesti Mavenin lisaumlosat koostuvat kohteista joilla on yhteinen paumlauml-

tarkoitus Esimerkki taumlllaisesta lisaumlosasta on jboss-maven-plugin jonka tehtaumlvaumlnauml on

kaumlsitellauml erinaumlisiauml Jboss-komponentteja (items)

Maven-projekti kootaan komentoriviltauml seuraavanlaisesti

mvn package

Komentorivi tulostaa eri komentoja tulostus loppuu seuraavanlaisesti

[INFO] --------------------------

[INFO] BUILD SUCCESSFUL

[INFO] --------------------------

[INFO] Total time 2 seconds

[INFO] Finished at Thu Jul 07 213452 CEST 2011

[INFO] Final Memory 3M6M

[INFO] --------------------------

Toisin kuin ensimmaumliseksi suoritetussa komennossa (archetypegenerate) huomataan

taumlllauml kertaa kaumlytetty komento package on vain yksi sana Taumlllaista komentoa kutsutaan

17

kohteen (goal) sijaan vaiheeksi (phase) Vaihe on yksi askel koonnin elinkaaressa

(build lifecycle) joka on jaumlrjestetty sarja eri vaiheita Jos esimerkiksi ajetaan vaiheen

compile Maven itseasiassa suorittaa sarjan vaiheita

1 validate

2 generate-sources

3 process-sources

4 generate-resources

5 process-resources

6 compile

Compilen ajamisen jaumllkeen voidaan testata kaumlaumlnnettyauml JARia seuraavalla komennolla

java -cp targetmy-app-10-SNAPSHOTjar commycompanyappApp

Taumlmauml komento tulostaa

Hello World

Kaumlydaumlaumln laumlpi vielauml eri Mavenin yleisimmaumlt oletuselinkaaressa kaumlytetyt vaiheet Naumlitauml

ovat

-validate varmistaa ettauml projekti on ehjauml ja kaikki tarvittava tieto on saatavilla

-compile kaumlaumlntaumlauml projektin laumlhdekoodin

-test testaa kaumlaumlnnetyn laumlhdekoodin kaumlyttaumlen sopivaa yksikkoumltestikehystauml Naumliden

testien ei tulisi vaatia vaiheita package tai deploy

-package paketoi kaumlaumlnnetyn koodin sen jaettavaan muotoon esimerkiksi JARriksi

-integration-test prosessoi ja jaumlrjestaumlauml paketin ympaumlristoumloumln jossa integraatiotestejauml

voidaan ajaa jos tarpeellista

-verify tarkistaa onko paketti validi ja taumlyttaumlaumlkouml se laatukriteerit

-install asentaa paketin paikalliseen tietovarastoon muiden paikallisten projektien

kaumlyttoumloumln tai paikallisten projektien riippuvuudeksi

-deploy kopioi lopullisen paketin ulkoiseen tietovarastoon jaettavaksi muille kehittaumljil-

le ja projekteille Tehdaumlaumln integraatio- tai julkaisuympaumlristoumlssauml

On vielauml kaksi muuta mainitsemisen arvoista Maven-elinkaarta jotka eivaumlt sisaumllly yllauml

listattuun oletuselinkaareen Naumlitauml ovat

18

-clean poistaa aikaisempien koontien yhteydessauml luodut artifaktit

-site generoi verkkodokumentaation kyseiselle projektille

Jokainen vaihe sisaumlltaumlauml sarjan suoritettavia kohteita joiden ajaminen riippuu projektin

paketointityypistauml Jos projektin tyyppi on JAR niin package ajaa kohteen jarjar Vas-

taavasti WAR -tyyppisen projektin package -vaihe suorittaa kohteen warwar

34 Koonti ja kaumlyttoumloumlnotto

Ohjelmiston saattamista laumlhdekoodista loppukaumlyttaumljaumllle kaumlyttoumlkelpoiseen muotoon kut-

sutaan koonniksi Laumlhdekoodin kaumlaumlntaumlmisen lisaumlksi koonti voi sisaumlltaumlauml monia muita vai-

heita Aleksi Lukkarinen on opinnaumlytetyoumlssaumlaumln listannut esimerkkejauml erilaisista koon-

neista seuraavasti [Aleksi Lukkarinen opinnaumlytetyouml]

-ohjelmointikielisen laumlhdekoodin sekauml resurssien automatisoitua luomista

-eri ohjelmointikielillauml tuotetun laumlhdekoodin kaumlaumlntaumlmistauml kone- jatai vaumllikielille

-vaumlli- tai konekielisen ohjelmakoodin jaumllkikaumlsittelyauml esimerkiksi testauksen aspektioh-

jelmoinnin tai koodin tarkoituksellisen sotkemisen vuoksi

-sovelluksen testausta (esimerkiksi toimivuus tietoturvallisuus suorituskyky rakenteel-

linen ja koodaustekninen laatu sekauml kaumlyttoumltarkoitustaan vastaavuus)

-dokumentaation koontia (kuten varsinaisen sovelluksen koonti)

-koontituotteiden paketointia sekauml mahdollisten fyysisten jakelumedioiden luontia toi-

mivuus- ja virustarkistuksineen

-ohjelmistomoduulien integrointia

-palautteen antamista koonnin tuloksista

Lukkarinen jaumlsentelee opinnaumlytetyoumlssaumlaumln sovelluksen jakeluun ja kaumlyttoumloumlnottoon sisaumll-

tyviksi asioiksi

-Sovellusta suorittavien ja tukevien palvelinympaumlristoumljen luominen ja paumlivittaumlminen

-Sovelluksen sekauml sen kaumlyttaumlmien ohjelmistokomponenttien siirtaumlminen ja maumlaumlrittaumlmi-

nen esimerkiksi testaus- laadunvarmistus- esittely-koulutus- sekauml tuotantoympaumlris-

toumlihin Kohdeympaumlristoumlissauml olevat vanhat versiot on mahdollisesti paumlivitettaumlvauml jollei

uusia versiota asenneta niiden rinnalle

19

-Uusien tietokantojen luominen sekauml vanhojen paumlivittaumlminen uutta sovellusversiota

vastaaviksi

-Kirjanpidollisen materiaalin tuottaminen ja yllaumlpitaumlminen

-Palautteen antaminen jakelu- ja kaumlyttoumloumlnottoprosessin onnistumisesta

Taumlmaumln luvun tarkoitus oli perehdyttaumlauml lukija ymmaumlrtaumlmaumlaumln koontiprosessia koontiku-

vaus-esimerkkien avulla Koontiprosessin ymmaumlrtaumlminen on vaumllttaumlmaumltoumlntauml seuraavan

luvun ymmaumlrtaumlmiseen jossa perehdytaumlaumln koontiympaumlristouml -kaumlsitteeseen

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant

Taumlssauml luvussa luodaan nopea katsaus koonti- ja kaumlyttoumloumlnottoprosessien automatisoimi-

seen tutustutaan jatkuvaan integraatioon sekauml sovellukseen Jenkins CI

Lisaumlksi tutustutaan projektihallintaohjelmaan Agilefant Agilefant on yksi monipuoli-

simmista kevyistauml vapaan laumlhdekoodin projektinhallintasovelluksista ja se soveltuu

niin pieniin kuin suuriinkin projekteihin

Naumlmauml sovellukset esitellaumlaumln pohjustuksena lukuja 5 ja 6 varten joissa tutustutaan

koontiympaumlristoumln tarkkailuun

41 Jatkuva integraatio

Jatkuva integraatio (Continuous Integration CI) on modernin sovelluskehityksen kul-

makivi Itse asiassa se on mullistanut sovelluskehityksen Kun jatkuva integraatio ote-

taan kaumlyttoumloumln organisaatiossa se muuttaa radikaalisti sitauml miten tyoumlryhmauml ymmaumlrtaumlauml

koko kehitysprosessin Jatkuvalla integraatiolla on potentiaalia laukaista sarja paran-

nuksia organisaation tuotteen kehitysprosessiin Se alkaa yksinkertaisesta automaatti-

sesta koonnista kehittyen systeemiksi joka automaattisesti saattaa tuotteen tuotan-

toon Hyvauml CI-infrastruktuuri mahdollistaa virheiden helpon sekauml nopean huomaamisen

ja tarjoaa kojelaudan projektin hyvinvoinnin ja muiden statistiikkojen seuraamiseen

sekauml kehittaumljille ettauml muille projektin osapuolille Jenkins The Definite Guiden mukaan

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 23: Joakim Sandqvist - Theseus

17

kohteen (goal) sijaan vaiheeksi (phase) Vaihe on yksi askel koonnin elinkaaressa

(build lifecycle) joka on jaumlrjestetty sarja eri vaiheita Jos esimerkiksi ajetaan vaiheen

compile Maven itseasiassa suorittaa sarjan vaiheita

1 validate

2 generate-sources

3 process-sources

4 generate-resources

5 process-resources

6 compile

Compilen ajamisen jaumllkeen voidaan testata kaumlaumlnnettyauml JARia seuraavalla komennolla

java -cp targetmy-app-10-SNAPSHOTjar commycompanyappApp

Taumlmauml komento tulostaa

Hello World

Kaumlydaumlaumln laumlpi vielauml eri Mavenin yleisimmaumlt oletuselinkaaressa kaumlytetyt vaiheet Naumlitauml

ovat

-validate varmistaa ettauml projekti on ehjauml ja kaikki tarvittava tieto on saatavilla

-compile kaumlaumlntaumlauml projektin laumlhdekoodin

-test testaa kaumlaumlnnetyn laumlhdekoodin kaumlyttaumlen sopivaa yksikkoumltestikehystauml Naumliden

testien ei tulisi vaatia vaiheita package tai deploy

-package paketoi kaumlaumlnnetyn koodin sen jaettavaan muotoon esimerkiksi JARriksi

-integration-test prosessoi ja jaumlrjestaumlauml paketin ympaumlristoumloumln jossa integraatiotestejauml

voidaan ajaa jos tarpeellista

-verify tarkistaa onko paketti validi ja taumlyttaumlaumlkouml se laatukriteerit

-install asentaa paketin paikalliseen tietovarastoon muiden paikallisten projektien

kaumlyttoumloumln tai paikallisten projektien riippuvuudeksi

-deploy kopioi lopullisen paketin ulkoiseen tietovarastoon jaettavaksi muille kehittaumljil-

le ja projekteille Tehdaumlaumln integraatio- tai julkaisuympaumlristoumlssauml

On vielauml kaksi muuta mainitsemisen arvoista Maven-elinkaarta jotka eivaumlt sisaumllly yllauml

listattuun oletuselinkaareen Naumlitauml ovat

18

-clean poistaa aikaisempien koontien yhteydessauml luodut artifaktit

-site generoi verkkodokumentaation kyseiselle projektille

Jokainen vaihe sisaumlltaumlauml sarjan suoritettavia kohteita joiden ajaminen riippuu projektin

paketointityypistauml Jos projektin tyyppi on JAR niin package ajaa kohteen jarjar Vas-

taavasti WAR -tyyppisen projektin package -vaihe suorittaa kohteen warwar

34 Koonti ja kaumlyttoumloumlnotto

Ohjelmiston saattamista laumlhdekoodista loppukaumlyttaumljaumllle kaumlyttoumlkelpoiseen muotoon kut-

sutaan koonniksi Laumlhdekoodin kaumlaumlntaumlmisen lisaumlksi koonti voi sisaumlltaumlauml monia muita vai-

heita Aleksi Lukkarinen on opinnaumlytetyoumlssaumlaumln listannut esimerkkejauml erilaisista koon-

neista seuraavasti [Aleksi Lukkarinen opinnaumlytetyouml]

-ohjelmointikielisen laumlhdekoodin sekauml resurssien automatisoitua luomista

-eri ohjelmointikielillauml tuotetun laumlhdekoodin kaumlaumlntaumlmistauml kone- jatai vaumllikielille

-vaumlli- tai konekielisen ohjelmakoodin jaumllkikaumlsittelyauml esimerkiksi testauksen aspektioh-

jelmoinnin tai koodin tarkoituksellisen sotkemisen vuoksi

-sovelluksen testausta (esimerkiksi toimivuus tietoturvallisuus suorituskyky rakenteel-

linen ja koodaustekninen laatu sekauml kaumlyttoumltarkoitustaan vastaavuus)

-dokumentaation koontia (kuten varsinaisen sovelluksen koonti)

-koontituotteiden paketointia sekauml mahdollisten fyysisten jakelumedioiden luontia toi-

mivuus- ja virustarkistuksineen

-ohjelmistomoduulien integrointia

-palautteen antamista koonnin tuloksista

Lukkarinen jaumlsentelee opinnaumlytetyoumlssaumlaumln sovelluksen jakeluun ja kaumlyttoumloumlnottoon sisaumll-

tyviksi asioiksi

-Sovellusta suorittavien ja tukevien palvelinympaumlristoumljen luominen ja paumlivittaumlminen

-Sovelluksen sekauml sen kaumlyttaumlmien ohjelmistokomponenttien siirtaumlminen ja maumlaumlrittaumlmi-

nen esimerkiksi testaus- laadunvarmistus- esittely-koulutus- sekauml tuotantoympaumlris-

toumlihin Kohdeympaumlristoumlissauml olevat vanhat versiot on mahdollisesti paumlivitettaumlvauml jollei

uusia versiota asenneta niiden rinnalle

19

-Uusien tietokantojen luominen sekauml vanhojen paumlivittaumlminen uutta sovellusversiota

vastaaviksi

-Kirjanpidollisen materiaalin tuottaminen ja yllaumlpitaumlminen

-Palautteen antaminen jakelu- ja kaumlyttoumloumlnottoprosessin onnistumisesta

Taumlmaumln luvun tarkoitus oli perehdyttaumlauml lukija ymmaumlrtaumlmaumlaumln koontiprosessia koontiku-

vaus-esimerkkien avulla Koontiprosessin ymmaumlrtaumlminen on vaumllttaumlmaumltoumlntauml seuraavan

luvun ymmaumlrtaumlmiseen jossa perehdytaumlaumln koontiympaumlristouml -kaumlsitteeseen

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant

Taumlssauml luvussa luodaan nopea katsaus koonti- ja kaumlyttoumloumlnottoprosessien automatisoimi-

seen tutustutaan jatkuvaan integraatioon sekauml sovellukseen Jenkins CI

Lisaumlksi tutustutaan projektihallintaohjelmaan Agilefant Agilefant on yksi monipuoli-

simmista kevyistauml vapaan laumlhdekoodin projektinhallintasovelluksista ja se soveltuu

niin pieniin kuin suuriinkin projekteihin

Naumlmauml sovellukset esitellaumlaumln pohjustuksena lukuja 5 ja 6 varten joissa tutustutaan

koontiympaumlristoumln tarkkailuun

41 Jatkuva integraatio

Jatkuva integraatio (Continuous Integration CI) on modernin sovelluskehityksen kul-

makivi Itse asiassa se on mullistanut sovelluskehityksen Kun jatkuva integraatio ote-

taan kaumlyttoumloumln organisaatiossa se muuttaa radikaalisti sitauml miten tyoumlryhmauml ymmaumlrtaumlauml

koko kehitysprosessin Jatkuvalla integraatiolla on potentiaalia laukaista sarja paran-

nuksia organisaation tuotteen kehitysprosessiin Se alkaa yksinkertaisesta automaatti-

sesta koonnista kehittyen systeemiksi joka automaattisesti saattaa tuotteen tuotan-

toon Hyvauml CI-infrastruktuuri mahdollistaa virheiden helpon sekauml nopean huomaamisen

ja tarjoaa kojelaudan projektin hyvinvoinnin ja muiden statistiikkojen seuraamiseen

sekauml kehittaumljille ettauml muille projektin osapuolille Jenkins The Definite Guiden mukaan

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 24: Joakim Sandqvist - Theseus

18

-clean poistaa aikaisempien koontien yhteydessauml luodut artifaktit

-site generoi verkkodokumentaation kyseiselle projektille

Jokainen vaihe sisaumlltaumlauml sarjan suoritettavia kohteita joiden ajaminen riippuu projektin

paketointityypistauml Jos projektin tyyppi on JAR niin package ajaa kohteen jarjar Vas-

taavasti WAR -tyyppisen projektin package -vaihe suorittaa kohteen warwar

34 Koonti ja kaumlyttoumloumlnotto

Ohjelmiston saattamista laumlhdekoodista loppukaumlyttaumljaumllle kaumlyttoumlkelpoiseen muotoon kut-

sutaan koonniksi Laumlhdekoodin kaumlaumlntaumlmisen lisaumlksi koonti voi sisaumlltaumlauml monia muita vai-

heita Aleksi Lukkarinen on opinnaumlytetyoumlssaumlaumln listannut esimerkkejauml erilaisista koon-

neista seuraavasti [Aleksi Lukkarinen opinnaumlytetyouml]

-ohjelmointikielisen laumlhdekoodin sekauml resurssien automatisoitua luomista

-eri ohjelmointikielillauml tuotetun laumlhdekoodin kaumlaumlntaumlmistauml kone- jatai vaumllikielille

-vaumlli- tai konekielisen ohjelmakoodin jaumllkikaumlsittelyauml esimerkiksi testauksen aspektioh-

jelmoinnin tai koodin tarkoituksellisen sotkemisen vuoksi

-sovelluksen testausta (esimerkiksi toimivuus tietoturvallisuus suorituskyky rakenteel-

linen ja koodaustekninen laatu sekauml kaumlyttoumltarkoitustaan vastaavuus)

-dokumentaation koontia (kuten varsinaisen sovelluksen koonti)

-koontituotteiden paketointia sekauml mahdollisten fyysisten jakelumedioiden luontia toi-

mivuus- ja virustarkistuksineen

-ohjelmistomoduulien integrointia

-palautteen antamista koonnin tuloksista

Lukkarinen jaumlsentelee opinnaumlytetyoumlssaumlaumln sovelluksen jakeluun ja kaumlyttoumloumlnottoon sisaumll-

tyviksi asioiksi

-Sovellusta suorittavien ja tukevien palvelinympaumlristoumljen luominen ja paumlivittaumlminen

-Sovelluksen sekauml sen kaumlyttaumlmien ohjelmistokomponenttien siirtaumlminen ja maumlaumlrittaumlmi-

nen esimerkiksi testaus- laadunvarmistus- esittely-koulutus- sekauml tuotantoympaumlris-

toumlihin Kohdeympaumlristoumlissauml olevat vanhat versiot on mahdollisesti paumlivitettaumlvauml jollei

uusia versiota asenneta niiden rinnalle

19

-Uusien tietokantojen luominen sekauml vanhojen paumlivittaumlminen uutta sovellusversiota

vastaaviksi

-Kirjanpidollisen materiaalin tuottaminen ja yllaumlpitaumlminen

-Palautteen antaminen jakelu- ja kaumlyttoumloumlnottoprosessin onnistumisesta

Taumlmaumln luvun tarkoitus oli perehdyttaumlauml lukija ymmaumlrtaumlmaumlaumln koontiprosessia koontiku-

vaus-esimerkkien avulla Koontiprosessin ymmaumlrtaumlminen on vaumllttaumlmaumltoumlntauml seuraavan

luvun ymmaumlrtaumlmiseen jossa perehdytaumlaumln koontiympaumlristouml -kaumlsitteeseen

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant

Taumlssauml luvussa luodaan nopea katsaus koonti- ja kaumlyttoumloumlnottoprosessien automatisoimi-

seen tutustutaan jatkuvaan integraatioon sekauml sovellukseen Jenkins CI

Lisaumlksi tutustutaan projektihallintaohjelmaan Agilefant Agilefant on yksi monipuoli-

simmista kevyistauml vapaan laumlhdekoodin projektinhallintasovelluksista ja se soveltuu

niin pieniin kuin suuriinkin projekteihin

Naumlmauml sovellukset esitellaumlaumln pohjustuksena lukuja 5 ja 6 varten joissa tutustutaan

koontiympaumlristoumln tarkkailuun

41 Jatkuva integraatio

Jatkuva integraatio (Continuous Integration CI) on modernin sovelluskehityksen kul-

makivi Itse asiassa se on mullistanut sovelluskehityksen Kun jatkuva integraatio ote-

taan kaumlyttoumloumln organisaatiossa se muuttaa radikaalisti sitauml miten tyoumlryhmauml ymmaumlrtaumlauml

koko kehitysprosessin Jatkuvalla integraatiolla on potentiaalia laukaista sarja paran-

nuksia organisaation tuotteen kehitysprosessiin Se alkaa yksinkertaisesta automaatti-

sesta koonnista kehittyen systeemiksi joka automaattisesti saattaa tuotteen tuotan-

toon Hyvauml CI-infrastruktuuri mahdollistaa virheiden helpon sekauml nopean huomaamisen

ja tarjoaa kojelaudan projektin hyvinvoinnin ja muiden statistiikkojen seuraamiseen

sekauml kehittaumljille ettauml muille projektin osapuolille Jenkins The Definite Guiden mukaan

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 25: Joakim Sandqvist - Theseus

19

-Uusien tietokantojen luominen sekauml vanhojen paumlivittaumlminen uutta sovellusversiota

vastaaviksi

-Kirjanpidollisen materiaalin tuottaminen ja yllaumlpitaumlminen

-Palautteen antaminen jakelu- ja kaumlyttoumloumlnottoprosessin onnistumisesta

Taumlmaumln luvun tarkoitus oli perehdyttaumlauml lukija ymmaumlrtaumlmaumlaumln koontiprosessia koontiku-

vaus-esimerkkien avulla Koontiprosessin ymmaumlrtaumlminen on vaumllttaumlmaumltoumlntauml seuraavan

luvun ymmaumlrtaumlmiseen jossa perehdytaumlaumln koontiympaumlristouml -kaumlsitteeseen

4 Koontiympaumlristoumln tarkkailun kriittiset sovellukset Jenkins CI sekauml Agilefant

Taumlssauml luvussa luodaan nopea katsaus koonti- ja kaumlyttoumloumlnottoprosessien automatisoimi-

seen tutustutaan jatkuvaan integraatioon sekauml sovellukseen Jenkins CI

Lisaumlksi tutustutaan projektihallintaohjelmaan Agilefant Agilefant on yksi monipuoli-

simmista kevyistauml vapaan laumlhdekoodin projektinhallintasovelluksista ja se soveltuu

niin pieniin kuin suuriinkin projekteihin

Naumlmauml sovellukset esitellaumlaumln pohjustuksena lukuja 5 ja 6 varten joissa tutustutaan

koontiympaumlristoumln tarkkailuun

41 Jatkuva integraatio

Jatkuva integraatio (Continuous Integration CI) on modernin sovelluskehityksen kul-

makivi Itse asiassa se on mullistanut sovelluskehityksen Kun jatkuva integraatio ote-

taan kaumlyttoumloumln organisaatiossa se muuttaa radikaalisti sitauml miten tyoumlryhmauml ymmaumlrtaumlauml

koko kehitysprosessin Jatkuvalla integraatiolla on potentiaalia laukaista sarja paran-

nuksia organisaation tuotteen kehitysprosessiin Se alkaa yksinkertaisesta automaatti-

sesta koonnista kehittyen systeemiksi joka automaattisesti saattaa tuotteen tuotan-

toon Hyvauml CI-infrastruktuuri mahdollistaa virheiden helpon sekauml nopean huomaamisen

ja tarjoaa kojelaudan projektin hyvinvoinnin ja muiden statistiikkojen seuraamiseen

sekauml kehittaumljille ettauml muille projektin osapuolille Jenkins The Definite Guiden mukaan

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 26: Joakim Sandqvist - Theseus

20

jokaisen kehitysryhmaumln kuinka pienen tahansa tulisi harjoittaa jatkuvaa integraatiota

[Jenkins The Definitive Guide 2011 s 1]

Jatkuva integraatio -palvelinsovelluksen ympaumlrille rakennettu kehitysympaumlristoumlinfra-

struktuuri koostuu yksinkertaisimmillaan kehittaumljaumln IDE-kehitystyoumlkalusta versionhal-

linnasta koontityoumlkalusta naumliden sovellusten konfiguraatiosta ja siitauml kuinka naumlmauml

osapuolet kommunikoivat keskenaumlaumln Jatkuva integraatio on lyhyesti sanottuna myoumls

laumlhdekoodin dokumentaation ja resurssien jatkuvaa yhteen kasaamista projektille

yhteiseen paikkaan Kuvassa 7 esitetaumlaumln jatkuvan integraation prosessi

Kuva 7 Jatkuva integraatio [Continuous Integration ndash Basic Overview and Best Practices]

Kuvassa on esitelty jatkuva integraatio prosessi jonka osapuolina toimivat kehitysryh-

mauml versionhallinta sekauml jatkuva integraatio palvelu (CI-palvelu esim Jenkins CI) CI-

palvelu tarkkailee versionhallintaa Kun CI-palvelu huomaa muutoksen versionhallin-

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 27: Joakim Sandqvist - Theseus

21

nassa se kokoaa versionhallinnassa olevan sovelluksen ja ajaa sovellukseen liitetyt

testit CI-palvelu huomauttaa kehittaumljiauml koonnin epaumlonnistuessa

Ohjelmistoprojektien kehitysryhmaumlt koostuvat usein useista kehittaumljistauml naumlmauml kehittauml-

jaumlt tuottavat esimerkiksi laumlhdekoodia sekauml dokumentaatiota Jos projektissa ei ole

otettu kaumlyttoumloumln jatkuvaa integraatiota on projektin kokoaminen tehtaumlvauml saumlaumlnnoumlllisin

vaumlliajoin manuaalisesti joka on epaumlkaumlytaumlnnoumlllistauml ja vie aikaa Taumltauml varten on kehitetty

jatkuva integraatio -palvelinsovelluksia (luku 42) joiden tehtaumlvaumlnauml on valvoa ettauml

koonti pysyy ehjaumlnauml jokaisen kehittaumljaumln tekemaumln tietovarastopaumlivityksen (integraatio)

tapahtuessa

Hyvin suunniteltu ja toteutettu kehitysympaumlristoumlinfrastruktuuri mahdollistaa esimerkiksi

seuraavanlaisen automatisoidun sarjan toimintoja Ohjelmoija muuttaa tietovarastossa

sijaitsevaa tiedostoa jonka jaumllkeen integraatiopalvelinsovellus (esimerkiksi Jenkins CI)

reagoi automaattisesti tietovarastopaumlivitykseen ja kaumlynnistaumlauml ennalta maumlaumlraumltyn sarjan

toimintoja ennalta maumlaumlraumltyssauml jaumlrjestyksessauml Lopputuloksena voi olla esimerkiksi lop-

pukaumlyttaumljaumllle valmis yksikkoumltestattu tuote automaattisesti generoidulla dokumentoinnil-

la tai rikkinaumlinen koonti Hyvin hallitussa projektissa taumlmauml tapahtuu yhdellauml napin pai-

nalluksella

Rikkinaumlinen koonti tarkoittaa esimerkiksi sitauml ettauml ohjelmistomoduulit tai -komponentit

ovat konfliktissa keskenaumlaumln Rikkinaumlinen koonti voi tarkoittaa myoumls yksittaumlisen yksikkouml-

testin epaumlonnistumista tai jopa xml-tiedoston sisennyksien poikkeamista ennalta sovi-

tusta linjasta riippuen integraatiopalvelinsovelluksen konfiguraatioista

42 Jenkins CI

Jenkins CI on jatkuva integraation -palvelinsovellus joka tarkkailee ja auttaa kaumlyttaumljaumlauml

hallinnoimaan sekauml luomaan koontitehtaumlviauml tai projektin aikana useasti suoritettavia

toistuvia tehtaumlviauml

Koontitehtaumlvauml tarkoittaa yksittaumlistauml tehtaumlvaumlauml joka suoritetaan yhdessauml muiden koonti-

tehtaumlvien kanssa kun projekti kootaan (build) Koontitehtaumlvauml voi olla esimerkiksi oh-

jelmiston yksikkoumltestaaminen Projektin aikana useasti suoritettava koontitehtaumlvauml voi

olla esimerkiksi saumlhkoumlpostimuistutus viikkopalaverista

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 28: Joakim Sandqvist - Theseus

22

Jenkins CI tarjoaa kaumlyttaumljaumlystaumlvaumlllisen kaumlyttoumlliittymaumln projektin kokoamisen hallintaan

sekauml tyoumlkalut myoumls ulkoisten koontitoumliden (build jobs) tarkkailuun

Kuvassa 8 on esitelty Jenkins CIn paumlaumlnaumlkymauml Esimerkkiprojektiin on maumlaumlritelty neljauml

koontityoumltauml Android AndroidTest php-template ja Raksa Naumlihin toumlihin on liitetty eri-

laisia koontitehtaumlviauml Kun naumlistauml toumlistauml kootaan yksi kaumlynnistaumlauml Jenkins CI kaikki yksit-

taumliset taumlhaumln tyoumlhoumln liitetyt koontitehtaumlvaumlt Naumliden koontitehtaumlvien vaumllille voidaan aset-

taa riippuvuuksia Koontitehtaumlvaumlt voivat olla riippuvaisia myoumls ulkopuolisista koontitoumlis-

tauml tai projekteista

Kuva 8 Jenkins CIn paumlaumlnaumlkymauml

Koontitehtaumlvien (luku 3) ja koontitehtaumlvien riippuvuuksien aumllykaumls maumlaumlrittely mahdollis-

taa dynaamisen koontiprosessin tekemisen Dynaamisella koontiprosessilla tarkoitetaan

sitauml ettauml projektin kokoaminen ei ole aina samanlainen prosessi vaan on riippuvainen

esimerkiksi kellonajasta tai toisesta koontityoumlstauml

Jenkins CI tarjoaa paljon erilaisia lisaumlosia (plug-in) projektin kokoamiseen ja tarkkai-

luun Jenkinsin lisaumlosakirjastosta on ladattavissa esimerkiksi koodikattavuuslisaumlosa

testituloslisaumlosa erilaisia koonnin laukaisulisaumlosia ja satoja muita lisaumlosia Lisaumlosien

lataaminen ja asennus kaumly helposti Jenkinsin omasta kaumlyttoumlliittymaumlstauml Kuvassa 9 on

esitelty eraumlaumln Jenkins CI -lisaumlosan tuottama kuvaaja Taumlstauml kuvaajasta on luettavissa

ohjelman laumlhdekoodista loumlytyvien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 29: Joakim Sandqvist - Theseus

23

Kuva 9 FindBugs Trend

Koontitehtaumlvien tarkkailu ei rajoitu kuitenkaan pelkaumlstaumlaumln kuvaajiin Jenkins CI antaa

myoumls yksityiskohtaista tietoa koonnista ja sen eri vaiheista (kuva 10)

Kuva 10 Jenkinsin konsolinaumlkymauml

Kaumlyttaumljauml paumlaumlsee myoumls katsomaan aikaisempien koontien kuvaajia ja koontilokeja (kuva

11) valitsemalla aikaisemman koonnin koontihistoria Koontihistoria sijaitsee koontityoumln

projekti-naumlkymaumln vasemmassa reunassa (kuva 12) Vihreauml ympyrauml kuvan vasemmassa

reunassa tarkoittaa onnistunutta koontia Punainen ympyrauml tarkoittaa ettauml koonti ei

ole mennyt laumlpi

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 30: Joakim Sandqvist - Theseus

24

Kuva 11 Jenkins CIn koontihistoria

Jokaisella tyoumlllauml on erillinen paumlaumlnaumlkymauml Jenkins CIssauml (kuva 12) Taumlssauml naumlkymaumlssauml

naumlkyy osa kuvaajista ja kaumlyristauml joita Jenkins CI koonnin yhteydessauml tuottaa

Kuvassa 11 on esitelty Android koontityoumln projekti-naumlkymauml Taumlstauml kuvasta on naumlhtaumlvis-

sauml ettauml koontityoumlssauml Android on otettu kaumlyttoumloumln FindBugs-lisaumlosa Taumlmauml lisaumlosa on

tuottanut projektin paumlaumlnaumlkymaumlaumln kuvaajan josta on luettavissa ohjelmiston laumlhdekoo-

dissa olevien virheiden maumlaumlrauml koontien 47 ja 86 vaumllillauml

Kuva 12 Jenkins CIn koontityoumln paumlaumlnaumlkymauml

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 31: Joakim Sandqvist - Theseus

25

Esimerkkikuvassa olevat kuvaajat ovat oleellisia opinnaumlytetyoumln kannalta Nimittaumlin

myoumlhemmin (luku 6) kaumlsiteltaumlvauml opinnaumlytetyoumln konkreettinen osa ohjelmistoprojektin

tarkkailuun kaumlytettaumlvauml sovellus rdquoKoontardquo kaumlyttaumlauml naumlitauml kuvaajia hyvaumlkseen vaumllittaumles-

saumlaumln informaation koonnin tilasta Ohjelmistoprojekti-kurssin opiskelijoista koostuvalle

kehitysryhmaumllle Naumlmauml kuvaajat naumlkyvaumlt luvussa 2 esitellyllauml naumlytoumlllauml joka on tarkoitet-

tu vain koontiympaumlristoumln seurantaan

43 Agilefant

Agilefant on taumlllauml hetkellauml yksi yksinkertaisimmista ketterien menetelmien hallintatyoumlka-

luista Se tuo yhteen sekauml suuren ettauml pienen mittakaavan ajankaumlyttoumlsuunnittelun Agi-

lefant sopii tyoumlryhmaumllle jonka on pystyttaumlvauml suunnittelemaan tulevia tyoumltunteja sekauml

hallinnoimaan jo keraumlaumlntynyttauml tyoumlkertymaumlauml Agilefant toimii myoumls suuren mittakaavan

projektin hallinnointisovelluksena usealla tyoumlryhmaumlllauml [Agilefant what is Agilefant]

Kun Agilefant otetaan projektiryhmaumln kaumlyttoumloumln on Agilefantiin luotava ensin tuote

Yksi Agilefant -asennus voi sisaumlltaumlauml monia tuotteita (Product) Tuotteeseen voidaan

liittaumlauml monta projektia (Project) Projektiin voidaan liittaumlauml monta iteraatiota (Iteration)

ja iteraatioihin tarinoita (Story) Tarinoihin puolestaan liitetaumlaumln tehtaumlviauml (Tasks) Tehtauml-

viin maumlaumlritellaumlaumln arvioitu tyoumlaika tehty tyoumlaika ja jaumlljellauml oleva tyoumlaika Ennen taumltauml so-

vellukseen voidaan halutessa lisaumltauml kaumlyttaumljiauml mutta ohjelma ei vaadi taumltauml

Kuvassa 13 on esitelty esimerkki tuotteiden puurakenteesta Kuvassa rdquoKevaumlt 2011 esi-

merkkituoterdquo on rdquoKevaumlt 2011 esimerkkituoterdquo -niminen tuote Taumlhaumln tuotteeseen on

liitetty yksi projekti rdquoEsimerkkiprojektirdquo Taumlhaumln projektiin on liitetty iteraatioita rdquoSprint

0rdquo ja rdquoSprint 1rdquo

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 32: Joakim Sandqvist - Theseus

26

Kuva 13 Esimerkki Agilefantin tuotteiden puurakenteesta

Kuvassa 14 on esitelty Agilefantin iteraationaumlkymauml Iteraatioon on maumlaumlritelty tarinat

(stories) rdquoTekninen maumlaumlrittelyrdquo ja rdquoToiminnallinen maumlaumlrittelyrdquo Tarinoihin on liitetty

vastuuhenkiloumlt rdquoalrdquo ja rdquoARrdquo Tarinoiden tilat ovat rdquoPendingrdquo ja rdquoDonerdquo Tekniseen

maumlaumlrittelyyn kaumlytetty aika (ES Effort Spend) on 7 tuntia Alkuperaumlinen arvio (OE Ori-

ginal Estimate) on maumlaumlritelty 6 tuntiin ja jaumlljellauml oleva tyoumlaika (EL Effort Left) ei ole

maumlaumlritelty ollenkaan Agilefant osaa generoida taumlstauml informaatiosta rdquoBurndown Char-

tinrdquo Burndown Chart antaa osviittaa siitauml onko projektin iteraatio aikataulussa

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 33: Joakim Sandqvist - Theseus

27

Kuva 14 Agilefantin iteraatio -naumlkymauml

Kuvassa 15 oleva sininen kaumlyrauml kuvaa iteraation optimaalista ajankaumlyttoumlauml Punainen

kaumlyrauml kuvaa toteutunutta ajankaumlyttoumlauml Iteraatioon liitettyjen tehtaumlvien valmistuessa

ajallaantulisi punaisen kaumlyraumln liittyauml sinineen kaumlyraumlaumln kuvaajan oikeassa alakulmassa

Kuva 15 Agilefantin Burndown Chart

Kuvassa 16 oleva kuvaaja on oleellisessa osassa opinnaumlytetyoumlssauml Johdannossa en-

simmaumlisen kerran mainittu ja myoumlhemmin (luku 6) esiteltaumlvaumln sovelluksen Koonta on

tarkoitus kaumlyttaumlauml myoumls taumltauml kuvaajaa hyvaumlkseen vaumllittaumlessaumlaumln informaatiota projektin

tilasta kehitysryhmaumllle mutta taumltauml toiminnallisuutta ei ole vielauml implementoitu

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 34: Joakim Sandqvist - Theseus

28

5 Koontiympaumlristoumln tarkkailu

Laadukkaan koodin kirjoittaminen jokaiseen julkaisuun vaatii paljon huomiota Projektin

etenemisen kannalta on ekonomista jos ei tarvitse koko ajan katsoa sivupeilistauml meni-

kouml kaikki hyvin On parempi ettauml kehittaumljaumllle ilmoitetaan aktiivisesti kun jokin asia vaa-

tii huomiota [Pragmatic Project Automation 2004 s 125]

51 Yleistauml koontiympaumlristoumln tarkkailusta

Taumlssauml luvussa perehdytaumlaumln koontiympaumlristoumln tarkkailuun Selitetaumlaumln ensin mikauml tekee

koontiympaumlristoumln tarkkailemisesta tarpeellista ja mitauml eri laumlhestymistapoja koontiympauml-

ristoumln tarkkailemiseen voidaan ottaa

Mahdollisimman nopea ilmoitus rikkoutuneesta koonnista on taumlrkeaumlauml Ilmoitus koonnin

rikkoutumisesta tarkoittaa sitauml ettauml muutosten tekeminen taumlytyy lopettaa kunnes

koonti on korjattu Jos koontia ei korjata saattaa tehty tyouml olla turhaa Jos rikkinaumliseen

koontiin pystytaumlaumln reagoimaan nopeasti on virheen jaumlljittaumlminen helpompaa sillauml

muutosten maumlaumlrauml ehjaumln ja rikkinaumlisen koonnin vaumllillauml on minimaalinen Koonnin kor-

jaaminen heti on myoumls helpompaa kuin myoumlhemmin kun ongelmat ovat kasaantuneet

paumlaumlllekkaumlin

Yksi hyvauml tapa ilmoittaa koonnin tilasta on tehdauml taumlmauml saumlhkoumlpostitse mutta mitauml jos

saumlhkoumlpostia ei ole laumlhettyvillauml Koonnin tilasta voi ilmoittaa tekstiviestillauml Ilmoittaminen

on mahdollista myoumls tehdauml RSS-syoumltteellauml Kehittaumljauml voi tilata ja lukea taumlmaumln tiedoston

haluamallaan RSS-lukijalla [Pragmatic Project Automation 2004 s 125] Maumlaumlrittele-

maumlllauml tietynlainen koontitehtaumlvauml esimerkiksi Mavenin pomxml (luku 33) -tiedostoon

voidaan saada koonnin tila naumlkymaumlaumln vaikka verkkosivulla

Nykypaumlivaumlnauml ei ole harvinaista ettauml ohjelmistokehitysryhmaumlt sijaitsevat eri puolilla

maapalloa Esimerkkinauml kaumlytetaumlaumln kahta kuviteltua kehitysryhmaumlauml Toinen ryhmauml on

Intiasta ja toinen Amerikasta Ryhmien tyoumlvuorojen aikaero on 12 tuntia Toinen ryhmauml

aloittaa ohjelmoinnin ja toinen ryhmauml menee kotiin Toisen ryhmaumln saapuessa vuo-

roonsa on koonnin oltava vakaassa tilassa Taumlmauml takaa sen ettauml toisen ryhmaumln on

helppo jatkaa siitauml mihin toinen jaumli [Pragmatic Project Automation 2004 s 125]

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 35: Joakim Sandqvist - Theseus

29

Ohjelmistokehityksessauml on kyse yhtaumllailla kommunikaatiosta kuin laumlhdekoodin kirjoit-

tamisesta Kun ryhmaumlt ovat eri paikoissa kommunikaatio kaumlrsii kun tiedon vaumllittaumlmi-

nen eteenpaumlin kahvipoumlydaumlssauml ei enaumlauml onnistukaan Taumlten toisistaan erossa olevien

ryhmien on otettava kaumlyttoumloumln jokin menetelmauml jolla he saavat tiedon siitauml ettauml koonti

on onnistunut Taumlmauml antaa kummallekin ryhmaumllle luottamusta jatkaa eteenpaumlin pel-

kaumlaumlmaumlttauml sitauml ettauml he rakentaisivat uutta koodia rikkinaumlisen koonnin paumlaumllle ja lisaumlisivaumlt

toumlitauml entisestaumlaumln

Informaation koonnin tilasta voi siis saada RSS-syoumltteenauml saumlhkoumlpostina tekstiviestinauml

tai verkkosivulta Informaation saaminen taumlhaumln tapaan on kuitenkin vanhanaikaista

Kun CI-infrastruktuurin on rakenteellisesti selkeauml mahdollistaa se XF-laitteiden (vaumllit-

toumlmaumln palautteen laite) helpon implementaation ja koonnin tila saadaan vaumllitettyauml te-

hokkaammin ja visuaalisemmin kuin perinteisillauml menetelmillauml XF-laitteiden kaumlyttoumloumlnot-

to ei suinkaan syrjaumlytauml perinteisiauml menetelmiauml vaan vahvistaa projektin hallintaa ja

ohjelmistoprojektin tilan tarkkailua entisestaumlaumln

Kuten yllauml mainittiin XF-laitteet eivaumlt syrjaumlytauml perinteisiauml menetelmiauml ilmoittaa koonnin

tilasta Selkein ero perinteisten ja modernien menetelmien vaumllillauml on se ettauml perinteiset

menetelmaumlt soveltuvat paremmin etaumltyoumlskentelyyn ja XF-laitteet soveltuvat paremmin

toimistotyoumlskentelyyn kun informaatio halutaan vaumllittaumlauml kehittaumljille vaumllittoumlmaumlsti XF-

laitteista kerrotaan lisaumlauml seuraavassa luvussa

Ilmoittaminen koonnin epaumlonnistumisesta on olennainen osa CI-strategiaa Esimerkke-

jauml perinteisistauml ratkaisuista olivat aiemmin mainitut saumlhkoumlposti RSS-syoumlte verkkosivu

sekauml tekstiviesti Kaikki ilmoittamiseen kaumlytetyt ratkaisut eivaumlt kuitenkaan sovi kaikkiin

tyoumlympaumlristoumlihin ja -kulttuureihin

52 Vaumllittoumlmaumln palautteen laitteet

Eraumls klassinen esimerkki XF-laitteesta (Xtreme Feedback Device) on laavalamppu Pe-

rusidea on ettauml koonnin epaumlonnistuessa laavalamppu on punainen ja koonnin onnistu-

essa laavalamppu on vihreauml Toinen esimerkki koonnin epaumlonnistumisesta ilmoittavasta

laitteesta on Retaliation Projektin [Who Broke The Build 2011] tuotos vaahtomuovi-

raketteja ampuva ohjuspatteri Koonnin epaumlonnistuessa patteri ampuu koonnin rikko-

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 36: Joakim Sandqvist - Theseus

30

nutta ohjelmoijaa Naumlitauml laitteita kutsutaan englanniksi nimellauml rdquoextreme notification

devicesrdquo tai vaihtoehtoisesti rdquoextreme feedback devicesrdquo Vuosia Apache Software

Foundation -projektissa mukana ollut Carlson Sanchez leikillaumlaumln ilmoittaa rdquoSoftware at

the end of the universerdquo -blogissaan lempilaitteensa olevan saumlhkoumltuoli [Using Lava

Lamps for Continuous Integration 2009] Tieto koonnin tilasta voidaan siis vaumllittaumlauml

kaumlyttaumljaumllle monilla erilaisilla laitteilla

Olipa tyoumlympaumlristoumlssauml kaumlytetty koonnin tilaa ilmaiseva laite (suoran palautteen laite)

sitten liikennevalo puhuva jaumlnis tai jokin vielauml eksoottisempi ratkaisu on selvaumlauml ettauml

taumlllaisilla ratkaisuilla voi olla taumlssauml luvussa mainittujen konkreettisten hyoumltyjen lisaumlksi

myoumls tyoumlilmapiiriauml ja -moraalia nostattavia vaikutuksia [Jenkins The Definitive Guide

2011 s 221]

Taumlssauml luvussa tutustutaan Saksassa sijaitsevan Softwareschneiderei yrityksen XF-laite-

ratkaisuihin joilla pyritaumlaumln ratkaisemaan erilaisia projektin hallintaan jatkuvaan integ-

raatioon sekauml extreme feedback -laitteisiin liittyviauml ongelmia Yrityksen blogissa

(Schneide Blog) verkkojulkaisuissa esitellaumlaumln yleensauml ohjelmistoprojektiin liittyvauml on-

gelma sen mahdollinen ratkaisu ja ratkaisun seuraukset Luvuissa 521 ja 522 tutus-

tutaan kahteen mielenkiintoiseen blogissa esiteltyyn ratkaisuun The Code Flow-O-

Meter ja Smell-O-Mat

521 The Code Flow-O-Meter

Yhtenauml ketteraumln tai hyvaumln ohjelmoinnin laumlhtoumlkohtana on tehdauml tietovarastopaumlivityksiauml

aikaisin ja usein Ongelma jonka Softwareschneiderei kohtasi oli seuraavanlainen

Jokaisen pienen tietovarastopaumlivityksen tapahtuessa muutokset kaumlyvaumlt laumlpi erilaisia

testejauml Testien ja laaduntarkkailun lisaumlaumlntyessauml ohjelmoijat halusivat pitaumlauml oman ver-

sionsa paikallisena mahdollisimman pitkaumlaumln jotta se paumlaumlsisi laumlpi testeistauml Taumlmauml hidas-

taa ohjelmistokehitystauml Varsinkin aloittelevampien kehittaumljien kesken rdquoSe on valmis

sitten kun se on tehtyrdquo -lauseella oikeutettiin vaumlljaumlt tietovaraston paumlivitysintervallit

Taumlmauml on kuitenkin paras tapa olla huomaamatta aikaista palautetta - ja aikainen palau-

te on toimivaa palautetta Softwareschneidereillauml paumlaumltettiin asentaa liikutettava suihku-

laumlhde (kuva 16) vastaiskuksi myoumlhaumlisiauml tietovarastopaumlivityksiauml vastaan

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 37: Joakim Sandqvist - Theseus

31

Kuva 16 The Code Flow-O-Meter

Softwareschneidereillauml ohjelmoitiin pieni IRC-botin joka laukaisee suihkulaumlhteeseen

kiinnitetyn sovellusmoduulin Suihkulaumlhdettauml pystyttiin hallinnoimaan nyt IRCn kautta

Taumlmaumln jaumllkeen tehtiin pieni skripti joka kaumlsitteli tietovarastopaumlivityksistauml saadut viestit

ja maumlaumlritti paumlivitykselle painoarvon perustuen muutettujen tiedostojen maumlaumlraumlaumln Paumlivi-

tyksen koko ei lisaumlnnyt yhtauml paljon painoarvoa kuin paumlivitystapahtuma itse Painoarvo

maumlaumlraumlsi veden virtaamisajan suihkulaumlhteessauml Pelin nimi oli selvauml pidauml virtaus kaumlynnis-

sauml Blogin mukaan tulokset olivat selvaumlsti naumlhtaumlvissauml Blogissa sanotaan laitteen toimi-

neen ja kaikkien pitaumlvaumln laitteesta Blogissa ei kuitenkaan mainita tihenikouml paumlivitysin-

tervalli

522 Smell-O-Mat

Toinen Schneide Blogissa esitelty kokeellinen XF-laite Smell-O-Mat (kuva 17) antaa

visuaalisen palautteen sijaan hajuaistilla aistittavan palautteen [Schneide Blog 2009

Smell if its well]

32

Kuva 17 Smell-O-Mat

Tekninen ratkaisu Smell-O-Matissa on sama kuin ylempaumlnauml esitellyssauml XFDssauml Smell-

O-Mat kaumlyttaumlauml IRC-bottia vaumllikappaleena tiedon siirtaumlmiseen palvelimen ja XFDn vaumllil-

lauml Smell-O-Mat kaumlyttaumlauml kahta eri koodihajua hyvaumlauml ja pahaa hajua Hyvaumlksi tuoksuksi

valittiin greipin tuoksu Tekstissauml ei mainita mikauml valittiin pahaksi hajuksi Softwa-

reschneideredei ei kaumlytauml usein taumltauml XFDtauml mutta aina vaumllillauml joku laukaisee laitteen

Kun toimistossa tulee tarvetta raikkaalle tuoksulle kaumly joku korjaamassa vanhan koo-

dinpaumltkaumln

Vaikka taumlmauml ratkaisu on melko epaumlkaumlytaumlnnoumlllinen on se kuitenkin hauska Naumliden lait-

teiden lisaumlksi yrityksellauml on kaumlytoumlssauml - tai on ollut kaumlytoumlssauml XF-laitteita jotka ovat aistit-

tavissa melkein kaikilla ihmisen aisteilla tunto- naumlkouml- kuulo- sekauml hajuaisteilla Vain

makuaistia hyoumldyntaumlvauml laite on toteuttamatta

6 Koontiympaumlristoumlntarkkailu sovellus

Osana opinnaumlytetyoumltauml oli tehtaumlvaumlnauml ohjelmoida Javalla ohjelma joka tarkkailee koon-

tiympaumlristoumlauml Laumlhestymistapa koontiympaumlristoumln tarkkailuun on erilainen kuin luvussa 5

mainituissa menetelmissauml Koonta antaa kaumlyttaumljaumllle mahdollisuuden tuoda kuvia tai

33

kuvaajia ohjelman graafiseen naumlkymaumlaumln Taumlssauml tapauksessa kuvat ovat esimerkiksi

Jenkins CI -lisaumlosien tuottamia kaavioita tai Agilefantin tuottamia burndown chartteja

Sovelluksen tarkoitus on tehdauml kehitysryhmaumln tyoumlympaumlristoumlstauml informatiivisempi

Seuraavassa luvussa perehdytaumlaumln sovelluksen toiminnallisuuteen Taumlmaumln jaumllkeen tutus-

tutaan sovelluksen kehittaumlmisprosessiin koodiin ja arkkitehtuuriin

61 Sovelluksen toiminnallisuus

Ohjelman viimeisimmaumln version suunnitteluvaiheessa paumlaumldyttiin toiminnallisuusratkai-

suun jossa kaumlyttaumljauml syoumlttaumlauml ohjelmaan valitsemansa kuvan verkko-osoitteen jonka

jaumllkeen kuva naumlkyy ohjelman paumlaumlnaumlkymaumlssauml on siirrettaumlvissauml sekauml poistettavissa Oh-

jelma toimii ainakin Jenkins CIn sekauml Agilefantin kanssa sillauml kuvat sijaitsevat palveli-

milla staattisten verkko-osoitteiden takana Sen sijaan ettauml ohjelma tekisi kyselyjauml tie-

tovarastopaumlivityksistauml ohjelma hakee kuvat uudelleen annetun osoitteen takaa kym-

menen sekunnin vaumllein vaumllittaumlmaumlttauml siitauml onko projekti taumlssauml vaumllissauml koottu vai ei

Sovellus yhdistetaumlaumln palvelimelle syoumlttaumlmaumlllauml sovellukseen sen palvelimen IP-osoite

jolle Jenkins CI on asennettu (Koontipalvelin luku 2) Yhdistaumlessauml palvelimelle anne-

taan myoumls portti sekauml protokolla joka esimerkkikuvassa on https Yhdistaumlmisen yhtey-

dessauml kerrotaan ohjelmalle ettauml sen tulee luottaa kaikkiin sertifikaatteihin jotka loumlyty-

vaumlt annetun ip-osoitteen takaa Kuvasta 18 on naumlhtaumlvissauml sovelluksen sisaumlaumlnkirjautu-

misikkuna

Kuva 18 Ohjelman sisaumlaumlnkirjautumisikkuna

Kun kaumlyttaumljauml on kirjautunut palvelimelle aukeaa sovelluksen paumlaumlnaumlkymauml (kuva 19)

34

Kuva 19 Sovelluksen paumlaumlnaumlkymauml

Kuvasta 18 on naumlhtaumlvissauml sovelluksen toiminnallisuudelle taumlrkeaumlt painikkeet Add Item

Add Note Save Preset ja Load Preset Kun kaumlyttaumljauml valitsee Add Note kysyy ohjelma

kaumlyttaumljaumlltauml Noten otsikkoa (kuva 20)

Kuva 20 Koonta pyytaumlauml kaumlyttaumljaumlltauml Noten otsikkoa

Kun muistilapulle (note) on annettu otsikko ilmestyy sovelluksen paumlaumlnaumlkymaumlaumln muisti-

lappu (kuva 21) Muistilapulle voi antaa haluamansa sisaumllloumln ja sen paikkaa voi vaihtaa

raahaamalla sitauml hiiren vasemmalla painikkeella otsikon kohdalta Muistilapun leveyttauml

voi saumlaumltaumlauml hiiren rullalla kun hiiren osoitinta pitaumlauml otsikon paumlaumlllauml

35

Kuva 21 Muistilappu sovelluksen paumlaumlnaumlkymaumlssauml

Kun kaumlyttaumljauml valitsee Add Item sovelluksen paumlaumlnaumlkymaumlstauml kysyy ohjelma kaumlyttaumljaumlltauml

Itemin otsikkoa (kuva 22)

Kuva 22 Koonta pyytaumlauml kaumlyttaumljaumlltauml Itemin otsikkoa

Kun Itemille on annettu otsikko on kaumlyttaumljaumln mentaumlvauml Jenkins CI web-kaumlyttoumlliittymaumlaumln

ja valittava haluamansa kuva (kaavio) Kuvaa klikataan hiiren oikealla painikkeella ja

kopioidaan kuvan URL-osoite leikepoumlydaumllle (kuva 23)

36

Kuva 23 Kuvan URLin kopioiminen leikepoumlydaumllle

Kun URL-osoite on leikepoumlydaumlllauml palataan Koonnan paumlaumlnaumlkymaumlaumln Koonta pyytaumlauml

kaumlyttaumljaumlltauml Itemin osoitetta ja leikepoumlydaumlllauml oleva URL kopioidaan Koontaan (kuva 24)

Kuva 24 Itemin kopioiminen leikepoumlydaumlltauml koontaan

Kun valitaan OK sovelluksen paumlaumlnaumlkymauml muuttuu kuvan 25 mukaiseksi

37

Kuva 25 Koonnan paumlaumlnaumlkymauml

Kun naumlkymaumlaumln on liitetty kaikki halutut komponentit valitaan paumlaumlnaumlkymaumlstauml Save Pre-

set (kuva 26)

Kuva 26 Esiasetusten tallentaminen

Kun halutaan ladata aiemmin tallennettu esiasetus valitaan paumlaumlnaumlkymaumlstauml Load Preset

(kuva 27)

38

Kuva 27 Esiasetusten lataaminen

Kuvassa ollaan lataamassa R2Preset -nimistauml esiasetusta joka on eraumlaumln kevaumlaumln 2012

Ohjelmistotuotantoprojekti-kurssin ryhmaumln esiasetus Taumlmaumln ryhmaumln esiasetus naumlyttaumlauml

kuvan 28 mukaiselta

Kuva 28 Kevaumlaumln 2012 kurssiryhmaumln esiasetus

39

Kuvasta on naumlhtaumlvissauml viisi eri Item-komponenttia PHP Test Result Trend PHP Testi-

kattavuus Android FindBugs Trend Android Testikattavuus sekauml Global Build Stats

Jokainen Item pitaumlauml sisaumlllaumlaumln tiedon omasta URL-osoitteestaan sekauml sijainnistaan nauml-

kymaumlssauml Ohjelma pyyhkii naumlkymaumln 10 sekunnin vaumllein hakee kuvat uudestaan ja si-

joittaa ne omille paikoilleen Naumlin ollen naumlkymaumln kuvat paumlivittyvaumlt oikeaan koontiin

enintaumlaumln 10 sekunnin viiveellauml

62 Sovelluksen kehittaumlmisprosessi ja arkkitehtuuri

Taumlssauml luvussa tutustutaan sovelluksen rakenteeseen ja toimintaperiaatteisiin Lisaumlksi

kerrotaan tuotteen kehittaumlmisprosessista

Projekti aloitettiin asentamalla tyoumlasemalle Virtual Box -niminen sovellus jolle tehtiin

koulun koontiympaumlristoumlauml vastaava palvelinkonfiguraatio Taumltauml palvelinta kaumlytettiin so-

velluksen toiminnallisuuden testaamiseen Testipalvelimen kaumlyttoumljaumlrjestelmaumlnauml toimii

Ubuntu 1104 server x64 joka on sama kuin kurssin koontipalvelimelle asennettu kaumlyt-

toumljaumlrjestelmauml Taumllle palvelimelle asennettiin Jenkins CI sekauml muut tarvittavat sovelluk-

set ohjelmiston testaamista varten

Tuotteen suunnittelu aloitettiin kaumlymaumlllauml laumlpi erilaisia kaumlyttoumlliittymaumlideoita Taumlmaumln jaumll-

keen tehtiin erilaisia kaumlyttoumlliittymaumln paperiprototyyppejauml ja niistauml valittiin sopivin Kun

kaumlyttoumlliittymaumln ensimmaumlisen paperiversio valmistui aloitettiin kirjoittaa kaumlyttoumlliittymaumln

luokkarakennetta ja valittiin sovelluksen kaumlyttoumlliittymaumlssauml kaumlytettaumlvaumlt Java-

komponentit Taumlssauml vaiheessa se mitauml asiakas halusi oli vielauml osittain epaumlselvaumlauml Oh-

jelmointi aloitettiin hieman liian aikaisin suunnitteluvaiheessa

Ennen sovelluksen ohjelmoinnin aloittamista minulla oli erittaumlin vaumlhaumln kokemusta tie-

dostojen kaumlsittelystauml XML-parsimisesta HTTP-yhteyden avaamisesta sertifikaateista

sekauml Javan kaumlyttoumlliittymaumlkomponenttien sijainnin ajon aikaisesta muuttamisesta Tauml-

maumln takia suunnitteluvaihetta ei voitu viedauml loppuun asti ennen itse ohjelmoinnin aloit-

tamista Taumlstauml seurasi se ettauml ohjelman luokkarakenne ei ole niin selkeauml tai jaumlrkevauml

kuin se voisi olla Ohjelmaan jaumli lymyilemaumlaumln pitkiksi ajoiksi myoumls rdquokuolleitardquo luokkia

joiden toimintaperiaatteita ei jossain vaiheessa enaumlauml muistettu ja joita ei missaumlaumln

muussa luokassa tarvittu

40

Ohjelmasta syntyi monta erilaista versiota erilaisilla kaumlyttoumlliittymillauml Taumlllauml hetkellauml kaumly-

toumlssauml oleva ohjelma on ohjelman viides toiminnallinen versio Ohjelma on vaihtanut

kaksi kertaa luokkarakennetta ja viisi kertaa kaumlyttoumlliittymaumlauml Ohjelman kirjoittaminen

aloitettiin kaksi kertaa kokonaan alusta

Seuraavaksi esitellaumlaumln ohjelman luokkakaavio ja jatketaan esittelemaumlllauml sovelluksen

arkkitehtuurin ymmaumlrtaumlmisen kannalta vaumllttaumlmaumlttoumlmaumlt luokat yksitellen hierarkkisessa

jaumlrjestyksessauml hierarkian huipulta aloittaen

Kuvassa 29 on esitelty sovelluksen luokkakaavio Kuvassa olevat oranssit luokat kuvaa-

vat luokkia jotka sisaumlltaumlvaumlt graafisia komponentteja Kaavion vasemmassa reunassa

olevat pienet kuvat kuvaavat sovelluksen kaumlyttoumlliittymaumlauml Kuviin on merkitty luokan

graafinen ilmentymauml oranssilla vaumlrillauml Siniset luokat ovat tietorakenteita joiden ilmen-

tymiauml voidaan tallentaa ja ladata Harmaissa luokissa kaumlsitellaumlaumln osa kaumlyttoumlliittymauml-

luokkien toiminnallisuudesta kuten yhteyden avaaminen koontipalvelimelle sekauml kaumlyt-

toumlliittymaumlkomponenttien liikuttaminen ja paumlivittaumlminen paumlaumlnaumlkymaumln piirtoalueella

Main-luokka kaumlynnistaumlauml ohjelman sisaumlaumlnkirjautumisikkunan ja GlobalMethods-luokka

sisaumlltaumlauml ohjelman julkiset metodit joita voidaan kutsua kaikista muista luokista Glo-

balMethods sisaumlltaumlauml julkisen ilmentymaumln tietorakenteesta State joka voidaan tallentaa

tiedostoon ja ladata tiedostosta State sisaumlltaumlauml tiedon Item- ja Note-olioiden graafisten

ilmentymien sijainnista sekauml koosta sovelluksen paumlaumlnaumlkymaumlssauml GlobalMethods-luokkaa

kaumlytetaumlaumln myoumls ConnectionObject-tietorakenteen tallentamiseen ConnectionObject

tietue sisaumlltaumlauml LaunchManagerin asetukset Luokkien toiminnallisuudesta kerrotaan

tarkemmin kuvan 29 jaumllkeen

41

Kuva 29 Sovelluksen luokkakaavio

Jatketaan esittelemaumlllauml ohjelman toiminnallisuuden kannalta taumlrkeimpien luokkien tar-

koitus ja toiminnallisuus yksitellen

Luokan nimi GlobalMethods

Luokan tarkoitus ja toiminnallisuus Sisaumlltaumlauml julkisen ilmentymaumln tietueelle State

Osaa kirjoittaa minkauml vain olion tiedostoon ja pakata tiedoston Osaa purkaa tiedoston

ja lukea olion puretusta tiedostosta Luokan metodit ja attribuutit ovat julkisia kaikille

luokille Luokka luotiin alunperin siltauml varalta ettauml sovellukseen kasaantuisi enemmaumln

ns irrallisia metodeita tai attribuutteja joita tarvittaisiin usein ja monessa luokassa

Luokan nimi Main

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml LaunchManager -naumlkymaumln para-

metrilla ConnectionObject ConnectionObject -tietue pitaumlauml sisaumlllaumlaumln tiedon viime kirjau-

42

tumisesta Mahdollistaa LaunchManagerin kaumlynnistymisen viimeksi kaumlytetyillauml asetuksil-

la

Luokan nimi LaunchManager

Luokan tarkoitus ja toiminnallisuus Kaumlynnistaumlauml instanssin luokasta httpsConnec-

tion kaumlyttaumljaumln syoumlttaumlmillauml parametreilla Kaumlynnistaumlauml sovelluksen paumlaumlnaumlkymaumlluokan Gui

Luokka tallentaa Guin kaumlynnistyksen yhteydessauml ConnectionObject -tietueen tiedos-

toon lastsessioncon Kaumlyttaumljauml voi myoumls tallentaa asetukset manuaalisesti haluamaansa

tiedostoon ja myoumlhemmin ladata asetukset haluamastaan tiedostosta

Luokan nimi httpsConnection

Luokan tarkoitus ja toiminnallisuus Ottaa yhteyden Jenkins CI palvelimelle kaumlyt-

taumljaumln syoumlttaumlmillauml asetuksilla Luo instanssin luokasta miTM

Luokan nimi miTM

Luokan tarkoitus ja toiminnallisuus Toimii sovelluksen sertifikaatti-trust-

managerina Hyvaumlksyy kaumlyttaumljaumln LaunchManagerissa syoumlttaumlmien ip-osoitteiden takana

olevat sertifikaatit

Luokan nimi Gui

Luokan tarkoitus ja toiminnallisuus Toimii ohjelman paumlaumlnaumlkymaumln kehyksenauml

Sisaumlltaumlauml komponentit kaavioiden ja muistilappujen lisaumlaumlmiseen sekauml esiasetusten tallen-

tamiseen ja lataamiseen

Luokan nimi MobileContainerPanel

Luokan tarkoitus ja toiminnallisuus Toimii paneelien Note ja Item piirtoalueena

Pitaumlauml sisaumlllaumlaumln listan ViewInterfacen toteuttavista olioista Note ja Item Sisaumlltaumlauml metodit

esiasetusten tallentamiseen ja lataamiseen

Luokan nimi ComponentWrangler ja MouseInputAdapter

Luokan tarkoitus ja toiminnallisuus On vastuussa kaumlyttaumljaumlinteraktiivista toimin-

noista MobileContainerPaneelin sisaumlllauml Kuvaajien sekauml muistilappujen poisto hiiren oi-

kealla painikkeella Pitaumlauml huolen siitauml ettauml kuvaajien ja muistilappujen sijainti tallentuu

On vastuussa myoumls kuvaajien ja muistilappujen dragrsquonrsquodrop toiminnosta

43

Luokan nimi Item

Luokan tarkoitus ja toiminnallisuus Item -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln va-

litsema kuva naumlytoumlllauml Sisaumlltaumlauml ItemData ndashtietueen joka pitaumlauml sisaumlllaumlaumln tiedon kuvan

www-osoitteesta ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

Luokan nimi Note

Luokan tarkoitus ja toiminnallisuus Note -olion tehtaumlvauml on naumlyttaumlauml kaumlyttaumljaumln li-

saumlaumlmauml muistilappu naumlytoumlllauml Sisaumlltaumlauml NoteData -tietueen joka pitaumlauml sisaumlllaumlaumln tiedon

muistilapun sisaumllloumlstauml ja sen sijainnista MobileContainerPanel -kehyksen sisaumlllauml

7 Yhteenveto

Taumlssauml opinnaumlytetyoumlssauml tutustuttiin XF-laitteisiin sekauml XF-laitteiden pystyttaumlmiseen ja

niiden kaumlytoumln kannalta vaumllttaumlmaumlttoumlmiin kehitysympaumlristoumlkomponentteihin Tarkoitukse-

na oli kartoittaa erilaisia ratkaisuja informatiivisen tyouml- sekauml kehitysympaumlristoumln raken-

tamiseen ja esitellauml Metropolian ohjelmistotuotantoprojektissa tyoumln kirjoittamisen aika-

na kaumlytoumlssauml olleet tyouml- ja kehitysympaumlristoumlratkaisut

Tyoumlssauml esiteltiin kurssin uusi kehitys- sekauml tyoumlympaumlristouml ja tutustuttiin eri tapoihin tark-

kailla koontiympaumlristoumlauml Koontiympaumlristoumln tarkkailu -kaumlsitteen ymmaumlrtaumlmisen kannalta

vaumllttaumlmaumltoumlntauml oli tarpeellista tutustua myoumls kurssin kehitysympaumlristoumloumln ja selventaumlauml

lukijalle mistauml koontiprosessissa on kysymys

Koonta sovelluksen suunnitteleminen ja ohjelmoiminen ei sujunut ongelmitta Ohjel-

man oli tarkoitus toimia yhteen Agilefantin sekauml Jenkins CIn kanssa Ohjelma ei kui-

tenkaan tue taumlllauml hetkellauml Agilefanttia ohjelmallisen kirjautumisongelman vuoksi mutta

tarkoituksena on ratkoa ongelma vielauml taumlmaumln opinnaumlytetyoumln kirjoittamisen jaumllkeen

Ohjelman suunnitteluvaihe jaumli arkkitehtuuri- ja paperiprototyyppitasolle Kaumlyttoumlliittymaumln

paperiprotoista toteutukseen kaumlytettiin viimeisintauml versiota Arkkitehtuuri-

suunnitelmista ei kuitenkaan toteutunut yksikaumlaumln Olen sitauml mieltauml ettauml syksyn 2011

alussa ohjelmointitaitoni eivaumlt riittaumlneet kunnolliseen ohjelmistoarkkitehtuurin suunnit-

teluun Taumlstauml seurasi sovelluksen epaumljohdonmukainen rakenne En usko taumlmaumln vaikut-

taneen tuotteen lopputulokseen vaan sen valmistumisnopeuteen

44

Vaikka ohjelmiston suunnitteluvaihetta ei voi sanoa onnistuneeksi eikauml ohjelmaan ole

implementoitu vielauml kaikkia asiakkaan haluamia ominaisuuksia voidaan sovelluksen

lopputulokseen olla tyytyvaumlisiauml Erilaisten hankaluuksien ja oman kokemattomuuteni

vuoksi oli taumlmaumln projektin tekeminen oppimiskokemuksena korvaamaton

Toivotaan ettauml taumlmauml tyouml toimii hyvaumlnauml referaattina Metropolian ohjelmistotuotantopro-

jektin kehitysympaumlristoumln esittelemiseen ja antaa lukijalle hyvaumln yleiskuvan informatiivi-

sen kehitysympaumlristoumln rakentamisesta sekauml koonnin monitoroinnista

45

Laumlhteet

Agilefant Verkkosivu

lthttpwwwagilefantorggt Luettu 1422012

Apache Ant Verkkosivu

lthttpantapacheorggt Luettu 1542012

Apache Maven Project Verkkosivu

lthttpmavenapacheorggt Luettu 1642012

A Simple Makefile Tutorial Muokattu 2008 Verkkosivu

lthttpwwwcscolbyedumaxwellcoursestutorialsmaketutorgt Luettu 1342012

Bathie Mark 2010 Continuous Integration ndash Basic Overview and Best Practices Verk-

kosivu lthttpblogcodesioncompost846607039continuous-integration-overview-

best-practicegt Luettu 1052012

Clark Mike 2004 Pragmatic Project Automation How to Build Deploy and Monitor

Java Applications The Pragmatic Programmers LLC E-Kirja

Ferguson John Smart 2011 Jenkins the definitive guide OrsquoReilly Media E-kirja

Jenkins Wiki Verkkosivu lthttpswikijenkins-ciorgdisplayJENKINSMeet+Jenkinsgt

Lukkarinen Aleksi 2011 Opinnaumlytetyouml Iteratiivinen sovelluskehitys Kehitysympaumlris-

toumln toteutus ja yllaumlpito Opinnaumlytetyouml Tietotekniikan koulutusohjelma Metropolia Am-

mattikorkeakoulu lthttpurnfiURNNBNfiamk-201105269796gt

Maven vs Ant or Ant vs Maven 1999-2006 Verkkojulkaisu

lthttpwwwjavafaqnujava-article1168htmlgt Luettu 2342012

Sanchez Carlos 2009 Using lava lamps for continuous integration Verkkojulkaisu

lthttpblogcarlossanchezeu20090128using-lava-lamps-for-continuous-ingt

Luettu 1242012

46

Schneide Blog ndash public business secrets Verkkosivu

lthttpschneidewordpresscomgt Luettu 1242012

Who broke the build 2011 Verkkojulkaisu

lthttpwwwpapercutcomblogchris20110819who-broke-the-buildgt Luettu

1242011

Page 38: Joakim Sandqvist - Theseus
Page 39: Joakim Sandqvist - Theseus
Page 40: Joakim Sandqvist - Theseus
Page 41: Joakim Sandqvist - Theseus
Page 42: Joakim Sandqvist - Theseus
Page 43: Joakim Sandqvist - Theseus
Page 44: Joakim Sandqvist - Theseus
Page 45: Joakim Sandqvist - Theseus
Page 46: Joakim Sandqvist - Theseus
Page 47: Joakim Sandqvist - Theseus
Page 48: Joakim Sandqvist - Theseus
Page 49: Joakim Sandqvist - Theseus
Page 50: Joakim Sandqvist - Theseus
Page 51: Joakim Sandqvist - Theseus
Page 52: Joakim Sandqvist - Theseus
Page 53: Joakim Sandqvist - Theseus