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.
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ärv | Tähendus |
|---|---|
| Roheline | Täielikult kaetud - testid käivitasid |
| Punane | Katmata - ei käivitatud kunagi |
| Kollane | Osaliselt kaetud - mõned harud testitud, teised mitte |
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.
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ööriist | Millal käivitada | Miks |
|---|---|---|
| Checkstyle | Iga commit / pull request | Leiab stiiliprobleemid varakult, töötab kiiresti |
| JaCoCo | Iga commit / pull request | Tagab, et uuel koodil on testid, töötab kiiresti |
| OWASP Dependency-Check | Enne väljalaset | Aeglane (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.