Sinisellä taustallla tekstit Azure DevOps ja Xavi, sekä numerosarja ykkösiä ja nollia

Älyk­kään ohjauk­sen digi­taa­li­silla jalan­jäl­jillä, osa 3: Mitä tapah­tuu projektinhallintaympäristössä?

Älyk­kään ohjauk­sen digi­taa­li­silla jalan­jäl­jillä  -artik­ke­li­sar­jan ensim­mäi­sessä osassa on kuvattu mihin eri ympä­ris­töi­hin digi­taa­li­set jalan­jäl­jet kerty­vät tieto­jen­kä­sit­te­lyn projek­tio­pin­noissa, sekä miten niitä aiotaan hyödyn­tää. Tässä artik­ke­lissa keski­ty­tään kuvaa­maan miten projek­tin­hal­lin­taym­pä­ris­tön datan noude­taan ja muun­ne­taan XAPI-muotoon.  Artik­keli sisäl­tää tekni­siä osuuk­sia, mutta näkö­kulma pyri­tään pitä­mään ylei­sellä tasolla.

Mikä Azure Devops?

Azure DevOps on ohjel­mis­to­pro­jek­tien hallin­taan suun­nattu ympä­ristö. Sitä on mahdol­lista käyttää ohjel­mis­to­pal­ve­luna (SaaS, Software as-a Service) tai paikal­li­sesti asen­net­tun palve­li­men avulla.  Ynpä­ris­tön kautta on mahdol­lista hallin­noida projek­tia ja siihen liit­ty­vien aihioi­den, ominai­suuk­sien, käyt­tä­jä­ta­ri­noi­den ja tehtä­vien kehit­tä­mistä kehi­tys­jo­non avulla.

Azure DevOps –palve­lun sisäl­tä­mää dataa on mahdol­lista hakea ohjel­mal­li­sesti REST-raja­pin­nan kautta. Azure DevOps-palve­lussa on oma raja­pin­tansa useiden eri asioi­den hake­mi­seen ja päivit­tä­mi­seen. Kutsuja varten tarvi­taan asentaa sovel­tuva käyt­tä­jä­tun­nus, sekä myöntää sille riit­tä­vät kehit­tä­jä­ta­son oikeu­det kyse­ly­jen tekemiseen.

Miten REST-raja­pin­taa voidaan hyödyntää?

Käyt­tä­jä­tun­nuk­selle on määri­tel­tävä Azure DevOp­sissa henki­lö­koh­tai­nen pääsy­avain (Perso­nal Access Token, PAT), jotta kutsuja voi tehdä eril­li­sen HTTP-pyynnön avulla. Pyynnön yhtey­dessä väli­te­tään tarpeel­li­nen avain. PAT luodaan käyt­tä­jä­koh­tai­sesti kirja­tu­malla ensiksi Azure Devops –palve­luun, ja määrit­tä­mällä halu­tulle käyt­tä­jä­tun­nuk­selle uusi avain.  Avaimen toiminta on rajat­tava päät­ty­mään tiet­tynä päivänä (maksi­mis­saan sille voi antaa vuoden toiminta-ajan). Avai­melle on myös määri­tel­tävä oikeu­det halut­tuun datajoukkoon.

REST-kutsuja on mahdol­lista tehdä esimer­kiksi cURL-ohjel­malla, joka on komen­to­ri­vi­työ­kalu datan siir­toon useiden eri verk­ko­pro­to­kol­lien avulla. Itse kutsun teke­mi­nen on yksin­ker­taista. Alla olevassa esimer­kissä curl-ohjel­man avulla haetaan kaikki orga­ni­saa­tioon luodut projek­tit JSON-muodossa.

curl -u :<PAT> https://dev.azure.com/<organisaatio>/_apis/projects?api-version=2.0

JSON-muotoi­nen data on tarkoi­tettu koneen luet­ta­vaksi, mutta sen muoto yksin­ker­tais­tet­tuna vastaa suurin piir­tein alla olevaa esimerkkiä.

