Što je Jenkins? Objasnio je CI poslužitelj

Jenkins nudi jednostavan način za postavljanje okoline kontinuirane integracije ili kontinuirane isporuke (CI / CD) za gotovo bilo koju kombinaciju jezika i spremišta izvornog koda pomoću cjevovoda, kao i automatizaciju ostalih rutinskih razvojnih zadataka. Iako Jenkins ne uklanja potrebu za stvaranjem skripti za pojedine korake, pruža vam brži i robusniji način za integriranje cijelog lanca alata za izradu, testiranje i postavljanje nego što to lako možete sami izraditi.

"Ne prekidajte noćnu izgradnju!" je glavno pravilo u trgovinama za razvoj softvera koje svako jutro objavljuju svježe izrađenu dnevnu verziju proizvoda za svoje testere. Prije Jenkinsa, najbolje što je programer mogao učiniti da izbjegne lomljenje noćne gradnje bila je pažljiva i uspješna gradnja i testiranje na lokalnom stroju prije nego što je izvršio kôd. Ali to je značilo testiranje nečijih promjena u izolaciji, bez svakodnevnih obaveza svih ostalih. Nije bilo čvrstog jamstva da će noćna gradnja preživjeti nečije počinjenje.

Jenkins - izvorno Hudson - bio je izravan odgovor na ovo ograničenje.

Hudson i Jenkins

2004. Kohsuke Kawaguchi bio je Java programer u tvrtki Sun. Kawaguchi se umorio od razbijanja gradnji u svom razvojnom radu i želio je pronaći način da zna, prije predavanja koda u spremište, hoće li kod raditi. Tako je Kawaguchi izgradio poslužitelj za automatizaciju na i za Javu da to omogući, nazvan Hudson. Hudson je postao popularan u Sunu, a proširio se i na druge tvrtke kao otvoreni izvor.

Premotavanje unaprijed do 2011. godine i spor između Oraclea (koji je stekao Sun) i neovisne zajednice otvorenog koda Hudson doveli su do račvanja s promjenom imena, Jenkins. Kawaguchi je 2014. godine postao glavni tehnički direktor CloudBees-a, koji nudi proizvode za kontinuiranu isporuku na bazi Jenkinsa.

Obje su vilice nastavile postojati, iako je Jenkins bio puno aktivniji. Danas je projekt Jenkins još uvijek aktivan. Web stranica Hudson zatvorena je 31. siječnja 2020.

U ožujku 2019. Linux Foundation, zajedno s CloudBeesom, Googleom i nizom drugih tvrtki, pokrenuo je novu softversku zakladu otvorenog koda nazvanu Continuous Delivery Foundation (CDF). Suradnici Jenkinsa odlučili su da se njihov projekt pridruži ovoj novoj zakladi. Kawaguchi je tada napisao da se ništa značajno neće promijeniti za korisnike.

U siječnju 2020. Kawaguchi je objavio da prelazi u svoj novi startup, Launchable. Također je rekao da će se službeno povući iz Jenkinsa, iako će ostati u Odboru za tehnički nadzor Zaklade za kontinuiranu isporuku i prebaciti svoju ulogu u CloudBeesu na savjetnika.

Povezani video: Kako brže isporučiti kod s CI / CD-om

Jenkinsova automatizacija

Danas je Jenkins vodeći server za automatizaciju otvorenog koda s oko 1.600 dodataka koji podržavaju automatizaciju svih vrsta razvojnih zadataka. Problem koji je Kawaguchi izvorno pokušavao riješiti, kontinuirana integracija i kontinuirana isporuka Java koda (tj. Izrada projekata, pokretanje testova, izrada statičke analize koda i postavljanje) samo je jedan od mnogih procesa koje ljudi automatiziraju s Jenkinsom. Tih 1.600 dodataka obuhvaća pet područja: platforme, korisničko sučelje, administracija, upravljanje izvornim kodom i, najčešće, upravljanje gradnjom.

Kako Jenkins djeluje

Jenkins se distribuira kao WAR arhiva i kao instalacijski paketi za glavne operativne sustave, kao paket Homebrew, kao Docker slika i kao izvorni kod. Izvorni kod uglavnom je Java, s nekoliko datoteka Groovy, Ruby i Antlr.

Jenkins WAR možete pokrenuti samostalno ili kao servlet na Java aplikacijskom poslužitelju kao što je Tomcat. U oba slučaja proizvodi web korisničko sučelje i prihvaća pozive svom REST API-ju.

Kada Jenkins prvi put pokrenete, on stvara administrativnog korisnika s dugačkom nasumičnom lozinkom koju možete zalijepiti na početnu web stranicu kako biste otključali instalaciju.

Jenkins dodaci

Jednom instaliran, Jenkins omogućuje vam da prihvatite zadani popis dodataka ili odaberete vlastite dodatke.

Nakon što odaberete početni set dodataka, kliknite gumb Instaliraj i Jenkins će ih dodati.

