Liigu peamise sisu juurde

Gradle pistikprogrammid

Sissejuhatus

Gradle on üles ehitatud pistikprogrammide peale, ilma nendeta ei tee Gradle peaaegu midagi. Pistikprogrammid lisavad ehitusprotsessi ülesandeid, konfiguratsioone ja konventsioone. Eelnevalt oleme juba tutvunud kahe pistikprogrammiga, mis on Gradle'sse sisseehitatud: java ja application.

Lisaks nendele kahele on olemas ka kogukonna poolt loodud pistikprogrammid, mida avaldatakse Gradle Plugin Portal lehele. Need laiendavad Gradle'i võimekust, näiteks lisades staatilise analüüsi, code coverage, turvaanalüüsi ja palju muid tööriistu.

Selles peatükis tutvume kolme pistikprogrammiga, mis lahendavad probleeme, millega võite igapäevaselt kokku puutuda. Nendeks on: koodistiili jõustamine, testikatvuse mõõtmine ja turvaaukude tuvastamine.

Core vs Community Plugins

Gradle enda ja kogukonna programmide erinevus ilmneb koheselt nende deklareerimisel:

plugins {
// Core plugins — referred to by short name
id 'java'
id 'checkstyle'
id 'jacoco'

// Community plugins — need full ID and version
id 'org.owasp.dependencycheck' version '9.0.9'
}

java, application jms. on Gradle'sse sisseehitatud, nende puhul ei pea versiooni eraldi deklareerima. Kogukonna pistikprogramme laetakse alla Plugin Portal'ist ning nende puhul peab määrama nime ja versiooni.

Checkstyle

Checkstyle on staatilise analüüsi tööriist, mis jõustab koodistiili reegleid. See ei kontrolli, kas sinu kood töötab, vaid kas sinu kood järgib stiilireegleid.

Seadistus

plugins {
id 'java'
id 'checkstyle'
}

checkstyle {
toolVersion = '10.12.4'
configFile = file('config/checkstyle/checkstyle.xml')
}

checkstyle.xml fail defineerib antud projekti jaoks reeglid ning tavaliselt asub eelnevas näites mainitud asukohal. Näite konfiguratsiooni kohta leiate siit: https://iti0202.pages.taltech.ee/public/files/checkstyle.xml

Kasutus

./gradlew checkstyleMain       # check main source code
./gradlew checkstyleTest # check test source code

Checkstyle loob HTML-aruande build/reports/checkstyle/main.html faili, kus on näidatud iga rikkumine koos faili, rea numbri ja rikutud reegliga.

Kui checkstyleMain on osa check-ülesandest (nagu see vaikimisi on), siis käsu ./gradlew build käivitamine käivitab ka Checkstyle’i. Kui leidub rikkumisi, ehitus ebaõnnestub.

nõuanne

Checkstyle on kõige kasulikum siis, kui see lisatakse projekti varajases etapis. Selle lisamine olemasolevale koodibaasile, kus on tuhandeid rikkumisi, tekitab müra. Kui pead selle lisama olemasolevasse projekti, alusta minimaalse reeglistikuga ja laienda seda aja jooksul.

JaCoCo

JaCoCo (Java Code Coverage) mõõdab, milliseid koodi ridu ja harusid testid katavad. See ei ütle, kas sinu testid on head, vaid ainult seda, kas need käivitavad koodi.

Seadistus

plugins {
id 'java'
id 'jacoco'
}

jacocoTestReport {
dependsOn test
reports {
html.required = true
xml.required = true
}
}

dependsOn test rida tagab, et enne aruande koostamist käivitatakse testid. Ilma selleta poleks JaCoCo'l andmeid,mille põhjal aruannet koostada.

Kasutus

./gradlew test jacocoTestReport

Aruanne koostatakse HTML faili build/reports/jacoco/test/html/index.html. Aruanne näitab testide katvust paki, klassi ja meetodi tasemel. Rohelised read on testide poolt käivitatud, punased mitte ning kollane tähistab osalist kaetavust (näiteks testiti ainult if-lause true haru).

Aruande lugemine

VärvTähendus
RohelineTäielikult kaetud - testid käivitasid
PunaneKatmata - ei käivitatud kunagi
KollaneOsaliselt kaetud - mõned harud testitud, teised mitte
hoiatus

100% kattuvus ei tähenda, et sinu kood on korrektne. See tähendab, et iga rida on vähemalt korra käivitatud. Test, mis kutsub meetodi välja ilma tulemust kontrollimata, annab katvuse, kuid ei tõesta midagi. Kasuta katvust tööriistana katmata koodi leidmiseks, mitte kvaliteedi mõõdikuna.

hoiatus

Gradle 9+ ei lisa enam JUnit Platform Launcher'it automaatselt testide classpath'i. Kui kasutad Gradle 9 või uuemat versiooni, lisa dependencies plokki järgmine rida:

testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

Ilma selleta ebaõnnestub testide käivitamine veaga: "Could not start Gradle Test Executor: Failed to load JUnit Platform."

OWASP Dependency-Check

OWASP Dependency-Check plugin skaneerib sinu projekti sõltuvusi, võrreldes neid National Vulnerability Database’i (NVD) andmebaasiga, et leida teadaolevaid turvaauke (CVE-d).

Seadistus

plugins {
id 'org.owasp.dependencycheck' version '9.0.9'
}

dependencyCheck {
failBuildOnCVSS = 7.0f
formats = ['HTML']
}

failBuildOnCVSS tähendab, et ehitus ebaõnnestub, kui mõnel sõltuvusel on teadaolev turvaauk CVSS-skooriga 7.0 või kõrgem (high severity).

Kasutus

./gradlew dependencyCheckAnalyze

Esmane kasutus võtab järgnevatest kauem aega kuna programm laeb turvaaukude andmebaasi alla. Järgmised käivitamised on kiiremad, kuna andmebaas salvestatakse lokaalselt vahemällu.

HTML-aruanne näitab iga sõltuvuse kohta võimalike teadaolevaid CVE-sid, nende skoore ning ka viide antud turvaaugule.

Miks see on oluline

Teegid sisaldavad vigu, sealhulgas turvavigu. Mõni sinu kasutatav teek võib sisaldada teadaolevat turvaauku, mis võimaldab kaugkäivitust, andmeleket või DDOS-rünnakuid. Neid vigu ei saa sa ise parandada, kuid saad need tuvastada ja uuendada teegi parandatud versioonile.

Millal neid tööriistu käivitada

Reaalsetes projektis sobituvad need tööriistad CI/CD töövoogu erinevates punktides:

TööriistMillal käivitadaMiks
CheckstyleIga commit / pull requestLeiab stiiliprobleemid varakult, töötab kiiresti
JaCoCoIga commit / pull requestTagab, et uuel koodil on testid, töötab kiiresti
OWASP Dependency-CheckEnne väljalasetAeglane (andmebaasi allalaadimine), ei pea iga commit’i puhul jooksma

Kõigi kolme käivitamine iga commit’i puhul on võimalik, kuid aeglustab tagasisideahelat. Levinud praktika on käivitada kiired kontrollid (Checkstyle, JaCoCo) iga muudatuse korral ja aeglasemad kontrollid (OWASP) ajastatult.