Slide 1

Slide 1 text

@jeanneboyarsky Jeanne Boyarsky Tuesday Oct 23, 2018 Oracle Code One – DEV4959 DevSecOps: The Java Developer’s Guide to Automating with Groovy speakerdeck.com/boyarsky

Slide 2

Slide 2 text

@jeanneboyarsky 2

Slide 3

Slide 3 text

@jeanneboyarsky About Me •  16 years as Java Developer •  Years of tooling & Groovy 3

Slide 4

Slide 4 text

@jeanneboyarsky Wednesday Recommendations 4 Date Time Title Speaker Wed Oct 24 1:30-2:15 Functional Programming in Java, Groovy & Kotlin Ken Kousen Wed Oct 24 2:30-3:15 JVM Languages: Compare (Java, Kotlin, Groovy, Scala) Leonardo Lima, Nikhil Nanivadekar & Donald Raab Wed Oct 24 2:30-3:15 Which Java Version from Which Java Vendor with What Support Jeanne Boyarsky

Slide 5

Slide 5 text

@jeanneboyarsky Will cover •  Groovy syntax & idioms •  Using Groovy from Nexus •  Using Groovy from Jenkins •  Live demo 5

Slide 6

Slide 6 text

@jeanneboyarsky This morning’s lab https://github.com/boyarsky/OracleCodeOne2018- HOL-Automating-Stack-Groovy •  Nexus - Groovy •  Jenkins - Groovy •  Bonus – Java Sonar rule 6

Slide 7

Slide 7 text

@jeanneboyarsky GROOVY SYNTAX & IDIOMS 7

Slide 8

Slide 8 text

@jeanneboyarsky 8 Groovy Java

Slide 9

Slide 9 text

@jeanneboyarsky Java à Groovy 9 int lastYear = 2017; int year = 2018 def nextYear = 2019 Can use Java syntax Without semicolon or type

Slide 10

Slide 10 text

@jeanneboyarsky Strings 10 def city = 'SF' println 'Here: $city' println "Here: $city" println "In ${city.class}" Java String GString Here: $city Here: SF In class java.lang.String

Slide 11

Slide 11 text

@jeanneboyarsky Multiline string 11 def name = 'Jeanne' def text = """ Name ______ $name """ Name ______ Jeanne Coming in Java 13 with new syntax?

Slide 12

Slide 12 text

@jeanneboyarsky What does this print? 12 def name = 'Jeanne' def text = ’’’ Name ______ $name ’’’ Name ______ $name

Slide 13

Slide 13 text

@jeanneboyarsky Getters vs properties 13 def animal = 'dog' println animal.getBytes() println animal.bytes

Slide 14

Slide 14 text

@jeanneboyarsky == vs equals() def monday ='monday' def nextMonday = new String('monday') def tuesday ='tuesday' println monday == null println null == monday println monday == tuesday println monday == nextMonday 14 Can use Java syntax True!

Slide 15

Slide 15 text

@jeanneboyarsky What is the truth? 15 Value Result Null False Empty String False Empty List False 1 character String True

Slide 16

Slide 16 text

@jeanneboyarsky Elvis has entered the building 16 println Jenkins.instance .getItemByFullName(jobName) ?.lastBuild ?.timestamp ?.time

Slide 17

Slide 17 text

@jeanneboyarsky Optional Parens 17 def ch = 'abc'.charAt 1 println ch Optional when no ambiguity Ambiguity: •  Zero params •  Within println

Slide 18

Slide 18 text

