Slide 1

Slide 1 text

Build Lifecycle Craftsmanship at the Transylvania JUG by Matthew McCullough

Slide 2

Slide 2 text

Matthew McCullough @matthewmccull

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

➡Gradle ➡Jenkins ➡Sonar ➡Maven 3 ➡VisualVM ➡BTrace

Slide 5

Slide 5 text

➡Gradle ➡Jenkins ➡Sonar ➡Maven 3 ➡VisualVM ➡BTrace

Slide 6

Slide 6 text

Probably the most important technical book of 2010 -Martin Fowler, ThoughtWorks

Slide 7

Slide 7 text

➡Gradle ➡Jenkins ➡Sonar ➡Maven 3 ➡VisualVM ➡BTrace

Slide 8

Slide 8 text

➡Maven 3

Slide 9

Slide 9 text

http://maven.apache.org/

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

➡Why not stay with it? ➡What’s new? Maven 2.x?

Slide 12

Slide 12 text

➡Performance ➡Memory footprint ➡Parallelism Maven 3.x

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

➡Gradle ➡Jenkins ➡Sonar ➡Maven 3 ➡VisualVM ➡BTrace

Slide 15

Slide 15 text

➡Gradle

Slide 16

Slide 16 text

http://gradle.org/

Slide 17

Slide 17 text

