$30 off During Our Annual Pro Sale. View Details »

Carton at London Perl Workshop 2013

Carton at London Perl Workshop 2013

Tatsuhiko Miyagawa

November 30, 2013
Tweet

More Decks by Tatsuhiko Miyagawa

Other Decks in Technology

Transcript

  1. Carton
    managing CPAN dependencies
    Tatsuhiko Miyagawa
    @miyagawa
    London Perl Workshop 2013
    Saturday, November 30, 13

    View Slide

  2. Me
    • Tatsuhiko Miyagawa
    • Lives in San Francisco
    • {github,twitter,CPAN}/miyagawa
    Saturday, November 30, 13

    View Slide

  3. Thank You!
    Saturday, November 30, 13

    View Slide

  4. Managing CPAN
    Dependencies
    Saturday, November 30, 13

    View Slide

  5. How many CPAN modules
    your app depends on?
    Saturday, November 30, 13

    View Slide

  6. When is the last time
    upgrading a CPAN
    module broke your app?
    Saturday, November 30, 13

    View Slide

  7. Case Study:
    Web App Development
    Saturday, November 30, 13

    View Slide

  8. You’re writing a new web app
    using as many CPAN modules.
    Saturday, November 30, 13

    View Slide

  9. Get them from CPAN,
    install on your machine.
    Saturday, November 30, 13

    View Slide

  10. john@local>  cpanm  Web::Framework
    installed  LWP-­‐5.912
    installed  Plack-­‐0.9980
    installed  Web-­‐Framework-­‐1.10
    Saturday, November 30, 13

    View Slide

  11. Test it...
    Saturday, November 30, 13

    View Slide

  12. Works? Ship it!
    Saturday, November 30, 13

    View Slide

  13. What if ...
    Saturday, November 30, 13

    View Slide

  14. • Jul 2nd: Started working on project
    • using Web::Framework 1.1
    • Jul 9th: Finished version 1.0
    • Jul 10-15th: internal beta, QA
    • Jul 16th: Deploy to the production
    Saturday, November 30, 13

    View Slide

  15. • Jul 2nd: Started working on project
    • using Web::Framework 1.1
    • Jul 9th: Finished version 1.0
    • Jul 10-15th: internal beta, QA
    • Jul 15th: Web::Framework 1.2 is released
    • Jul 16th: Deploy to the cloud/production
    Saturday, November 30, 13

    View Slide

  16. root@prod>  cpanm  Web::Framework
    installed  LWP-­‐5.912
    installed  Plack-­‐0.9980
    installed  Web-­‐Framework-­‐1.20
    Saturday, November 30, 13

    View Slide

  17. Web::Framework 1.2
    API changes!
    Saturday, November 30, 13

    View Slide

  18. Saturday, November 30, 13

    View Slide

  19. “Upgrading CPAN modules
    broke my app”
    Saturday, November 30, 13

    View Slide

  20. Dependencies are
    part of your app.
    Saturday, November 30, 13

    View Slide

  21. a solution
    cpanm 1.6
    Saturday, November 30, 13

    View Slide

  22. >  cpanm  Web::[email protected]
    installed  Web-­‐Framework-­‐1.10
    Saturday, November 30, 13

    View Slide

  23. >  cpanm  Web::Framework~">=  1.0,  <  1.2"
    installed  Web-­‐Framework-­‐1.19
    Saturday, November 30, 13

    View Slide

  24. ♥ MetaCPAN
    Saturday, November 30, 13

    View Slide

  25. a solution
    cpanfile + cpanm 1.6
    Saturday, November 30, 13

    View Slide

  26. >  cat  cpanfile
    requires  'Web::Framework',  '==  1.10';
    >  cpanm  -­‐-­‐installdeps  .
    installed  Web-­‐Framework-­‐1.10
    Saturday, November 30, 13

    View Slide

  27. cpanfile
    DSL to describe prereqs
    Saturday, November 30, 13

    View Slide

  28. requires  'Catalyst',  '5.8000';  
    recommends  'JSON::XS',  '2.0';
    on  'test'  =>  sub  {
       requires  'Test::More',  '>=  0.96'
    };
    on  'develop'  =>  sub  {
       recommends  'Devel::NYTProf';
    };
    feature  'sqlite'  =>  sub  {
       requires  'DBD::SQLite';
    };
    Saturday, November 30, 13

    View Slide

  29. inspired by:
    gemfile(5)
    Saturday, November 30, 13

    View Slide

  30. Compatible to:
    Module::Install(::DSL)
    Saturday, November 30, 13

    View Slide

  31. Converted to:
    CPAN::Meta::Prereqs
    Saturday, November 30, 13

    View Slide

  32. Toolset
    Module::CPANfile
    Module::Install::CPANfile
    Dist::Zilla plugins
    Saturday, November 30, 13

    View Slide

  33. Supported by
    dzil, Milla & cpanm 1.6
    Saturday, November 30, 13

    View Slide

  34. cpanfile + cpanm
    • Simple
    • Yet powerful and flexible way to describe
    dependencies and version requirements
    • Version control cpanfile
    Saturday, November 30, 13

    View Slide

  35. caveats
    • Locking each dependency with specific
    version is tedious work
    • Can only lock direct dependencies
    • MetaCPAN as SPOF
    • No easy/reliable way to rollback
    Saturday, November 30, 13

    View Slide

  36. Many other solutions
    Needs servers, Needs databases
    Too simple, Too complicated, etc.
    Saturday, November 30, 13

    View Slide

  37. the new Solution
    Saturday, November 30, 13

    View Slide

  38. Carton
    https://github.com/miyagawa/carton
    Saturday, November 30, 13

    View Slide

  39. Inspired by...
    Saturday, November 30, 13

    View Slide

  40. Saturday, November 30, 13

    View Slide

  41. Basic idea:
    Describe CPAN dependencies
    snapshot tarball pathnames
    Saturday, November 30, 13

    View Slide

  42. Built on top of:
    cpanfile + cpanm 1.7
    Saturday, November 30, 13

    View Slide

  43. • App-specific local environment
    • Fast and safe install with caches
    • Dep-tree analysis, including versions
    • Freezing module versions
    • Conservative updates
    • Easy Redeployment, Rollback
    • Single-file, VCS friendly
    Saturday, November 30, 13

    View Slide

  44. Local perl environment
    Using local::lib and cpanm -L
    Each app has an isolated local library path
    Saturday, November 30, 13

    View Slide

  45. Fast and safe install
    Saves MYMETA.json and install meta info
    Saturday, November 30, 13

    View Slide

  46. Dep tree analysis
    Rebuild the dependency tree from snapshot
    Checks if anything is missing/superfluous
    Saturday, November 30, 13

    View Slide

  47. Freezing versions
    Versions are saved in snapshots
    including dependencies
    Saturday, November 30, 13

    View Slide

  48. Easy Redeployment
    Reinstall exactly the same set of modules
    on another prod/development machines.
    Saturday, November 30, 13

    View Slide

  49. Conservative Update
    Modules won't be upgraded
    unless it is required, or manually updated.
    Saturday, November 30, 13

    View Slide

  50. Single-file, VCS friendly
    You can add cpanfile.snapshot to git
    update whenever you update modules
    "Dependencies are part of your app."
    Saturday, November 30, 13

    View Slide

  51. Safe and easy rollback
    revert the lock file and redeploy
    Saturday, November 30, 13

    View Slide

  52. DEMO
    Saturday, November 30, 13

    View Slide

  53. Deployment
    with Carton
    Saturday, November 30, 13

    View Slide

  54.  @local>  carton  install
     @local>  git  commit  cpanfile.snapshot
     @local>  git  push
    @remote>  carton  install  -­‐-­‐deployment
    @remote>  carton  exec  plackup  ...
    Saturday, November 30, 13

    View Slide

  55. Example:
    github.com/miyagawa/cpanmetadb-perl
    capistrano, Server::Starter,
    carton, plackup (twiggy)
    Saturday, November 30, 13

    View Slide

  56. PaaS/Cloud
    github.com/miyagawa/heroku-buildpack-perl
    Saturday, November 30, 13

    View Slide

  57. Saturday, November 30, 13

    View Slide

  58. http://weblog.bulknews.net
    Saturday, November 30, 13

    View Slide

  59. Support to come!
    Dokku, DotCloud, Travis CI,
    Cloud Foundry etc.
    Saturday, November 30, 13

    View Slide

  60. carton 1.0
    on CPAN
    Saturday, November 30, 13

    View Slide

  61. >  cpanm  Carton
    Saturday, November 30, 13

    View Slide

  62. Preview:
    next major releases
    Saturday, November 30, 13

    View Slide

  63. cpanm 1.8
    git (+ any URL)
    support in index
    Saturday, November 30, 13

    View Slide

  64. cpanfile 1.1
    git syntax support
    Saturday, November 30, 13

    View Slide

  65. requires  'Plack',  '1.0000',
       git  =>  'git://github.com/plack/Plack.git',
       ref  =>  'devel';
    carton 1.1
    Saturday, November 30, 13

    View Slide

  66. requires  'Plack',  '1.0011',
       dist  =>  'MIYAGAWA/Plack-­‐1.0011.tar.gz';
    carton 1.1
    Saturday, November 30, 13

    View Slide

  67. requires  'Plack',  '1.0011',
       dist  =>  'http://darkpan/Plack-­‐1.tar.gz';
    carton 1.1
    Saturday, November 30, 13

    View Slide

  68. (demo)
    Saturday, November 30, 13

    View Slide

  69. cpanm 1.8
    • Rewrite internals
    • Backend API
    • Plugin support
    • CPAN Testers support (via plugins)
    Saturday, November 30, 13

    View Slide

  70. carton 1.1
    • binstubs
    • configure args/hints support
    • safe exec on development
    • remember options (--path etc.)
    Saturday, November 30, 13

    View Slide

  71. github.com/miyagawa/carton
    irc.perl.org #carton
    Saturday, November 30, 13

    View Slide

  72. speakerdeck.com
    /miyagawa
    Saturday, November 30, 13

    View Slide

  73. gum.co/BmXz
    Saturday, November 30, 13

    View Slide

  74. Questions?
    Saturday, November 30, 13

    View Slide