{”count”:7,

  ”value”:[{”id”:”<tunniste>”,

”name”:”Ryhmä X”,

”description”:”<Kuvaus>”,

”url”:”https://dev.azure.com/tiko-toimeksiantoprojekti2022/_apis/projects/<id>”,

”state”:”wellFormed”,

”revision”:105,

”visibility”:”private”,

”lastUpdateTime”:”2022-05-11T08:30:51.273Z”}]

}

Azure DevOp­sin käsit­teet ja toimijat

Datan käsit­te­lyä varten tarvit­semme tietoa Azure DevOp­sin projek­teista, tiimeistä, tiimien jäse­nistä, iteraa­tioista, worki­te­meistä, wiki­mer­kin­nöistä ja git-repojen kommi­teista. Azure DevOp­sissa nämä käsit­teet raken­tu­vat hierar­ki­sesti, joka vaikut­taa kyse­ly­jen muodos­ta­mi­seen REST-raja­pin­nan kautta. Tiimien jäse­nyy­det Azuressa täytyy olla määri­tetty opis­ke­li­joille ryhmä­tie­don hake­mista varten.

Kuten kuvasta 1 on havait­ta­vissa, tiimi on orga­ni­saa­tion alainen suoraan, mutta se voidaan liittää yhteen tai useam­paan projek­tiin. Kehit­tä­jät kuulu­vat orga­ni­saa­tioon, ja ne voidaan asettaa tiimei­hin tarpeen mukaan. Projek­tiiin kuuluu Wiki sekä version­hal­lin­ta­repo kommit­tei­neen. Kehi­tys­jono on aina tiimi­koh­tai­nen, samoin kuten iteraa­tiot, joita voi olla useita. Worki­tem kuuluu projek­tiin, ja se voidaan liittää myös kehitysjonoon.

Kaaviokuva
Kuva 1. Azuren käsit­tei­den rakenne ja keski­näi­set suhteet.

Tiedon­ha­ke­mi­sen toteuttaminen

Varsi­nai­nen tiedon­haku on mahdol­lista toteut­taa Linux-palve­li­mella komen­to­tul­kin skrip­tin, eli komen­to­sar­ja­kie­li­tie­dos­ton avulla, joka ajas­te­taan suori­tet­ta­vaksi kerran vuoro­kau­dessa. Skripti ajaa curl-ohjel­man eri para­met­rein useam­man kerran, sekä käsit­te­lee ja yhdis­tää niiden palaut­ta­man JSON-datan myöhem­pää käyttöä varten.

Projek­tien Worki­te­mien nouta­mi­seen ei pilotin toteu­tusai­kaan ollut saata­villa suoraa API-kutsua, joka olisi samalla kertaa palaut­ta­nut kaikki tarvit­ta­vat tiedot.  Halutut tiedot saatiin kuiten­kin noudet­tua alla lista­tun WIQL-kyselyn avulla (Work Item Query Language).  Se palaut­taa Worki­te­mien ID:t ja URLit halu­tusta projek­tista luon­ti­päi­vän mukaan laji­tel­tuna ja syntak­sil­taan muis­tut­taa paljon SQL-kieltä, jota käyte­tään tietokantakyselyissä.

Select [System.Id], [System.Title], [System.State], [System.TeamProject]

From WorkI­tems

WHERE [System.TeamProject] = <PROJEKTIN_NIMI> order by [System.CreatedDate] desc

Kuvassa 2 on havain­nol­lis­tettu miten eri tiedot noude­taan Azuren REST-APIsta projek­ti­koh­tai­sesti, ja ne yhdis­te­tään kate­go­rioit­tain JSON-tiedos­toi­hin muun­nos­oh­jel­man käsit­te­lyä varten.  Käytän­nössä tämä tarkoit­taa, että esimer­kiksi yksi JSON-tiedosto pitää sisäl­lään kaikki wiki­päi­vi­tys­ta­pah­tu­mat erotel­tuna projek­ti­koh­tai­sesti. Sama tehdään version­hal­lin­ta­re­pon kommi­teille, tiimien kokoon­pa­noille, iteraa­tioille ja worki­te­meille. Jako on tarpeen, että voimme tehdä oletuk­sia datan sisäl­löstä ohjel­man toteu­tuk­sen ja testauk­sen aikana. Lisäksi modu­laa­ri­nen rakenne mahdol­lis­taa virheel­li­sen datan havait­se­mi­sen helpom­min kehitystyössä.

