Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Dependencies Testing With Appraisal And Bundler

Dependencies Testing With Appraisal And Bundler

Revised talk after given at RubyKaigi 2013 (https://speakerdeck.com/sikachu/you-have-to-test-multiple-versions-of-your-gems-dependencies-you-used-appraisal-its-super-affective)

Presented at RedDotRubyConf 2013 on June 8, 2013.

Prem Sichanugrist

June 08, 2013
Tweet

More Decks by Prem Sichanugrist

Other Decks in Programming

Transcript

  1. Dependencies Testing
    With Appraisal And
    Bundler

    View Slide

  2. Prem Sichanugrist
    @sikachu
    /sikachu

    View Slide

  3. View Slide

  4. View Slide

  5. View Slide

  6. View Slide

  7. View Slide

  8. REDDOT
    Promo code:
    $49 off first month of Prime
    http://learn.thoughtbot.com

    View Slide

  9. View Slide

  10. 2 hours by x

    View Slide

  11. Closest Ruby conference
    to my home™

    View Slide

  12. U JELLY?

    View Slide

  13. Appraisal

    View Slide

  14. I use a gem called “Appraisal” to test my
    gems against multiple versions of its
    dependencies. You should give it a try!
    #RDRC

    View Slide

  15. I use a gem called “Appraisal” to test my
    gems against multiple versions of its
    dependencies. You should give it a try!
    #RDRC
    http://git.io/i-love-appraisal

    View Slide

  16. View Slide

  17. Published your gem?

    View Slide

  18. Fully tested?

    View Slide

  19. View Slide

  20. Fully tested

    View Slide

  21. add_dependency("activerecord",
    "~> 3.0")

    View Slide

  22. ~>

    View Slide

  23. SemVer
    Semantic Versioning

    View Slide

  24. ~> 3.0

    View Slide

  25. ~> 3.0

    View Slide

  26. ~> 3.0

    View Slide

  27. People don’t follow
    SemVer

    View Slide

  28. People don’t follow
    SemVer
    Rails doesn’t

    View Slide

  29. View Slide

  30. Supported Rails Versions
    • 3.1.x
    • 3.2.x

    View Slide

  31. Supported Rails Versions
    • 3.1.x
    • 3.2.x
    • 4.0.0

    View Slide

  32. Supported Rails Versions
    • 3.0.x
    • 3.1.x
    • 3.2.x
    • 4.0.0

    View Slide

  33. People install Paperclip ...

    View Slide

  34. “This gem doesn’t work”

    View Slide

  35. View Slide

  36. Works with latest version
    !=
    Works with old versions

    View Slide

  37. We need to test with
    multiple versions

    View Slide

  38. How?

    View Slide

  39. Before Bundler

    View Slide

  40. Uninstall and reinstall

    View Slide

  41. $ gem uninstall activesupport
    $ gem install activesupport -v 3.1.12
    $ rake
    $ gem install activesupport
    $ rake

    View Slide

  42. (ů `Д´)ů ~ᵲᴸᵲ

    View Slide

  43. Why was this so bad?
    • Time consuming
    • Can’t test against multiple versions at once
    • Doesn’t handle dependency of dependency
    • Dependency hell
    • $ rm -Rf $GEM_HOME

    View Slide

  44. Test in isolation

    View Slide

  45. Gemset

    View Slide

  46. rbenv
    (with rbenv-gemset)

    View Slide

  47. $ rvm gemset create rails-3-2
    $ rvm gemset use rails-3-2
    $ gem install rails -v 3.2.13
    $ rake
    $ rvm gemset create rails-3-1
    $ rvm gemset use rails-3-1
    $ gem install rails -v 3.1.12
    $ rake
    # ...

    View Slide

  48. $ rvm @rails-3-1,@rails-3-2 do rake

    View Slide

  49. View Slide

  50. This is good, but ...
    • Waste of space; gems are not shared
    • Contributors need to use Ruby manager
    that supports Gemset
    • May need to have bootstrap script to setup
    gemsets

    View Slide

  51. View Slide

  52. Multiple Gemfiles

    View Slide

  53. !"" Gemfile
    !"" rails-3-1.gemfile
    !"" rails-3-2.gemfile
    ...

    View Slide

  54. rails-3-1.gemfile:
    source "https://rubygems.org"
    gem "rails", "~> 3.1.12"
    gem "rspec"

    View Slide

  55. rails-3-2.gemfile:
    source "https://rubygems.org"
    gem "rails", "~> 3.2.13"
    gem "rspec"

    View Slide

  56. $ bundle install --gemfile=rails-3-2.gemfile
    $ export BUNDLE_GEMFILE=rails-3-2.gemfile
    $ bundle exec rake
    $ bundle install --gemfile=rails-3-1.gemfile
    $ export BUNDLE_GEMFILE=rails-3-1.gemfile
    $ bundle exec rake

    View Slide

  57. View Slide

  58. View Slide

  59. Still hard to maintain

    View Slide

  60. Still have to edit
    Gemfiles by hand

    View Slide

  61. Have to specify
    dependencies over and over

    View Slide

  62. Adding new dependency

    View Slide

  63. Adding new dependency
    ... edit multiple files!

    View Slide

  64. No easy way to test all
    the versions at once

    View Slide

  65. View Slide

  66. “There should be a
    better way to do this”

    View Slide

  67. Appraisal

    View Slide

  68. Set multiple versions of
    dependencies in one place

    View Slide

  69. Merge dependencies
    and generate Gemfiles

    View Slide

  70. Setup environment for
    Bundler

    View Slide

  71. View Slide

  72. Demo

    View Slide

  73. Gemfile:
    source "https://rubygems.org"
    gem "rails"
    gem "rspec"
    gem "appraisal"

    View Slide

  74. Gemfile:
    source "https://rubygems.org"
    gemspec

    View Slide

  75. Appraisals:
    appraise "rails-3-1" do
    gem "rails", "~> 3.1.12"
    end
    appraise "rails-3-2" do
    gem "rails", "~> 3.2.13"
    end

    View Slide

  76. Rakefile:
    require "bundler/setup"
    require "appraisal"
    task "test" do
    # ...
    end

    View Slide

  77. Rakefile:
    require "bundler/setup"
    require "appraisal"
    task "test" do
    # ...
    end

    View Slide

  78. # Generate Gemfiles
    $ rake appraisal:gemfiles
    # Install dependencies
    $ rake appraisal:install

    View Slide

  79. # Run "test" task against all versions
    $ rake appraisal test
    # Run "test" task against a single version
    $ rake appraisal:rails-3-1 test

    View Slide

  80. Appraisal
    • Allow you to set dependencies in a single
    place
    • Generate sub-Gemfiles for you
    • Install multiple versions of dependencies
    • Setup Bundler to use the correct version
    of dependency

    View Slide

  81. Setup CI

    View Slide

  82. View Slide

  83. Show that our gems
    are working correctly

    View Slide

  84. Show that our gems are
    working with multiple
    versions of dependency

    View Slide

  85. .travis.yml:
    gemfile:
    - gemfiles/rails_3_1.gemfile
    - gemfiles/rails_3_2.gemfile

    View Slide

  86. View Slide

  87. View Slide

  88. View Slide

  89. Future of Appraisal

    View Slide

  90. View Slide

  91. Current Version:
    0.5.2

    View Slide

  92. 1.0

    View Slide

  93. Support all Gemfile
    directives
    Already in master

    View Slide

  94. Already in master
    • source
    • ruby
    • gem
    • git
    • group
    • gemspec

    View Slide

  95. Already in master
    • source
    • ruby
    • gem
    • git
    • group
    • gemspec
    * Not tested in Appraisals file yet

    View Slide

  96. View Slide

  97. Migrate away from
    Rake task
    W
    ork In Progress

    View Slide

  98. W
    ork In Progress
    # Generate Gemfiles
    $ rake appraisal:gemfiles

    View Slide

  99. W
    ork In Progress
    # Generate Gemfiles
    $ appraisal [generate]

    View Slide

  100. W
    ork In Progress
    # Install dependencies
    $ rake appraisal:install

    View Slide

  101. W
    ork In Progress
    # Install dependencies
    $ appraisal install

    View Slide

  102. W
    ork In Progress
    # Run "test" task against all versions
    $ rake appraisal test

    View Slide

  103. W
    ork In Progress
    # Run "test" task against all versions
    $ appraisal rake test

    View Slide

  104. W
    ork In Progress
    # Run "test" task against a single version
    $ rake appraisal:rails-3-1 test

    View Slide

  105. W
    ork In Progress
    # Run "test" task against a single version
    $ appraisal rails3-1 rake test

    View Slide

  106. W
    ork In Progress
    # Run Ruby test on a single file
    $ appraisal rails3-1 ruby -Itest test/foo_test.rb

    View Slide

  107. Soon™

    View Slide

  108. Remember

    View Slide

  109. View Slide

  110. Test it against multiple
    versions of its dependencies*

    View Slide

  111. Test it against multiple
    versions of its dependencies*
    * by using Appraisal

    View Slide

  112. View Slide

  113. View Slide

  114. Thank you!
    Prem Sichanugrist (@sikachu)
    Tweet your love:
    http://git.io/i-love-appraisal
    http://learn.thoughtbot.com –
    Promo code: REDDOT
    $49 off first month of Prime
    I also have some stickers

    View Slide