JavaScript + Jenkins = Winning!

55
© 2011 @eriwen

description

How to build and analyze Javascript projects and integrate that with Jenkins CI

Transcript of JavaScript + Jenkins = Winning!

Page 1: JavaScript + Jenkins = Winning!

© 2011 @eriwen

Page 2: JavaScript + Jenkins = Winning!

Blog: eriwen.com

Twitter: @eriwen

Code: git.io/eric

Eric Wendelin

Page 3: JavaScript + Jenkins = Winning!

(╯°□°)╯( ɐpuǝƃV

• Tools that help your JS not suck

• How to create a build for your client-side code

• Automation with Jenkins

• The hard part

• Unicorns

Page 4: JavaScript + Jenkins = Winning!

The Situation

Page 5: JavaScript + Jenkins = Winning!

Programmers are expensive

Must prevent them from doing things below their pay grade

Page 6: JavaScript + Jenkins = Winning!

How do you do that?

Automate tasks that don't require mental participation

Page 7: JavaScript + Jenkins = Winning!

Programmers are clever

Must force them to write code for the next engineer

Page 8: JavaScript + Jenkins = Winning!

Better for the next engineer?

Must enforce conventions that make the code more

understandable

Page 9: JavaScript + Jenkins = Winning!

?

Page 10: JavaScript + Jenkins = Winning!

First things first

We need automation tools

Page 11: JavaScript + Jenkins = Winning!

Static Analysis

Page 12: JavaScript + Jenkins = Winning!
Page 13: JavaScript + Jenkins = Winning!

JSHint

jshint file.js --config config.json

jshint.org

Page 14: JavaScript + Jenkins = Winning!

CSSLint

csslint --rules=rule,rule2 file.css

csslint.net

Page 15: JavaScript + Jenkins = Winning!

Testing

Page 16: JavaScript + Jenkins = Winning!

Unit-testing

• Jasmine (pivotal.github.com/jasmine)

• QUnit (docs.jquery.com/QUnit)

• YUI Test (yuilibrary.com/yui/docs/test)

• Mocha (visionmedia.github.com/mocha)

• Lots of others...

Page 17: JavaScript + Jenkins = Winning!

PhantomJS

phantomjs your-runner.js file.html

phantomjs.org

Page 18: JavaScript + Jenkins = Winning!

Xvfb

Page 19: JavaScript + Jenkins = Winning!

JsTestDriver

java -jar JsTestDriver.jar --tests all

code.google.com/p/js-test-driver/

Page 20: JavaScript + Jenkins = Winning!

Functional testing

• Selenium (seleniumhq.org)

• CasperJS (github.com/n1k0/casperjs)

• zombie.js (zombie.labnotes.org)

Page 21: JavaScript + Jenkins = Winning!

Documentation

Page 22: JavaScript + Jenkins = Winning!

jsduck

jsduck src/js --output target/docs

github.com/senchalabs/jsduck

Page 23: JavaScript + Jenkins = Winning!

Page Speed

Page 24: JavaScript + Jenkins = Winning!

Closure Compiler

java -jar compiler.jar --js file.js --js_output_file file.min.js

code.google.com/closure/compiler

Page 25: JavaScript + Jenkins = Winning!

YUI Compressor

java -jar yuicompressor.jar -o '.css$:-min.css' *.css

developer.yahoo.com/yui/compressor

Page 26: JavaScript + Jenkins = Winning!

Combine and gzip

cat file1.js file2.js >> combined.js

gzip combined.js

mv combined.js{.gz,}

Page 27: JavaScript + Jenkins = Winning!

?

Page 28: JavaScript + Jenkins = Winning!

The Build

Page 29: JavaScript + Jenkins = Winning!

Build Steps

• Static Analysis

• File Optimization (for production)

• Automated Testing

• Documentation

• Report Results

Page 30: JavaScript + Jenkins = Winning!

Gradle

Page 31: JavaScript + Jenkins = Winning!

Don't have a build?

Page 33: JavaScript + Jenkins = Winning!

Introducing the Gradle Web Suite

Page 34: JavaScript + Jenkins = Winning!
Page 35: JavaScript + Jenkins = Winning!
Page 36: JavaScript + Jenkins = Winning!
Page 37: JavaScript + Jenkins = Winning!
Page 38: JavaScript + Jenkins = Winning!
Page 39: JavaScript + Jenkins = Winning!
Page 40: JavaScript + Jenkins = Winning!
Page 41: JavaScript + Jenkins = Winning!

git.io/gradlejs git.io/gradlecssgit.io/gradlehtml

Page 42: JavaScript + Jenkins = Winning!

jenkins-ci.org

Page 43: JavaScript + Jenkins = Winning!

Crazy Simple Setup

wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war

java -jar jenkins.war

Page 44: JavaScript + Jenkins = Winning!

Source Control Plugins

• Git

• Mercurial

• Bazaar

• Subversion

• CVS

• Lots more...

Page 45: JavaScript + Jenkins = Winning!

Build System Plugins

• Gradle

• Maven

• Ant

• Rake

• Lots more...

Page 46: JavaScript + Jenkins = Winning!

Runs pretty much everything

• Ruby

• Python

• NodeJS

• Groovy

• Shell

• Lots more...

Page 47: JavaScript + Jenkins = Winning!

Build Health Plugins

• Violations Plugin

• Selenium Plugin

• Cobertura Plugin

• Task Scanner Plugin

• ...and, of course, Chuck Norris Plugin

Page 48: JavaScript + Jenkins = Winning!

The really hard part

Page 49: JavaScript + Jenkins = Winning!

5 Stages of JS CI• No build server

• Pulls from source control and runs metrics

• Runs unit tests and fails build if necessary. One button push to staging/production env

• Unit and acceptance tests run. Metrics affect build stability

• Code deployed on every push that passes the build

Page 50: JavaScript + Jenkins = Winning!

Helpful Tweeters

@ariyahidayat works on #phantomjs

@gseguin helped me with QUnit/Phantom

@builddoctor general CI advocate/guru

@jfroma does cool #jsci on Windows

@jamescarr could've given this talk well

Page 51: JavaScript + Jenkins = Winning!

One more thing...

Page 52: JavaScript + Jenkins = Winning!
Page 53: JavaScript + Jenkins = Winning!

git.io/ltc

LCOV to Cobertura converter

Page 54: JavaScript + Jenkins = Winning!