Glavni zaslon Jenkinsa prikazuje trenutni red izrade i status izvršitelja te nudi veze za stvaranje novih stavki (poslova), upravljanje korisnicima, prikaz povijesti izrade, upravljanje Jenkinsom, pregled vaših prilagođenih prikaza i upravljanje vašim vjerodajnicama.

Nova Jenkinsova stavka može biti bilo koja od šest vrsta poslova plus mapa za organiziranje predmeta.

Na stranici Manage Jenkins možete učiniti 18 stvari, uključujući opciju otvaranja sučelja naredbenog retka. U ovom bismo trenutku, međutim, trebali pogledati cjevovode, koji su poboljšani tijekovi rada koji se obično definiraju skriptama.

Jenkinsovi cjevovodi

Nakon što Jenkins konfigurirate, vrijeme je da izradite neke projekte koje Jenkins može izgraditi za vas. Dok vi možete koristiti web sučelje za stvaranje skripte, trenutna najbolja praksa je stvoriti cjevovod skriptu, pod nazivom Jenkinsfile , i provjerite ga u repozitoriju. Snimka zaslona u nastavku prikazuje konfiguracijski web obrazac za višegranski cjevovod.

Kao što vidite, izvori grana za ovu vrstu cjevovoda u mojoj osnovnoj Jenkinsovoj instalaciji mogu biti Git ili Subversion spremišta, uključujući GitHub. Ako su vam potrebne druge vrste spremišta ili različite mrežne usluge spremišta, pitanje je samo dodavanja odgovarajućih dodataka i ponovnog pokretanja Jenkinsa. Pokušao sam, ali nisam mogao smisliti sustav za upravljanje izvornim kodom (SCM) koji već nema naveden Jenkins dodatak.

Jenkinsovi cjevovodi mogu biti deklarativni ili skriptirani. Deklarativno cjevovoda, jednostavnije od dva, koristi Groovy kompatibilan sintaksu, a ako želite, možete početi datoteku s #!groovyukazati svoj kod urednika u pravom smjeru. Deklarativni cjevovod započinje pipelineblokom, definira agenti definira stageskoji uključuju izvršnu datoteku steps, kao u primjeru u tri faze u nastavku.

cjevovod {

    agent bilo koji

    faze {

        stage ('Build') {

            koraci {

                odjek 'Zgrada ..'

            }

        }

        faza ('Test') {

            koraci {

                odjek "Ispitivanje .."

            }

        }

        stage ('Razmještanje') {

            koraci {

                odjek 'Raspoređivanje ....'

            }

        }

    }

}

pipelineje obvezni vanjski blok za pozivanje dodatka Jenkinsov cjevovod. agentdefinira gdje želite voditi cjevovod. anykaže da koristi bilo koji raspoloživi agent za pokretanje cjevovoda ili faze. Specifičniji agent može proglasiti spremnik za upotrebu, na primjer:

agent {

    docker {

        slika 'maven: 3-alpine'

        oznaka 'moja-definirana-oznaka'

        argumenti '-v / tmp: / tmp'

    }

}

stagessadrže slijed jedne ili više faznih direktiva. U gornjem primjeru tri su faze Izgradnja, Testiranje i Uvođenje.

stepsobaviti stvarni posao. U primjeru iznad koraka upravo ispisane poruke. Korisniji korak izrade mogao bi izgledati ovako:

cjevovod {

    agent bilo koji

    faze {

        stage ('Build') {

            koraci {

                sh 'napraviti'

                archiveArtifacts artefakti: '** / target / *. jar', otisak prsta: true

            }

        }

    }

}

Ovdje se pozivamo makeiz ljuske, a zatim arhiviramo sve proizvedene JAR datoteke u Jenkinsovu arhivu.

postDio definira aktivnosti koje će se izvoditi na kraju cjevovoda vožnji ili fazi. Možete koristiti niz post-stanja blokova u poštanskom sekcije: always, changed, failure, success, unstable, i aborted.

Na primjer, Jenkinsfile u nastavku uvijek pokreće JUnit nakon faze testiranja, ali šalje e-poštu samo ako cjevovod zakaže.

cjevovod {

    agent bilo koji

    faze {

        faza ('Test') {

            koraci {

                sh 'provjeri'

            }

        }

    }

    objaviti {

        stalno {

            junit '** / target / *. xml'

        }

        neuspjeh {

            pošta na: [email protected], subject: 'Cjevovod nije uspio :('

        }

    }

}

Deklarativni cjevovod može izraziti većinu onoga što vam je potrebno za definiranje cjevovoda i puno je lakše naučiti ga od skriptirane sintakse cjevovoda, koja je Groovyjev DSL. Skriptirani cjevovod zapravo je potpuno razvijeno programsko okruženje.

Za usporedbu, sljedeća dva Jenkinsfila potpuno su ekvivalentna.

Deklarativni cjevovod

