Programování

Co je Jenkins? Vysvětlil server CI

Jenkins nabízí jednoduchý způsob, jak nastavit prostředí nepřetržité integrace nebo nepřetržitého doručování (CI / CD) pro téměř jakoukoli kombinaci jazyků a úložišť zdrojových kódů pomocí kanálů a také automatizaci dalších rutinních vývojových úkolů. Jenkins sice nevylučuje potřebu vytvářet skripty pro jednotlivé kroky, ale poskytuje vám rychlejší a robustnější způsob integrace celého řetězce nástrojů pro sestavení, testování a nasazení, než si můžete snadno vytvořit sami.

"Neporušuj noční stavění!" je zásadním pravidlem v obchodech pro vývoj softwaru, které každé ráno pro své testery zveřejňují čerstvě vytvořenou denní verzi produktu. Před Jenkinsem bylo nejlepším řešením, které vývojář mohl udělat, aby neporušil noční sestavení, sestavení a pečlivé a úspěšné testování na místním počítači před potvrzením kódu. To ale znamenalo testovat změny jednotlivě, bez každý den zavazuje. Neexistovala žádná pevná záruka, že noční stavba přežije odhodlání.

Jenkins - původně Hudson - byla přímou odpovědí na toto omezení.

Hudson a Jenkins

V roce 2004 byl Kohsuke Kawaguchi vývojářem Java v Sun. Kawaguchiho unavilo rozbíjení buildů ve své vývojové práci a chtěl najít způsob, jak před spácháním kódu do úložiště zjistit, zda bude kód fungovat. Takže Kawaguchi postavil automatizační server v a pro Javu, aby to umožnil, nazvaný Hudson. Hudson se stal populárním v Sunu a rozšířil se do dalších společností jako open source.

Rychle vpřed do roku 2011 a spor mezi společností Oracle (která získala společnost Sun) a nezávislou komunitou open source Hudson vedl k fork se změnou názvu, Jenkins. V roce 2014 se Kawaguchi stal technickým ředitelem společnosti CloudBees, která nabízí produkty kontinuálního doručování založené na Jenkins.

Obě vidlice nadále existovaly, i když Jenkins byl mnohem aktivnější. Dnes je projekt Jenkins stále aktivní. Web Hudson byl uzavřen 31. ledna 2020.

V březnu 2019 zahájila Linux Foundation spolu s CloudBees, Google a řadou dalších společností novou open source softwarovou nadaci nazvanou Continuous Delivery Foundation (CDF). Jenkins přispěvatelé se rozhodli, že jejich projekt by se měl připojit k této nové nadaci. Kawaguchi v té době napsal, že se pro uživatele nic významného nezmění.

V lednu 2020 Kawaguchi oznámil, že přechází na svůj nový startup, Launchable. Řekl také, že by oficiálně ustoupil od Jenkinse, přestože by zůstal ve výboru pro technický dohled nadace Continuous Delivery Foundation a změnil svou roli v CloudBees na poradce.

Související video: Jak rychleji dodávat kód pomocí CI / CD

Jenkinsova automatizace

Dnes je Jenkins předním automatizačním serverem s otevřeným zdrojovým kódem a má přibližně 1 600 zásuvných modulů pro podporu automatizace všech druhů vývojových úkolů. Problém, který se Kawaguchi původně snažil vyřešit, je nepřetržitá integrace a nepřetržité doručování kódu Java (tj. Vytváření projektů, spouštění testů, provádění statické analýzy kódu a nasazení) pouze jedním z mnoha procesů, které lidé automatizují pomocí Jenkinse. Těchto 1600 modulů plug-in zahrnuje pět oblastí: platformy, uživatelské rozhraní, správu, správu zdrojového kódu a nejčastěji správu sestavení.

Jak Jenkins funguje

Jenkins je distribuován jako archiv WAR a jako instalační balíčky pro hlavní operační systémy, jako balíček Homebrew, jako image Dockeru a jako zdrojový kód. Zdrojový kód je většinou Java s několika soubory Groovy, Ruby a Antlr.

Můžete spustit Jenkins WAR samostatně nebo jako servlet na aplikačním serveru Java, jako je Tomcat. V obou případech vytváří webové uživatelské rozhraní a přijímá volání svého REST API.

Když spustíte Jenkins poprvé, vytvoří administrátora s dlouhým náhodným heslem, které můžete odemknout instalací na svou původní webovou stránku.

Doplňky Jenkins

Po instalaci vám Jenkins umožňuje buď přijmout výchozí seznam pluginů, nebo zvolit vlastní pluginy.

Jakmile si vyberete počáteční sadu doplňků, klikněte na tlačítko Instalovat a Jenkins je přidá.

