Ruby Plugins for Jenkins

13,543 views

Published on

After almost a year of slow but steady development, the time is soon approaching when you will be able to start writing Jenkins plugins armed with nothing but a simple JRuby environment.

To illustrate exactly what this means, we'll study the anatomy of a Ruby plugin, how it works at runtime, and walk through the creation, testing and deploying of an example using nothing put 100% pure Ruby.

Finally, beyond the mechanical, we'll discuss why this effort is important for the entire Jenkins community, not just the part of the community that uses Ruby.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
13,543
On SlideShare
0
From Embeds
0
Number of Embeds
7,177
Actions
Shares
0
Downloads
35
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Ruby Plugins for Jenkins

    1. 1. Ruby PluginsYou’ve come a long way baby
    2. 2. Charles Lowell• cowboyd@github• cowboyd@twitter• cowboyd@jenkins-ci
    3. 3. What the hell am I doing here?
    4. 4. User Interfaces
    5. 5. Lots of Ruby
    6. 6. Lot’s of JavaScript
    7. 7. Lot’s of Java/C++ + therubyracer, therubyrhino
    8. 8. Bugs!• Ruby versions (1.8.6,1.8.7,1.9.2, rbx, jruby, ...)• CC/libc version• OS (OSX, ubuntu, rhel)
    9. 9. HELL
    10. 10. We need a DIESEL CI solution.
    11. 11. Fun Fact: Weactually designed this logo
    12. 12. jenkins.rb 0.1• rubygem containing jenkins.war• utility for starting a test jenkins server
    13. 13. Dr Nic • Saw my lightning talk • went hog wild on the gem
    14. 14. jenkins.rb 1.0 • create/list/update jobs from CLI • create sinatra/rails jobs in one go • huge arsenal of Jenkins Macros
    15. 15. Eventually, we wanted more than macros.
    16. 16. Ruby PluginsExtend Jenkins with nothing but Ruby
    17. 17. We need a plan
    18. 18. How ‘bout you do it?We need a plan
    19. 19. Mad Propers! Kohsuke Kawaguchi
    20. 20. Ruby Plugins See them in action
    21. 21. What does it mean fora plugin to be in Ruby?
    22. 22. Language Ruby. Duh.
    23. 23. APImust “feel” like Ruby, not just scripting Java.
    24. 24. Example“Push” vs “Pull” configuration
    25. 25. Java
    26. 26. Scripted Java
    27. 27. Ruby
    28. 28. ToolsThey’ve gotta be Ruby too.
    29. 29. -Maven -javac• Rake - build and assembly• Bundler - dependency management• jpi - development tools
    30. 30. TestingYup, also Ruby
    31. 31. No solid answers yet• unit testing?• mocking builds, jobs, projects?• fixtures for builds, jobs, projects?
    32. 32. How it works
    33. 33. How it works Plugin.java
    34. 34. Plugin.java Jenkins •Ruby Runtime Plugin Small as can jenkins-ruby-api possibly be Ruby Plugin A bundled gems • plugin ruby code 5 small classes Ruby Plugin B ..... • will not instantiate extension points jenkins-ruby-api Ruby Plugin C bundled gems plugin ruby code
    35. 35. Plugin.java Jenkins •Ruby Runtime Plugin every plugin gets its own scripting JRuby Ruby Plugin A container Ruby Plugin B ..... • isolation + JRuby backwards Ruby Plugin C compatibility
    36. 36. How it works Plugin.rb
    37. 37. Plugin.rb Jenkins •Ruby Runtime Plugin own copy of API JRuby ruby API Ruby Plugin A bundled gems extension points • own copy of gems Ruby Plugin B ..... • Ruby extension JRuby points detected Ruby Plugin C ruby API bundled gems and auto-loaded extension points
    38. 38. Plugin.rb JenkinsRuby Runtime Plugin JRuby • Library code is free to vary from ruby API 1.1 Ruby Plugin A json 1.5, nokogiri 1.8 extension points plugin to plugin • Ruby Plugin B ..... This includes the plugin API! JRuby ruby API 1.3rc5 Ruby Plugin C json 1.6.4 extension points
    39. 39. Plugin.rb (API)• Builder - implement build steps• Publisher - run build steps after build complete• BuildWrapper - decorate a build with setup/teardown
    40. 40. Plugin.rb (API)• All Ruby extension points are Plain old Ruby objects (TM)• Plugin maintains two-way list of proxies to support this
    41. 41. Plugin.rb (API) Jenkins Ruby Plugin • All Java Objects Java Ruby proxied •hudson.model.AbstractBuild Jenkins::Model::Build All Ruby Objects wrapped • Java Ruby referential hudson.tasks.Builder Jenkins::Tasks::Builder integrity Proxies
    42. 42. More Fundamental than Ruby
    43. 43. Supporting Features• Flexible Descriptor registration• Pluggable persistence via JRuby Xstream• Stapler support for pluggable templating
    44. 44. Supporting FeaturesMore plugin-provided metadata. Less Java reflection.
    45. 45. What works for Ruby... works for Python
    46. 46. What works for Ruby... works for Python (in theory)
    47. 47. What works for Ruby... works for Python (in theory) but not as magnificently :)
    48. 48. What works for Ruby... works for JavaScript
    49. 49. What works for Ruby... works for Clojure
    50. 50. What works for Ruby... works for Fantom
    51. 51. What works for Ruby... works for X
    52. 52. 400+ Plugins to date
    53. 53. 4,000 plugins
    54. 54. 4,000 plugins sooner than you think?
    55. 55. Applications?
    56. 56. Frameworks?
    57. 57. gem install jenkins-plugin
    58. 58. Thanks!• cowboyd@github• cowboyd@twitter• cowboyd@jenkins-ci

    ×