Joakim Sandqvist - Theseus
Transcript of 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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