Hlavní obrazovka Jenkins zobrazuje aktuální frontu sestavení a stav Exekutora a nabízí odkazy na vytváření nových položek (úloh), správu uživatelů, prohlížení historie sestavení, správu Jenkinse, prohlížení vlastních pohledů a správu vašich pověření.

Nová položka Jenkins může být kterýkoli ze šesti typů úloh plus složka pro organizaci položek.

Na stránce Správa Jenkinse můžete dělat 18 věcí, včetně možnosti otevřít rozhraní příkazového řádku. V tomto okamžiku bychom se ale měli podívat na potrubí, což jsou vylepšené pracovní postupy, které jsou obvykle definovány skripty.

Jenkinsovy potrubí

Jakmile nakonfigurujete Jenkins, je čas vytvořit několik projektů, které pro vás Jenkins může vytvořit. Zatímco ty umět k vytváření skriptů použijte webové uživatelské rozhraní, aktuálním osvědčeným postupem je vytvoření skriptu kanálu s názvem Jenkinsfile, a zkontrolujte jej do svého úložiště. Snímek obrazovky níže ukazuje webový formulář konfigurace pro víceoborové potrubí.

Jak vidíte, zdroji větví pro tento druh kanálu v mé základní instalaci Jenkinse mohou být úložiště Git nebo Subversion, včetně GitHub. Pokud potřebujete jiné druhy úložišť nebo různé služby online úložišť, stačí přidat vhodné doplňky a restartovat Jenkins. Snažil jsem se, ale nemohl jsem myslet na systém pro správu zdrojového kódu (SCM), který ještě nemá uvedený Jenkinsův plug-in.

Jenkinsovy kanály mohou být deklarativní nebo skriptované. A deklarativní pipeline, jednodušší z těchto dvou, používá syntaxi kompatibilní s Groovy - a pokud chcete, můžete soubor spustit #!báječný nasměrovat editor kódu správným směrem. Deklarativní kanál začíná a potrubí blok, definuje činidloa definuje etapy které zahrnují spustitelný soubor kroky, jako v níže uvedeném třístupňovém příkladu.

potrubí {

agent libovolný

etapy {

fáze („Sestavit“) {

kroky {

ozvěna „Budova ..“

            }

        }

fáze („Test“) {

kroky {

ozvěna „Testování ..“

            }

        }

fáze („Nasazení“) {

kroky {

ozvěna „Nasazení ...“

            }

        }

    }

}

potrubí je povinný vnější blok pro vyvolání pluginu Jenkins pipeline. činidlo definuje, kam chcete spustit kanál. žádný říká, že ke spuštění kanálu nebo fáze použije libovolného dostupného agenta. Konkrétnější agent může deklarovat kontejner, který se má použít, například:

agent {

přístavní dělník {

obrázek „maven: 3-alpine“

štítek „můj definovaný štítek“

args „-v / tmp: / tmp“

    }

}

etapy obsahovat posloupnost jedné nebo více direktiv fáze. Ve výše uvedeném příkladu jsou tři fáze sestavení, testování a nasazení.

kroky dělat skutečnou práci. V příkladu výše kroky pouze tištěné zprávy. Užitečnější krok sestavení může vypadat takto:

potrubí {

agent libovolný

etapy {

fáze („Sestavit“) {

kroky {

udělej

archiveArtifacts artifacts: „** / target / *. jar“, otisk prstu: true

            }

        }

    }

}

Tady se dovoláváme udělat z prostředí a poté archivovat všechny vytvořené soubory JAR do archivu Jenkins.

The pošta část definuje akce, které budou spuštěny na konci běhu nebo fáze potrubí. V sekci příspěvků můžete použít řadu bloků post-condition: vždy, změněno, selhání, úspěch, nestabilní, a přerušeno.

Například soubor Jenkinsfile níže vždy spustí JUnit po fázi testování, ale odešle e-mail pouze v případě, že potrubí selže.

