Tässä Jenkinsin Groovy-oppaassa opit käyttämään Apache Groovy -skriptiä Jenkins-pipelinen rakentamiseen. Groovy sopii aloittelijoille ja on hyvä valinta tiimien skriptien yhtenäistämiseen.
Sandeep Kinayath
Sandy works as a consultant at Eficode Denmark. He’s passionate about cloud computing, IoT, and hardware integrations. While also having a penchant for football and cricket!
Mutta mitä Groovy on? Apache Groovy on olio-ohjelmointikieli, jota käytetään JVM-alustalla. Tämä dynaaminen kieli on saanut vaikutteita muun muassa kielistä Python, Smalltalk ja Ruby. Sillä voi orkestroida putkiasi Jenkinsissä ja yhdistää eri kieliä toisiinsa, joten projektisi tiimit voivat osallistua kehitykseen eri kielillä.
Groovy toimii sujuvasti yhdessä Java-kielen kanssa, ja Javan sekä Groovyn syntaksi ovat hyvin samankaltaisia. Jos unohdat Groovya kirjoittaessasi syntaksin, voit jatkaa suoraan Java-syntaksilla. Groovya voi käyttää myös yhtenä Java-alustan skriptikielenä. Java voi kutsua Groovy-skriptejä, mikä vähentää Java-kehitykseen kuluvaa aikaa.
Se tarjoaa myös monia tuottavuutta parantavia ominaisuuksia, kuten DSL-tuen, sulkeumat ja dynaamisen tyypityksen. Toisin kuin jotkin muut kielet, se toimii Javan kumppanina, ei sen korvaajana. Groovy-lähdekoodi käännetään JVM-tavukoodiksi, joten se toimii millä tahansa alustalla.
Miksi käyttää Groovya?
Tässä ovat tärkeimmät syyt harkita Groovyn käyttöä. Se on yleinen vaihtoehto pipeline-tiedostojen luomiseen.
1. Kuten aiemmin todettiin, Groovy on ketterä ja dynaaminen kieli. Se integroituu sujuvasti kaikkiin olemassa oleviin Java-objekteihin ja -kirjastoihin.
Groovy on Java ilman tyyppejä eli ilman perustietotyyppien, kuten int, float ja String, määrittelyä. Käytännössä se toimii kuten Java: muuttuja määritellään ilman tyypin määrittämistä. Groovy päättelee tyypin objektin arvon perusteella.
2. Groovyssa for-silmukka on tiiviimpi ja helpompi lukea. Groovyn silmukka-lauseet tukevat while-, for- ja for-in-rakenteita sekä break- ja continue-lauseita, ja ne ovat yhdenmukaisia Javan kanssa.
Esimerkiksi:
0..5 tarkoittaa, että kokonaisluvut 0, 1, 2, 3, 4 ja 5 sisältyvät joukkoon.
0..<5 tarkoittaa lukuja 0, 1, 2, 3, 5 ja a..d kirjaimia a, b, c, d:
Groovy tukee myös parametrien oletusarvoja:
3. Groovyssa voimme käyttää sulkeita kokoelmien tai taulukoiden määrittelyyn.
Myös Groovyn hakumenetelmät ovat joustavampia.
Groovylla voit myös lisätä kokoelmia kokoelmiin tai poistaa niitä niistä.
Voimme käyttää seuraavia menetelmiä, kun lisäämme elementtejä kokoelmaan:
4. Groovyn lisäetuna ovat sen operaattorit:
Groovyn aritmeettiset, loogiset, vertailu- ja bittikohtaiset operaattorit ovat yhdenmukaisia esimerkiksi nodeJS:n kanssa. Groovyn == vastaa Javan equals-metodeja.
5. Toinen etu ovat Groovyssa käytettävissä olevat List-metodit.
Add( ) Lisää uuden arvon tämän listan loppuun.
Get( ) Palauttaa tämän listan määritetyssä kohdassa olevan elementin.
Contains( ) Palauttaa true-arvon, jos lista sisältää määritetyn arvon.
Minus( ) Luo alkuperäisten elementtien pohjalta uuden listan, josta määritetty elementti on poistettu.
Plus ( ) Luo uuden listan, joka sisältää alkuperäisen listan elementit ja määritetyt elementit.
Pop( ) Poistaa tämän listan viimeisen kohteen.
Remove( ) Poistaa elementit luettelon määritetystä kohdasta
Reverse() Luo uuden luettelon, jossa alkuperäisen luettelon elementit ovat käänteisessä järjestyksessä
Size( ) Hakee tämän luettelon elementtien määrän.
Sort( ) Palauttaa alkuperäisestä luettelosta lajitellun kopion.
6. Muissa olio-ohjelmointikielissä on objektien ja luokkien käsitteet, joilla kuvataan ohjelmointikielen oliopohjaisuutta. Groovy luo implisiittisesti getterit, setter-metodit ja tarjoaa argumentillisia konstruktoreita.
7. Poikkeusten käsittely toimii Groovyssa samalla tavalla kuin Javassa: poikkeukset siepataan try- ja catch-lauseilla.
Groovyssa on paljon edistyneitä aiheita (JSON-käsittely, metodit, Mapit jne.), joihin voi tutustua virallisessa Apache-dokumentaatiossa.
Groovy yhdistää myös Pythonin, Rubyn ja muiden skriptikielten ominaisuuksia. Se sisältää paljon syntaktista sokeria kieliopissaan. Java-kehityksessä on paljon koodia, joka on kirjoitettava Javalla mutta joka voidaan jättää pois Groovyssa, kuten aiemmista esimerkeistä näkyy.
Yhteenvetona: Groovyn tärkein etu on, että voit kirjoittaa saman toiminnallisuuden vähemmällä koodilla. Mielestäni tämä tarkoittaa Javaan verrattuna tiiviimpää ja merkityksellisempää koodia.
Mitä haittoja Groovyn käytössä on?
Jotkut sanovat, että deklaratiivisiin tiedostoihin perustuva yksinkertaisempi infrastructure as code – jota Groovy ei välttämättä edusta – on pitkällä aikavälillä parempi vaihtoehto DevOpsia tavoiteltaessa. Lisäksi Apache Groovy voi aluksi vaikuttaa hieman hakatulta kieleltä.
Olen kuitenkin nähnyt käytännössä, että Groovyn käyttöönotto on tuonut tiimejä yhteen organisaatioissa, jotka eivät aiemmin ole tietoisesti tavoitelleet DevOpsia. Se on mahdollistanut itsenäisen työskentelyn ja lisännyt samalla jaettujen kirjastojen määrää.
Jos haluat oppia Groovysta tarkemmin, tutustu sen dokumentaatioon.
Jenkins Pipeline Jenkinsfilessä
Katsotaan Jenkinsin Pipeline-lähestymistapaa ja oikeaa pipeline-syntaksia. Jenkinsin sisäänrakennetun Groovy-tuen ja kattavan pipeline Step -kirjastoviitteen avulla voit toteuttaa monimutkaisen build- ja julkaisuprosessin kirjoittamalla mukautettuja pipeline-skriptejä.
Jenkins Pipelinen voi luoda seuraavilla tavoilla:
Klassisella käyttöliittymällä/Blue Oceanilla – voit syöttää perus-Pipelinen suoraan Jenkinsiin klassisella käyttöliittymällä tai Blue Oceanin käyttöliittymällä. Blue Oceanin käyttöliittymässä voit kirjoittaa Pipelinen Jenkinsfilen ja lähettää sen versionhallintaan [lisätietoja Blue Oceanista täällä]
SCM:ssä – Jenkinsfilen voi kirjoittaa käsin ja lähettää projektin versionhallintarepositorioon.
Freestyle-jobien luomisen ja konfiguroinnin sijaan Jenkins Pipeline sisältää joukon ohjeita, jotka Jenkins-jobi suorittaa.
Klassisella käyttöliittymällä luotu Jenkinsfile tallennetaan suoraan Jenkinsiin. Jenkinsin klassisella käyttöliittymällä luotu Pipeline tallennetaan Jenkinsin juurihakemistoon, ja skripti suoritetaan Jenkinsin skriptikonsolissa. Jenkinsfile on Jenkinsin peruskoodi, jonka se suorittaa Groovy-skriptinä Jenkinsin skriptikonsolissa.
Jenkinsfilen rakenne
Ensimmäinen rivi, shebang, määrittää tiedoston Groovy-kieliseksi skriptiksi:
Upotetuissa Pipeline-tiedostoissa ei ole shebangia, koska se lisätään sisäisesti.
Sama yllä kirjoitettu (deklaratiivinen pipeline) -esimerkki voidaan kirjoittaa myös scripted pipeline -koodina.
Scripted pipeline on Groovy-pohjainen DSL. Se tarjoaa Jenkinsin käyttäjille enemmän joustavuutta ja skaalautuvuutta kuin deklaratiivinen pipeline.
Groovy-skriptit eivät välttämättä sovi kaikille käyttäjille, ამიტომ Jenkins loi Declarative Pipeline -ratkaisun. Declarative Pipeline -syntaksi on tiukempi. Siinä on käytettävä Jenkinsin ennalta määriteltyä DSL-rakennetta, joka tarjoaa yksinkertaisemman ja selkeämmän syntaksin Jenkins-pipelinejen kirjoittamiseen.
Tämä määrittää, millä koneella koodi suoritetaan.
tai
Osio on määritettävä pipeline-lohkon ylimmällä tasolla, mutta sen käyttö stage-tasolla on valinnaista.
Taustaksi: Jenkinsissä on Master- ja worker-solmujen eli slave-solmujen käsite.
Miksi tarvitsemme useita solmuja
1. Jenkinsin työkuorman jakamiseen
2. Käytämme eri solmuja erityyppisille projekteille
Oletetaan esimerkiksi, että meillä on kahdenlaisia projekteja:
Java
iOS
Java-työn buildaamiseen tarvitsemme Java Build Machine -koneen / solmun.
Vastaavasti iOS build -työhön tarvitsemme MAC Slave -koneen / Macin / Windows-koneen.
Stage
Buildissamme on useita stageja, ja jokaisessa stage-osiossa on omat vaiheet ja komennot. Kun Jenkins Pipelinen työstä suurin osa suoritetaan, se sisältää yhden tai useamman stagen sarjan. On suositeltavaa, että stageissa on vähintään yksi stage-direktiivi eri toimitusprosessien, kuten buildauksen, testauksen ja käyttöönoton, yhdistämiseksi.
Rinnakkaiset staget
Pipelinen staget voivat määrittää useita sisäkkäisiä stageja parallel-lohkoon. Tämä voi parantaa toiminnan tehokkuutta aikaa vievissä stageissa, jotka eivät ole riippuvaisia toisistaan. Lisäksi yksittäisen parallel-lohkon useita vaiheita voidaan suorittaa rinnakkain.
Vaiheet
Pipelinen keskeisin ja perustavanlaatuisin osa on step. Pipelinet koostuvat useista vaiheista, joiden avulla voit buildata, testata ja ottaa käyttöön sovelluksia. Vaiheet ovat declarative pipeline- ja scripted pipeline -syntaksin perusrakennuspalikoita, joilla kerrotaan Jenkinsille, mitä sen tulee tehdä.
Scripted pipeline ei kuvaa vaiheita erikseen osana syntaksiaan, mutta pipeline steps -viitedokumentissa kuvataan yksityiskohtaisesti pipelinen ja sen pluginien sisältämät vaiheet.
Jenkins Pipeline mahdollistaa useiden vaiheiden yhdistämisen minkä tahansa automaatioprosessin luomiseksi. Ajattele step-vaihetta yksittäisenä komentona, joka suorittaa yhden toiminnon. Kun vaihe onnistuu, siirrytään seuraavaan vaiheeseen. Jos vaiheen suoritus epäonnistuu, pipeline epäonnistuu.
Kun kaikki pipelinen vaiheet on suoritettu onnistuneesti, pipeline katsotaan onnistuneesti suoritetuksi.
Aikakatkaisut ja uudelleenyritykset
Triggerit
triggers -direktiivi määrittää automaattisen tavan, jolla Pipeline automatisoi triggerit. Jenkinsin dokumentaation mukaan tällä hetkellä käytettävissä olevat triggerit ovat cron, pollSCM ja upstream.
Cron
Hyväksyy cron-tyylisen merkkijonon, jolla määritetään säännöllinen aikaväli pipelineen käynnistymiselle, esimerkiksi:
pollSCM
Hyväksyy cron-tyylisen merkkijonon, jolla määritetään säännöllinen aikaväli Jenkinsin SCM-lähteen muutosten tarkistukselle. Jos uusia muutoksia löytyy, pipeline käynnistetään uudelleen.
When
when-komennolla pipeline voi annettujen ehtojen perusteella päättää, suoritetaanko tämä vaihe. when-komennossa on oltava vähintään yksi ehto. Monimutkaisempia pipelinejen ehtorakenteita voi luoda sisäkkäisillä ehdoilla: not, allOf tai anyOf. Jos when -direktiivi sisältää useita ehtoja, kaikkien aliehtojen on palautettava true, jotta stage suoritetaan. Ehtoja voi upottaa sisäkkäin miten syvälle tahansa.
Sitä käytetään useimmiten stepin tai stagen ohittamiseen tai suorittamiseen
Buildin jälkeiset osiot
Määritä toiminto pipelinen tai stagen suorituksen loppuun. Saatat joutua suorittamaan siivousvaiheita tai muita toimintoja pipelinen lopputuloksen perusteella. Jälkiehtolohko tukee seuraavia komponentteja: always, changed, failure, success, unstable ja aborted. Näiden lohkojen avulla stepit voidaan suorittaa pipelinen tai stagen suorituksen lopussa pipelinen tilan mukaan.
Ympäristömuuttujat
Ympäristömuuttujat voidaan asettaa globaalisti, kuten alla olevassa esimerkissä, tai stagekohtaisesti. Kuten voit odottaa, ympäristömuuttujien asettaminen stagekohtaisesti tarkoittaa, että ne koskevat vain stagea, jossa ne on määritetty.
Poikkeusten käsittely Jenkins Pipelinessa
Poikkeusten käsittelyyn voit nyt käyttää try catch -lohkoa stepin suorittamiseen ja poikkeusten sieppaamiseen.
Testien ja artifactien tallentaminen
Jenkins voi tallentaa ja koota testituloksia, kunhan testiajoympäristösi pystyy tuottamaan testitulostiedostoja. Jenkins sisältää yleensä JUnit-stepin, mutta jos testaustyökalusi eivät pysty tuottamaan JUnit-tyylisiä XML-raportteja, saatavilla on lisäplugineja, jotka käsittelevät käytännössä mitä tahansa laajasti käytettyä testiraporttimuotoa.
Keräämme testitulokset ja artifactit post-osion avulla.
Ilmoitusten lähettäminen
Kun pipeline onnistuu tai epäonnistuu, nykyistä tilaa koskeva ilmoitus on lähetettävä asianomaiselle tiimille. Voimme lisätä pipelineen ilmoitus- tai muita steppejä viimeistelyä, ilmoituksia tai muita pipelinen lopussa tehtäviä toimintoja varten.
Sähköposti-ilmoitus
Slack-ilmoitus
Jenkins Pipeline Groovy: jaetut kirjastot
Kun pipeline otetaan käyttöön yhä useammassa organisaation projektissa, yhteisiä toimintamalleja alkaa todennäköisesti muodostua. Usein on hyödyllistä jakaa pipelinejen osia eri projektien välillä päällekkäisyyksien vähentämiseksi.
Pipeline tukee jaettujen kirjastojen luomista. Ne voidaan määrittää ulkoisissa versionhallintarepositorioissa ja ladata olemassa oleviin pipelineihin.
Jaettu kirjasto määritetään nimellä, lähdekoodin hakutavalla, kuten SCM:llä, sekä haluttaessa oletusversiolla. Nimen tulee olla lyhyt tunniste, sillä sitä käytetään skripteissä.
Tarkastele seuraavaa kansiorakennetta: (suoraan Jenkinsin dokumentaatiosta)
src-hakemiston tulisi noudattaa Java-lähdekoodihakemistojen vakiomuotoista rakennetta. Tämä hakemisto lisätään classpathiin pipelineja suoritettaessa.
vars-hakemisto sisältää skriptitiedostoja, jotka ovat käytettävissä pipelineissa muuttujina. Tiedoston nimi on muuttujan nimi pipelinessa. Tarkempi ohje shared libraryn määrittämiseen Jenkinsissä. Käytettävissä on lisää vaihtoehtoja ja muita katkelmia, joita voimme kokeilla luomalla ja suorittamalla niitä Jenkins-järjestelmässä Jenkinsfileä käyttäen.
resources-hakemistossa voidaan hallita kaikkia pipelinen tarvitsemia muita kuin Groovy-tiedostoja ja apuskriptejä. Yllä olevassa esimerkkirakenteessa JSON-malli tallennetaan resources-hakemistoon, ja sitä voidaan kutsua shared libraryssa libraryResource-funktiolla.
Voit käyttää tai kutsua luomaasi kirjastoa seuraavasti:
Esimerkki funktioiden kirjoittamisesta Groovy shared libraryyn
Shared libraryn globaalien muuttujien määrittäminen
vars-hakemistossa on skriptejä, jotka määrittävät pipelinesta käytettävissä olevia globaaleja muuttujia.
vars-hakemiston skriptit luodaan sisäisesti tarpeen mukaan singleton-instansseiksi. Näin yhteen .Groovy-tiedostoon voidaan määrittää kätevästi useita metodeja.
Stepien käyttäminen
Shared libraryn Groovy-luokat eivät voi kutsua suoraan steppejä, kuten sh tai git. Voimme välittää luokan metodille erikseen tietyt globaalit muuttujat: env (sisältää kaikki nykyiset ympäristömuuttujat) ja steps (sisältää kaikki pipelinen vakiostepit). Ne voivat kuitenkin toteuttaa metodeja ympäröivän luokan ulkopuolella, ja nämä metodit voivat puolestaan kutsua pipeline-steppejä.
Esimerkiksi:
Jota voidaan sitten kutsua scripted pipelinesta:
Kokonaisen Jenkins Groovy Script -esimerkin Groovy-tiedostorakenne näyttää tältä:
Lisää Jenkins-Groovy-katkelmia löydät Dennyzhangin GitHub-repositoriosta.
Toivottavasti tästä on ollut apua matkallasi Groovyn parissa!
- DevOps
- CI/CD
Subscribe to our newsletter
Related blogs