Created
June 7, 2012 13:40
-
-
Save yyuu/2888846 to your computer and use it in GitHub Desktop.
a capistrano recipe to install rubies using rbenv (for debian/ubuntu)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| namespace(:rbenv) { | |
| _cset(:rbenv_path) { | |
| capture("echo $HOME/.rbenv").chomp() | |
| } | |
| _cset(:rbenv_bin) { | |
| File.join(rbenv_path, 'bin', 'rbenv') | |
| } | |
| _cset(:rbenv_cmd) { # to use custom rbenv_path, we use `env` instead of cap's default_environment. | |
| path = "#{rbenv_path}/bin:#{rbenv_path}/shims:$PATH" | |
| "env PATH=#{path.dump()} #{rbenv_bin}" | |
| } | |
| _cset(:rbenv_repository, 'git://github.com/sstephenson/rbenv.git') | |
| _cset(:rbenv_branch, 'master') | |
| _cset(:rbenv_use_plugins, true) | |
| _cset(:rbenv_plugins, { | |
| 'ruby-build' => 'git://github.com/sstephenson/ruby-build.git', | |
| }) | |
| _cset(:rbenv_plugins_options, { | |
| 'ruby-build' => {:branch => 'master'}, | |
| }) | |
| _cset(:rbenv_plugins_path) { | |
| File.join(rbenv_path, 'plugins') | |
| } | |
| _cset(:rbenv_git) { | |
| if scm == :git | |
| if fetch(:scm_command, :default) == :default | |
| fetch(:git, 'git') | |
| else | |
| scm_command | |
| end | |
| else | |
| fetch(:git, 'git') | |
| end | |
| } | |
| _cset(:rbenv_ruby_version, '1.9.3-p194') | |
| _cset(:rbenv_ruby_dependencies, %w(build-essential libreadline6-dev zlib1g-dev libssl-dev bison)) | |
| _cset(:rbenv_use_bundler, true) | |
| set(:bundle_cmd) { # override bundle_cmd in "bundler/capistrano" | |
| rbenv_use_bundler ? "#{rbenv_cmd} exec bundle" : 'bundle' | |
| } | |
| desc("Setup rbenv.") | |
| task(:setup, :except => { :no_release => true }) { | |
| dependencies | |
| update | |
| configure | |
| build | |
| setup_bundler if rbenv_use_bundler | |
| } | |
| after 'deploy:setup', 'rbenv:setup' | |
| def _rbenv_sync(repository, destination, revision) | |
| git = rbenv_git | |
| remote = 'origin' | |
| verbose = "-q" | |
| run((<<-E).gsub(/\s+/, ' ')) | |
| if test -d #{destination}; then | |
| cd #{destination} && #{git} fetch #{verbose} #{remote} && #{git} fetch --tags #{verbose} #{remote} && #{git} merge #{verbose} #{remote}/#{revision}; | |
| else | |
| #{git} clone #{verbose} #{repository} #{destination} && cd #{destination} && #{git} checkout #{verbose} #{revision}; | |
| fi; | |
| E | |
| end | |
| desc("Update rbenv installation.") | |
| task(:update, :except => { :no_release => true }) { | |
| _rbenv_sync(rbenv_repository, rbenv_path, rbenv_branch) | |
| plugins.update if rbenv_use_plugins | |
| } | |
| desc("Purge rbenv.") | |
| task(:purge, :except => { :no_release => true }) { | |
| run("rm -rf #{rbenv_path}") | |
| } | |
| namespace(:plugins) { | |
| desc("Update rbenv plugins.") | |
| task(:update, :except => { :no_release => true }) { | |
| rbenv_plugins.each { |name, repository| | |
| options = ( rbenv_plugins_options[name] || {}) | |
| branch = ( options[:branch] || 'master' ) | |
| _rbenv_sync(repository, File.join(rbenv_plugins_path, name), branch) | |
| } | |
| } | |
| } | |
| task(:configure, :except => { :no_release => true }) { | |
| # nop | |
| } | |
| task(:dependencies, :except => { :no_release => true }) { | |
| unless rbenv_ruby_dependencies.empty? # dpkg-query is faster than apt-get on querying if packages are installed | |
| run("dpkg-query --show #{rbenv_ruby_dependencies.join(' ')} 2>/dev/null || #{sudo} apt-get -y install #{rbenv_ruby_dependencies.join(' ')}") | |
| end | |
| } | |
| desc("Build ruby within rbenv.") | |
| task(:build, :except => { :no_release => true }) { | |
| ruby = fetch(:rbenv_ruby_cmd, 'ruby') | |
| run("#{rbenv_cmd} whence #{ruby} | grep -q #{rbenv_ruby_version} || #{rbenv_cmd} install #{rbenv_ruby_version}") | |
| run("#{rbenv_cmd} global #{rbenv_ruby_version} && #{rbenv_cmd} exec #{ruby} --version") | |
| } | |
| _cset(:rbenv_bundler_gem, 'bundler') | |
| task(:setup_bundler, :except => { :no_release => true }) { | |
| gem = "#{rbenv_cmd} exec gem" | |
| if v = fetch(:rbenv_bundler_version, nil) | |
| q = "-n #{rbenv_bundler_gem} -v #{v}" | |
| f = "grep #{rbenv_bundler_gem} | grep #{v}" | |
| i = "-v #{v} #{rbenv_bundler_gem}" | |
| else | |
| q = "-n #{rbenv_bundler_gem}" | |
| f = "grep #{rbenv_bundler_gem}" | |
| i = "#{rbenv_bundler_gem}" | |
| end | |
| run("unset -v GEM_HOME; #{gem} query #{q} 2>/dev/null | #{f} || #{gem} install #{i}") | |
| run("#{rbenv_cmd} rehash && #{bundle_cmd} version") | |
| } | |
| } | |
| # vim:set ft=ruby ts=2 sw=2 : |
Author
Author
stopped using default_environment to enable custom rbenv_path.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
current impl cannot use custom rbenv_path.