continuous delivery mit jenkins workflow - · pdf filejenkins workflow martin reinhardt...

Post on 09-Mar-2018

246 Views

Category:

Documents

5 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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

Thereisnoone-size-fits-allsolutiontothecomplexproblemofimplementingadeploymentpipeline.”ContinuousDelivery,J.Humble,D.Farley

Aboutme■ MartinReinhardt(HolisticonAG)

■■

github.com/hypery2ktwitter.com/mreinhardt

top related