cjevovod {

    agent {docker 'čvor: 6,3'}

    faze {

        stage ('build') {

            koraci {

                sh 'npm - verzija'

            }

        }

    }

Skriptirani cjevovod

node ('docker') {

    naplata scm

    stage ('Build') {

        docker.image ('čvor: 6.3'). iznutra {

            sh 'npm - verzija'

        }

    }

}

Plavi ocean, Jenkins GUI

Ako želite najnovije i najbolje korisničko sučelje Jenkins, možete upotrijebiti dodatak Blue Ocean koji pruža grafičko korisničko iskustvo. Dodatak Blue Ocean možete dodati u postojeću Jenkinsovu instalaciju ili pokrenuti spremnik Jenkins / Blue Ocean Docker. S instaliranim Blue Oceanom, vaš Jenkinsov glavni izbornik imat će dodatnu ikonu:

Ako želite, možete izravno otvoriti Blue Ocean. Nalazi se u / blue mapi na Jenkins poslužitelju. Stvaranje cjevovoda u Plavom oceanu malo je grafičnije nego u običnom Jenkinsu:

Jenkins Docker

Kao što sam već spomenuo, Jenkins se također distribuira kao Dockerova slika. Postupak nema puno više: nakon što odaberete SCM vrstu, pružite URL i vjerodajnice, a zatim stvorite cjevovod iz jednog spremišta ili skenirajte sva spremišta u organizaciji. Svaka grana s Jenkinsfileom dobit će cjevovod.

Ovdje pokrećem sliku Blue Ocean Dockera koja je došla s nekoliko instaliranih dodataka usluge Git od zadanog popisa dobavljača SCM-a:

Nakon što pokrenete neke cjevovode, dodatak Blue Ocean prikazat će njihov status, kao što je prikazano gore. Možete povećati pojedinačni cjevovod da biste vidjeli faze i korake:

Također možete povećati grane (gore) i aktivnosti (dolje):  

-

Zašto koristiti Jenkins?

Dodatak Jenkins Pipeline koji smo koristili podržava općeniti slučaj upotrebe kontinuirane integracije / kontinuirane isporuke (CICD), koji je vjerojatno najčešća upotreba za Jenkins. Postoje posebna razmatranja za neke druge slučajeve uporabe.

Java projekti bili su izvorni razlog postojanja Jenkinsa. Već smo vidjeli da Jenkins podržava gradnju s Mavenom; ona također radi s Ant, Gradle, JUnit, Nexus i Artifactory.

Android pokreće svojevrsnu Javu, ali uvodi pitanje kako testirati na širokom rasponu Android uređaja. Dodatak za Android emulator omogućuje vam izradu i testiranje na onoliko emuliranih uređaja koliko želite definirati. Dodatak Google Play Publisher omogućuje vam slanje gradnji na alfa kanal na Google Playu radi objavljivanja ili daljnjeg testiranja na stvarnim uređajima.

Pokazao sam primjere gdje smo naveli Docker spremnik kao sredstvo za cjevovod i gdje smo Jenkins i Blue Ocean pokrenuli u Docker spremniku. Docker spremnici vrlo su korisni u Jenkinsovom okruženju za poboljšanje brzine, skalabilnosti i dosljednosti.

Dva su glavna slučaja upotrebe Jenkinsa i GitHub-a. Jedna je integracija gradnje, koja može uključivati ​​uslužnu udicu za pokretanje Jenkinsa pri svakom urezivanju vašeg GitHub spremišta. Druga je upotreba GitHub provjere autentičnosti za kontrolu pristupa Jenkinsu putem OAuth-a.

Jenkins podržava mnoge druge jezike osim Jave. Za C / C ++ postoje dodaci za hvatanje pogrešaka i upozorenja s konzole, generiranje skripti gradnje s CMakeom, pokretanje jediničnih testova i provođenje statičke analize koda. Jenkins ima brojne integracije s PHP alatima.

Iako Python kôd ne treba graditi (osim ako ne koristite Cython, na primjer, ili ako ne kreirate Python kotačić za instalaciju), korisno je što se Jenkins integrira s Python alatima za testiranje i izvještavanje, kao što su Nose2 i Pytest, te kvalitetom koda alata kao što je Pylint. Slično tome, Jenkins se integrira s Ruby alatima kao što su Rake, Krastavac, Brakeman i CI :: Reporter.

Jenkins za CI / CD

U cjelini, Jenkins nudi jednostavan način postavljanja CI / CD okruženja za gotovo bilo koju kombinaciju jezika i spremišta izvornog koda pomoću cjevovoda, kao i automatizaciju niza drugih rutinskih razvojnih zadataka. Iako Jenkins ne uklanja potrebu za stvaranjem skripti za pojedinačne korake, pruža vam brži i robusniji način za integriranje cijelog lanca alata za izradu, testiranje i postavljanje nego što biste to sami mogli lako izraditi.