ContinuousDeliverymitJenkinsWorkflow
MartinReinhardt(HolisticonAG)@mreinhardt
Agenda■ Einführung/BuildPipeline■ JenkinsPipeline■ JenkinsPipelineLibraries■ Testautomatisierung■ Provisioning■ Links
Einführung■ ContinuousDeliveryistdielogischeFortsetzungvonContinuousIntegration
■ DieIdeedahinter□ SoftwaremitagilenMethodenkannnichtkomplett(manuell)getestetwerden
□ Alle2WochengesamtenFunktionsumfangabtestenistutopisch□ TestumgebungenstehenmeistnichtausreichendzurVerfügung
BuildPipeline■ Jobs=BausteinederStages("UnitofWork")□ BestehenausTaskswieBuild,Deploy,Copy,Test
■ AgileSoftwareentwicklungarbeitetkleinteilig□ SoftwareoftundzuverlässiginProduktion□ NutzungderIDE!=Automatisierung□ WesentlichistdabeidieBuildPipeline
■ Wie?□ Geschwindigkeit□ Automatisierung□ Reproduzierbarkeit
WarumBuildPipelines"Oneofthechallengesofanautomatedbuildandtestenvironmentisyouwantyourbuildtobefast,sothatyoucangetfastfeedback,butcomprehensiveteststakealongtimetorun.Adeploymentpipelineisawaytodealwiththisbybreakingupyourbuildintostages.Eachstageprovidesincreasingconfidence,usuallyatthecostofextratime.Earlystagescanfindmostproblemsyieldingfasterfeedback,whilelaterstagesprovideslowerandmorethroughprobing.DeploymentpipelinesareacentralpartofContinuousDelivery"
MartinFowler
JenkinsBuildPipelinePlugin■ FeaturevonJenkins2,Groovy-basiert■ KlassichePipelineinJenkinsbenötigtvielePlugins
■ NeueVariantebietetdetailiiertenÜberblickineinemJob
Beispiel
BeispielPipeline
node{stage('Checkout'){checkoutscm}...
stage('Unit-Tests'){sh"mvntest"}
archiveArtifacts'**/target/*.jar'junit'*/target/surefire-reports/TEST*.xml'
Beispiel
WarumJenkinsPipeline■ Transparenz■ Struktur■ Wartbarkeit■ Produktreife■ Übersicht■ NichtnuraufJava-Weltbeschränkt■ InfrastructureasCode(IaC)auchfürBuild
PipelineÖkosystemwächst■ immermehrPluginsunterstützenPipelinedirekt■ Dokumentationwirdimmerbesser■ mittlerweilesehrvieleAnwendungsgebieteabgedeckt
MultiBranches■ MultibranchPipelineJobsbauenautomatisch■ Mitgitflowsehrhilfreich■ Build-AnpassungenkönnenalsBranchgetestetwerden
BlueOcean■ GestartetalsneuesUIfürJenkins■ FastFeedbackmitmodernenUI■ mittlerweilegutePluginunterstützung
■ GutgeeignetfürschnellenÜberblickdurchFarben
PipelineLibraries■ -PrinzipauchbeimBuild■ BuildenthältschnelleinigeHilfsmethoden■ NutzunginanderenProjektenstatt'Copy-and-Pase'
■ NichtnuraufHilfsmethodenbeschränkt□ volleGroovy-Unterstützung□ kompletteBuildsinkl.Steps/Stages
Don'trepeatyourself
möglich
Beispiel@Library('holisticon-build-library')defutils=newde.holisticon.ci.jenkins.Utils()
node{utils.waitForAppToBeReady('localhost:8080')}
Beispiel
Testautomatisierung■ AnchlussderUnit-TestserzeugtenArtefakteweitertesten□ AblageinRepository□ DeploymentinTest-Umgebung
■ Testumgebungenproblemebehaftet□ DedizierteSlaves(Labels)□ DockerImages
■ Dockerbesondershilfreich(lokalesTesten,Ressourcennutzung)
■ FeedbackisteinMuss□ TestToolsmüssenaussaugekräftigeReportsliefern□ reproduzierbar&nachvollziehbar□ geradebeiOberflächen-Tests
OberflächenTestingmitStil-Serenity
■ ToolfürATDD(acceptancetestdrivendevelopment)
■ MachtIntegrations-Testslesbarer,wartbarerundwiederwendbar
■ SeleniumalstechnischeBasis■ NutztPageObjectPattern■ StelltReportingfürTracking&FehlersuchezurVerfügung
■ VerbindungmitTicket-System■ AnforderungenaufTestsmappen
Konzepte-Page-ObjectPattern
■ TestautomatisierungspatternfüreffizienteundlesbareTests
■ JedeUISeitewirdaufeinePage-Klassegemappt■ InteraktionwirdüberSteps-Klassenumgesetzt■ TestsnutzenStepsumAnwendungsverhaltenzusimulieren
Report
Beispiel
ProvisioningmitAnsible■ OSSToolfürKonfigurationsmanagement(vgl.Puppet,ChefoderCFengine)□ kannad-hocausgeführtwerden(vgl.Funcoderdsh)□ DeploymentFunktionen(vgl.FabricoderCapistrano)
■ 2012gestartete,2015vonRedHatübernommen■ inPythongeschrieben■ kommtohneAgentsundServeraus
Beispiel■ YAML-basierteSyntaxfürdiesog.Playbooks
-hosts:webserversvars:http_port:80max_clients:200remote_user:roottasks:-name:ensureapacheisatthelatestversionapt:pkg=apache2-mpm-workerstate=latest-name:ensureapacheisrunningservice:name=apache2state=started
Deploymentsshagent(['e96eb307-86ff-4858-82bb-cdc20bf1e4b4']){stage('Deploy'){dir("ansible"){//Install/updatedependenciessh"ansible-galaxyinstall-rrequirements.yml-f"//Executeplaybooksh"ansible-playbookcddemo.yml--extra-vars'app_version=${appVersion}path_to_artifact=../angular-spring-boot-webapp/target/ng-spring-boot.jar--ansible_ssh_port=\${ANSIBLE_PORT}'"}}}
Beispiel
WiesoAnsible■ schlankundeinfachzuerlernen■ flexibelundohneInfrastruktureinsetzbar■ MitAnsibleGalaxyreichhaltigeBibliothek■ guterSupportinRedHatDistributionen
Fazit&Ausblick■ FeedbackisteinMuss□ TeststufenkontinuierlichFeedbacküberaktuellenQualitätsstand□ Toolsmüssendasunterstützen
■ PipelinePluginenormeHilfe,geradebeigitflow■ ImBereichvonCDvieleToolsimBereichTesting&Automatisierung
■ Gefahrvon"Over-Engineering"derSchritteinPipeline
■ BewegungimTool-Bereich(ThoughtworksGo,Docker...)
■ ContinuousIntegrationzwingendfürContinuousDelivery
Links■■■
■■■■■
BeispielAnwendungJenkinsMultiBranchBeispielDevOps–TestautomationI–InfrastructureasCodeRockCImitJenkins2undDockerBeispielSerenityÜberJenkinsBuildLibrariesholisticonPipelineLibraryBeispielJenkinsPluginPipelineLibraryBeispiel
Thereisnoone-size-fits-allsolutiontothecomplexproblemofimplementingadeploymentpipeline.”ContinuousDelivery,J.Humble,D.Farley
Aboutme■ MartinReinhardt(HolisticonAG)
■■
github.com/hypery2ktwitter.com/mreinhardt
Präsentation
holisticon.github.io