Vuokaavio jossa esitetään tapahtumat Projektin nimen hakemisesta projektin käsittelyyn ja datan siirtämiseen julkaisuhakemistoon
Kuva 2. Azure DevOp­sin tapah­tu­mien proses­sointi vuokaaviona.

Data muodos­te­taan päivit­täin projek­tien nyky­ti­lasta, ja koos­te­taan ladat­ta­vaksi visua­li­soin­tia varten palve­li­melle sijoit­ta­matta sitä oppi­mis­ta­pah­tu­mien tieto­va­ras­toon.  Tämä eroaa esimer­kiksi Moodlen datan nouta­mi­sesta, jossa tieto­va­ras­toon sijoi­te­taan yhden päivän tapah­tu­mat kerral­laan, ja josta tiedot koos­te­taan palve­li­melle. Mikään ei estäisi luke­masta päivä­koh­tai­sia tapah­tu­mia myös Azure Devop­sin raja­pin­nan kautta, mutta niiden erot­telu tietyn päivän perus­teella tekisi tietoja hake­vasta skrip­tistä moni­mut­kai­sem­man, ja siten virhealttiimman.

XAPI-muunnos

Azure DevOp­sin tuot­ta­mi­nen tapah­tu­mien liit­tä­mi­nen oppi­kop­piin ei tuot­ta­nut varsi­nai­sesti ongel­mia, mutta kehi­tys­työ toki vaati suun­nit­te­lua. Uusin tapah­tu­ma­tyyp­pien lisää­mi­nen vaatii verbien ja id-tunnus­ten määrit­tä­mistä muun­nos­oh­jel­maan. Tämä tapah­tuu käytän­nössä kirjoit­ta­malla tarvit­ta­vat merk­ki­jo­not muun­nos­oh­jel­man koodiin.

Tuot­tee­no­mis­ta­jan tehtä­viin kuulu­vat Worki­te­mien hallin­ta­ta­pah­tu­mat. Ne vaati­vat ehkä eniten pilk­ko­mista pienem­piin osiin, sillä Worki­tem voi olla aihio, ominai­suus, tarina, tehtävä, kehi­tys­jo­non alkio, virhe­ra­portti, testi­ta­paus tai testi­ko­koelma. Tapah­tu­mia määrit­tä­vät käytän­nössä verbit lisäys, päivi­tys, hyväk­sy­mi­nen, aloitus ja valmistuminen. 

Kehit­tä­jän työtä kuvaa­vat tapah­tu­mat keskit­ty­vät lähes yksi­no­maan koodien kommit­tei­hin ja vastaa­vasti SCRUM maste­rin toiminta wiki­päi­vi­tyk­siin, joten näiden osalta muutok­sia koodiin tarvitsi tehdä vähem­män verrat­tuna tuot­tee­no­mis­ta­jan toimintaan.

Yhteen­veto

Räätä­löi­dyn oppi­mi­sa­na­ly­tiikka tarjoaa tässä tapauk­sessa selkeitä etuja kehi­tys­työn tueksi. XAPIin nojaava ratkaisu on jous­tava, jolloin visua­li­soin­tiin saadaan sovi­tet­tua dataa monesta eri lähteestä. Itse kehi­te­tyt ja yllä­pi­de­tyt työka­lut mahdol­lis­ta­vat sen, että ETL-proses­sia voi kehit­tää tarpeen mukaan. Kehikon tukiessa jo datan auto­ma­ti­soi­tua nouta­mista, uuden kohteen lisää­mi­nen entisen jouk­koon on suoraviivaista.


Kirjoit­taja:

Anssi Gröhn, tieto­jen­kä­sit­te­lyn lehtori, Älykäs ohjaus -hanke, Karelia-ammattikorkeakoulu