Your SlideShare is downloading. ×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Continuous Deployment of Clojure Web Applications


Published on

Slides from my talk at the first Clojure Conj in October, 2010. Accompanying code and a screencast may be found @

Slides from my talk at the first Clojure Conj in October, 2010. Accompanying code and a screencast may be found @

Published in: Automotive, Technology
  • Be the first to comment

No Downloads
Total Views
On Slideshare
From Embeds
Number of Embeds
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

No notes for slide


  • 1. Continuous Deployment of Clojure Web Applications Chas Emerick @cemerick,
  • 2. ego I am: • A Clojure programmer of > 2.5 years • Coauthor of the forthcoming “Clojure Programming” book from O’Reilly • Architect of Docuharvest • Founder of Snowtide Informatics (first (clojure-conj))
  • 3. first principles ⚛ ☺Your Powerful Beauty Your Customers Anything that gets in the way of this happy union is the enemy. (first (clojure-conj))
  • 4. definitional bits & minor opinions • We’re focusing on small- to medium-size deployments today. • You’re (probably) not a special snowflake. Stay close to the herd, and stick to your knitting. • Application deployment is (always?) a people and process problem, not a technology problem. (first (clojure-conj))
  • 5. choosing a path “system administration” Unrepeatable, manual, undocumented; the high priesthoods oh god no (first (clojure-conj))
  • 6. choosing a path (“roll your own”) Even the most clever spike is not a solution. “Emacs + SLIME + Clojure running in GNU Screen; all requests handled by Apache; mod_proxy sends them to the appropriate Jetty instance / servlet.” – Brian Carper @ clojure-websites “Feel free to say: ‘duct tape and string’ and ‘You're doing it wrong’.” – Brian Carper (private email) (first (clojure-conj))
  • 7. obligatory yak photo (first (clojure-conj))
  • 8. choosing a path community? standards sanity⇒ ⇒ • The Platonic ideal: vertically-integrated platforms, e.g. GAE, Heroku, Azure, VMWare/SpringSource platform • Dominant tools: Chef, Puppet, et al. • Clojure-centric tools: – jclouds: generic “cloud” API, provisioning – Pallet: declarative, composable configuration definition & management (first (clojure-conj))
  • 9. interlude: deployment existentialism The complexity that is visited upon us when writing software is enough; in an ideal world, we shouldn’t have to develop all this extraneous expertise in how to build, package, and deploy that software as well. There are a few things in software that I know how to do really well that make me slightly unique, and I wish I could concentrate on those rather than becoming a generalist in this, yet another vector, which is fundamentally a means to an end. History and circumstance seem to be stacked against me at the moment, though. – “…wherein I feel the pain of being a generalist” (first (clojure-conj))
  • 10. hey jclouds! • Meatspace: e.g. compute nodes, storage (local & EBS/SAN), network routing & security, IP allocation, etc • If you had an API to this infrastructurey stuff, you could make it do your bidding • Luckily: jclouds provides exactly this, for multiple cloud providers (first (clojure-conj))
  • 11. howdy pallet! • Pallet:crates :: chef:recipes • Include recipes via chef-solo if you like • Beautiful declarative expression of provisioning and configuration operations • Simple, flexible model: lift/converge/phases/tags/prefix (first (clojure-conj))
  • 12. pallet “Hello World” (def service (jcompute/compute-service "ec2” “AWS_ID” “AWS_SECRET_KEY” :ssh :log4j)) (pallet.core/defnode appserver {:os-family :ubuntu :os-description-matches "10.10" :min-ram 1024 :inbound-ports [22 8080]} :bootstrap (pallet.resource/phase (admin/automated-admin-user)) :configure (pallet.resource/phase ( :openjdk) (tomcat/tomcat)) :deploy (pallet.resource/phase (web-deploy warfile-path :port 8080))) (pallet.core/converge {appserver 1} :compute service :prefix “demo” :phase [:deploy]) (first (clojure-conj))
  • 13. get thee a .war file • Allows you to deploy to any Java app server & platforms like Google App Engine and the Spring/VMWare platform • Seriously, it’s not difficult: – Maven: baked in war packaging – Leiningen/Cake: leiningen-war plugin – Gradle, Buildr, rake: Surely simple enough (first (clojure-conj))
  • 14. app servers
  • 15. embedded Jetty/Grizzly • Great for experimentation and throughout development, e.g. jetty directly supported in ring/compojure • In production environments: roll-your-own that buys you nothing, therefore unnecessarily evil. (first (clojure-conj))
  • 16. Tomcat, JBoss, Glassfish et al. • Huge communities guarantee: • tool integration (e.g. profilers) • tons of experienced devs • books • monitoring and management support • resource management (e.g. DB connection pools) • clustering (e.g. Shoal) • commercial/paid support • You will eventually need these; give yourself the chance to take advantage of these resources (first (clojure-conj))
  • 17. now for the (continuous) part (first (clojure-conj))
  • 18. automate or die (first (clojure-conj))
  • 19. links Resources that will eventually be available: Slides: linked from my blog @ Code: Credits: • Hugo Duncan et al. • Adrian Cole et al. • ClojureNYC and Western Mass Dev Group attendees that suffered through earlier revs of this talk (first (clojure-conj))
  • 20. Thank You! I too am not a bit tamed—I too am untranslatable; I sound my barbaric yawp over the roofs of the world. The last scud of day holds back for me; It flings my likeness after the rest, and true as any, on the shadow’d wilds; It coaxes me to the vapor and the dusk. I depart as air—I shake my white locks at the runaway sun; I effuse my flesh in eddies, and drift it in lacy jags. I bequeathe myself to the dirt, to grow from the grass I love; If you want me again, look for me under your boot-soles. You will hardly know who I am, or what I mean; But I shall be good health to you nevertheless, And filter and fibre your blood. Failing to fetch me at first, keep encouraged; Missing me one place, search another; I stop somewhere, waiting for you. — Walt Whitman, Leaves of Grass (first (clojure-conj))