XY\kk\inXpkfYl`c[

Slide 18

Slide 18 text

➡Groovy DSL ➡Customizable lifecycle ➡Suitable for build masters and users Better Build Tool

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

➡Gradle ➡Jenkins ➡Sonar ➡Maven 3 ➡VisualVM ➡BTrace

Slide 21

Slide 21 text

➡Jenkins

Slide 22

Slide 22 text

http://jenkins-ci.org/

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

it all started with...

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

and now the space is crowded...

Slide 30

Slide 30 text

Software tools for continuous integration include: ■AnthillPro — continuous integration server by Urbancode ■Apache Continuum — continuous integration server supporting Apache Maven and Apache Ant. Supports CVS, Subversion, Ant, Maven, and shell scripts ■Apache Gump — continuous integration tool by Apache ■Automated Build Studio — proprietary automated build, continuous integration and release management system by AutomatedQA ■Bamboo — proprietary continuous integration server by Atlassian Software Systems ■BuildBot — Python/Twisted-based continuous build system ■BuildMaster — proprietary application lifecycle management and continuous integration tool by Inedo

Slide 31

Slide 31 text

NAnt, Maven, and shell scripts ■Software Configuration and Library Manager — software configuration management system for z/OS by IBM Rational Software ■QuickBuild - proprietary continuous integration server with free community edition featuring build life cycle management and pre-commit verification. ■TeamCity — proprietary continuous-integration server by JetBrains with free professional edition ■Team Foundation Server — proprietary continuous integration server and source code repository by Microsoft ■Tinderbox — Mozilla-based product written in Perl ■Rational Team Concert — proprietary software development collaboration platform with built-in build engine by IBM including Rational Build Forge

Slide 32

Slide 32 text

➡Humans should do the intelligent work ➡Integrate with source code, metrics Continuous Integration

Slide 33

Slide 33 text

473 plugins

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

➡Gradle ➡Jenkins ➡Sonar ➡Maven 3 ➡VisualVM ➡BTrace

Slide 37

Slide 37 text

➡Sonar

Slide 38

Slide 38 text

http://sonarsource.org/

Slide 39

Slide 39 text

No content

Slide 40

Slide 40 text

No content

Slide 41

Slide 41 text

➡For managers? Metrics

Slide 42

Slide 42 text

★Checkstyle ★PMD ★ Findbugs ★ Cobertura ★ Emma ★ Clirr ★ JaCoCo ★ Useless Code ★ SQALE ★ 20+ others...

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

No content

Slide 45

Slide 45 text

#Maven 2 or 3 mvn sonar:sonar

Slide 46

Slide 46 text

No content

Slide 47

Slide 47 text

No content

Slide 48

Slide 48 text

No content

Slide 49

Slide 49 text

➡Gradle ➡Jenkins ➡Sonar ➡Maven 3 ➡VisualVM ➡BTrace

Slide 50

Slide 50 text

➡BTrace

Slide 51

Slide 51 text

http://kenai.com/projects/btrace

Slide 52

Slide 52 text

No content

Slide 53

Slide 53 text

➡Bytecode, class manipulation ➡Aspect-like adjustment at runtime Runtime Inspection

Slide 54

Slide 54 text

import com.sun.btrace.annotations.*; import static com.sun.btrace.BTraceUtils.*; import com.sun.btrace.AnyType; import java.lang.management.MemoryUsage; import java.util.concurrent.atomic.AtomicInteger; import java.util.Map; @BTrace public class TraceAllMethodCalls { /** * METHOD CALL TRACEPOINT. */ @OnMethod( clazz="com.ambientideas.HelloWorldJava", method="print", location=@Location(value=Kind.CALL, clazz="/.*/", method="/.*/") ) public static void m(AnyType[] args) { //System.out.println("Hello"); println(strcat("****** WE'VE ENTERED A METHOD ON CLASS: ", name(probeClass()))); println(strcat("****** WE'VE ENTERED METHOD: ", probeMethod())); } @OnMethod(

Slide 55

Slide 55 text

import java.util.concurrent.atomic.AtomicInteger; import java.util.Map; @BTrace public class TraceAllMethodCalls { /** * METHOD CALL TRACEPOINT. */ @OnMethod( clazz="com.ambientideas.HelloWorldJava", method="print", location=@Location(value=Kind.CALL, clazz="/.*/", method="/.*/") ) public static void m(AnyType[] args) { //System.out.println("Hello"); println(strcat("****** WE'VE ENTERED A METHOD ON CLASS: ", name(probeClass()))); println(strcat("****** WE'VE ENTERED METHOD: ", probeMethod())); } @OnMethod( clazz="/.*/", method="println" ) public static void m2(AnyType[] args) { println(strcat("****** WE'VE ENTERED A METHOD ON CLASS: ", name(probeClass()))); println(strcat("****** WE'VE ENTERED METHOD: ", probeMethod())); } /**

Slide 56

Slide 56 text

public static void m(AnyType[] args) { //System.out.println("Hello"); println(strcat("****** WE'VE ENTERED A METHOD ON CLASS: ", name(probeClass()))); println(strcat("****** WE'VE ENTERED METHOD: ", probeMethod())); } @OnMethod( clazz="/.*/", method="println" ) public static void m2(AnyType[] args) { println(strcat("****** WE'VE ENTERED A METHOD ON CLASS: ", name(probeClass()))); println(strcat("****** WE'VE ENTERED METHOD: ", probeMethod())); } /** * ONEXIT TRACEPOINT. CALLED WHEN A BTRACE METHOD CALLS EXIT(INT). */ @OnExit public static void onexit(int code) { println("****** THE BTRACE PROGRAM IS EXITING."); } /** * LOW MEMORY TRACE POINT. */ @OnLowMemory( pool = "Tenured Gen",

Slide 57

Slide 57 text

println(strcat("****** WE'VE ENTERED A METHOD ON CLASS: ", name(probeClass()))); println(strcat("****** WE'VE ENTERED METHOD: ", probeMethod())); } /** * ONEXIT TRACEPOINT. CALLED WHEN A BTRACE METHOD CALLS EXIT(INT). */ @OnExit public static void onexit(int code) { println("****** THE BTRACE PROGRAM IS EXITING."); } /** * LOW MEMORY TRACE POINT. */ @OnLowMemory( pool = "Tenured Gen", threshold=58720250 ) public static void onLowMem(MemoryUsage mu) { println("******"); println(mu); } /** * MEMORY HISTOGRAM TRACE POINT. */ private static Map histo = newHashMap();

Slide 58

Slide 58 text

* ONEXIT TRACEPOINT. CALLED WHEN A BTRACE METHOD CALLS EXIT(INT). */ @OnExit public static void onexit(int code) { println("****** THE BTRACE PROGRAM IS EXITING."); } /** * LOW MEMORY TRACE POINT. */ @OnLowMemory( pool = "Tenured Gen", threshold=58720250 ) public static void onLowMem(MemoryUsage mu) { println("******"); println(mu); } /** * MEMORY HISTOGRAM TRACE POINT. */ private static Map histo = newHashMap(); @OnTimer(4000) public static void print() { if (size(histo) != 0) { printNumberMap(strcat("******", "Component Histogram"), histo); } } }

Slide 59

Slide 59 text

*/ @OnLowMemory( pool = "Tenured Gen", threshold=58720250 ) public static void onLowMem(MemoryUsage mu) { println("******"); println(mu); } /** * MEMORY HISTOGRAM TRACE POINT. */ private static Map histo = newHashMap(); @OnTimer(4000) public static void print() { if (size(histo) != 0) { printNumberMap(strcat("******", "Component Histogram"), histo); } } }

Slide 60

Slide 60 text

No content

Slide 61

Slide 61 text

No content

Slide 62

Slide 62 text

No content

Slide 63

Slide 63 text

➡Gradle ➡Jenkins ➡Sonar ➡Maven 3 ➡VisualVM ➡BTrace

Slide 64

Slide 64 text

➡VisualVM

Slide 65

Slide 65 text

http://visualvm.java.net/

Slide 66

Slide 66 text

No content

Slide 67

Slide 67 text

No content

Slide 68

Slide 68 text

➡Java 1.4 through Java 7 support ➡Included in JDK 6u7 > Virtual Machine Metrics

Slide 69

Slide 69 text

No content

Slide 70

Slide 70 text

No content

Slide 71

Slide 71 text

Build Lifecycle Craftsmanship at the Transylvania JUG by Matthew McCullough