potrubí {

agent libovolný

etapy {

fáze („Test“) {

kroky {

udělej šek

            }

        }

    }

pošta {

vždy {

junit „** / cíl / *. xml“

        }

selhání {

pošlete na e-mail: [email protected], předmět: „Potrubí se nezdařilo :(“

        }

    }

}

Deklarativní kanál může vyjádřit většinu toho, co potřebujete k definování kanálů, a je mnohem jednodušší se naučit než skriptovaná syntaxe kanálu, což je DSL založený na Groovy. Skriptovaný kanál je ve skutečnosti plnohodnotným programovacím prostředím.

Pro srovnání jsou následující dva Jenkinsfiles zcela ekvivalentní.

Deklarativní potrubí

potrubí {

agent {docker ‘node: 6.3‘}

etapy {

fáze („build“) {

kroky {

sh ‚npm ​​—verze '

            }

        }

    }

Skriptovaný kanál

uzel („přístavní dělník“) {

pokladna scm

fáze („Sestavit“) {

docker.image („node: 6.3“). inside {

sh ‚npm ​​—verze '

        }

    }

}

Blue Ocean, Jenkins GUI

Pokud byste chtěli nejnovější a nejlepší uživatelské rozhraní Jenkins, můžete použít zásuvný modul Blue Ocean, který poskytuje grafické uživatelské prostředí. Modul plug-in Blue Ocean můžete přidat do své stávající instalace Jenkins nebo spustit kontejner Docker Jenkins / Blue Ocean. S nainstalovaným Blue Ocean bude mít vaše hlavní nabídka Jenkins další ikonu:

Blue Ocean můžete otevřít přímo, pokud si přejete. Je ve složce / blue na serveru Jenkins. Vytváření potrubí v Blue Ocean je trochu grafičtější než v obyčejném Jenkinsovi:

Jenkins Docker

Jak jsem již zmínil, Jenkins je také distribuován jako Docker image. Proces toho není mnohem víc: Jakmile vyberete typ SCM, zadáte adresu URL a přihlašovací údaje, poté vytvoříte kanál z jednoho úložiště nebo prohledáte všechna úložiště v organizaci. Každá větev se souborem Jenkinsfile dostane kanál.

Zde používám obrázek Blue Ocean Docker, který je dodáván s několika nainstalovanými doplňkovými službami Git než výchozí seznam poskytovatelů SCM:

Jakmile spustíte některé kanály, modul plug-in Blue Ocean zobrazí jejich stav, jak je uvedeno výše. Jednotlivé fáze můžete přiblížit a zobrazit fáze a kroky:

Můžete také přiblížit větve (nahoře) a aktivity (dole):

Proč používat Jenkins?

Plug-in Jenkins Pipeline, který jsme používali, podporuje případ použití obecné kontinuální integrace / nepřetržitého doručování (CICD), což je pravděpodobně nejběžnější použití pro Jenkins. Existují speciální úvahy pro některé další případy použití.

Projekty Java byly pro Jenkinse původním raison d’être. Už jsme viděli, že Jenkins podporuje budování s Mavenem; funguje také s Ant, Gradle, JUnit, Nexus a Artifactory.

Android běží jakousi Javu, ale zavádí otázku, jak testovat na široké škále zařízení Android. Modul plug-in emulátoru Android vám umožňuje vytvářet a testovat na tolika emulovaných zařízeních, kolik chcete definovat. Doplněk Google Play Publisher umožňuje odesílat sestavení do alfa kanálu na Google Play k vydání nebo dalšímu testování na skutečných zařízeních.

Ukázal jsem příklady, kde jsme zadali kontejner Dockeru jako agenta pro potrubí a kde jsme spustili Jenkinse a Blue Ocean v kontejneru Dockeru. Kontejnery Docker jsou v prostředí Jenkins velmi užitečné pro zlepšení rychlosti, škálovatelnosti a konzistence.

Pro Jenkins a GitHub existují dva hlavní případy použití. Jedním z nich je integrace sestavení, která může zahrnovat háček služby, který spustí Jenkins při každém potvrzení vašeho úložiště GitHub. Druhým je použití ověřování GitHub k řízení přístupu k Jenkinsovi přes OAuth.

Jenkins podporuje kromě Javy i mnoho dalších jazyků. Pro C / C ++ existují pluginy, které zachycují chyby a varování z konzoly, generují skripty sestavení pomocí CMake, spouštějí testy jednotek a provádějí statickou analýzu kódu. Jenkins má řadu integrací s nástroji PHP.

Zatímco kód Pythonu není nutné vytvářet (pokud nepoužíváte například Cython nebo nevytváříte k instalaci Python kolečko), je užitečné, že se Jenkins integruje s nástroji pro testování a reportování Pythonu, jako jsou Nose2 a Pytest, a kvalitou kódu nástroje jako Pylint. Podobně se Jenkins integruje s nástroji Ruby, jako jsou Rake, Cucumber, Brakeman a CI :: Reporter.

Jenkins pro CI / CD

Celkově Jenkins nabízí jednoduchý způsob, jak nastavit prostředí CI / CD pro téměř jakoukoli kombinaci jazyků a úložišť zdrojových kódů pomocí kanálů, jakož i automatizaci řady dalších rutinních vývojových úkolů. Jenkins sice nevylučuje potřebu vytvářet skripty pro jednotlivé kroky, ale poskytuje vám rychlejší a robustnější způsob integrace celého řetězce nástrojů pro sestavení, testování a nasazení, než byste si sami mohli snadno sestavit.