@jeanneboyarsky ArrayList++ 18 def list = ['cookie', 'chocolate’] list << 'candy' println list.getClass() class java.util.ArrayList println list[1] chocolate ArrayList does what now?!

Slide 19

Slide 19 text

@jeanneboyarsky ArrayList++ 19 println list [cookie, chocolate, candy] println list[-1] candy println list.min() candy list.sort() println list [candy, chocolate, cookie]

Slide 20

Slide 20 text

@jeanneboyarsky MetaClass def list = [1,3,5,7] println list.metaClass.methods println list.metaClass.methods*.name.sort().unique() 20 •  Method signatures •  Method names

Slide 21

Slide 21 text

@jeanneboyarsky Streams/lambas def list = [1,3,5,7] list.stream().filter({n -> n >= 5}).forEach({n -> System.out.println(n)}) println list.grep { num -> num >= 5 } println list.grep { it >= 5 } 21 “it” implies param •  grep vs filter •  less plumbing

Slide 22

Slide 22 text

@jeanneboyarsky Countdown! (10..1).each{ println "--> $it" } println 'Blast off!' 22

Slide 23

Slide 23 text

@jeanneboyarsky Stream Mapping Java Groovy filter grep map collect forEach for limit take distinct unique anyMatch/allMatch any/every findFirst find 23

Slide 24

Slide 24 text

@jeanneboyarsky Lazy? 24 Groovy; not lazy Java streams

Slide 25

Slide 25 text

@jeanneboyarsky Functions incrementBy = 4; def add(num) { num + incrementBy } println add(2) 25 no def Return optional Types optional

Slide 26

Slide 26 text

@jeanneboyarsky Named Params def config = new SelectorConfiguration( name: ‘selector', description: ‘packages', ) 26 Only the default constructor exists!

Slide 27

Slide 27 text

@jeanneboyarsky More on Groovy http://groovy-lang.org/style-guide.html http://docs.groovy-lang.org/next/html/ documentation/working-with-collections.htm http://docs.groovy-lang.org/2.4.7/html/groovy-jdk/ overview-summary.html 27

Slide 28

Slide 28 text

@jeanneboyarsky USING GROOVY IN JENKINS 28

Slide 29

Slide 29 text

@jeanneboyarsky 29 println 'Hello Oracle Code One! ' println GroovySystem.version Hello Oracle Code One! 2.4.11

Slide 30

Slide 30 text

@jeanneboyarsky 30

Slide 31

Slide 31 text

@jeanneboyarsky 31 Jenkins/Hudson split

Slide 32

Slide 32 text

@jeanneboyarsky 32 System scripts can access object model Can’t choose Groovy version

Slide 33

Slide 33 text

@jeanneboyarsky Three ways to find methods JavaDoc https://javadoc.jenkins.io https://javadoc.jenkins.io/plugin Groovy def instance = Jenkins.getInstance() println instance.metaClass.methods*.name .sort().unique() println instance.metaClass.methods Google Reuse existing scripts 33

Slide 34

Slide 34 text

@jeanneboyarsky Sample Object model code import jenkins.model.Jenkins def instance = Jenkins.getInstance() def realm = Jenkins.getInstance().securityRealm realm.createAccount('olivia', 'olivia') instance.save() 34

Slide 35

Slide 35 text

@jeanneboyarsky Pipeline Syntax Helper 35

Slide 36

Slide 36 text

@jeanneboyarsky Convert to Pipeline Plugin 36

Slide 37

Slide 37 text

@jeanneboyarsky 37

Slide 38

Slide 38 text

@jeanneboyarsky 38

Slide 39

Slide 39 text

@jeanneboyarsky Script Security Plugin 39 ERROR: Build step failed with exception org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessExce ption: Scripts not permitted to use staticMethod jenkins.model.Jenkins getInstance Options: •  Approve each script manually •  Sandbox - whitelist APIs •  Authorized Build plugin to run as admin

Slide 40

Slide 40 text

@jeanneboyarsky USING GROOVY IN NEXUS 40

Slide 41

Slide 41 text

@jeanneboyarsky 41 log.info'Hello Oracle Code One! ’ log.info GroovySystem.version

Slide 42

Slide 42 text

@jeanneboyarsky Nexus Built Ins 42 repository (RepositoryApi) ScriptApi blobStore (BlobStoreApi) core (CoreApi) security (SecurityApi)

Slide 43

Slide 43 text

@jeanneboyarsky And then there is 43 container GlobalComponentLookupHelper selectorManager = container.lookup(SelectorManager.class.name) securitySystem = container.lookup(SecuritySystem.class.name) authorizationManager = securitySystem.getAuthorizationManager('default')

Slide 44

Slide 44 text

@jeanneboyarsky Eclipse (or IntelliJ) 44

Slide 45

Slide 45 text

@jeanneboyarsky LIVE DEMO 45

Slide 46

Slide 46 text

@jeanneboyarsky What we will cover Code Examples Walkthrough •  Nexus object model •  Jenkins object model •  Jenkins pipeline Demo – Nexus and Jenkins 46

Slide 47

Slide 47 text

@jeanneboyarsky 47