rvm - 使用 capistrano 和 rvm-capistrano 进行部署

标签 rvm capistrano rvm-capistrano

我正在使用 Capistrano 引导一个空的 Ubuntu VM。

我有一个安装基本要求的基本配方:

食谱/base.rb

def set_default(name, *args, &block)
  set(name, *args, &block) unless exists?(name)
end

namespace :deploy do
  desc "Install everything onto the server"
  task :install do
    run "#{sudo} apt-get -y update"

    # Common dependencies
    run "#{sudo} apt-get -y install curl git-core build-essential python-software-properties"
    run "#{sudo} apt-get -y install sudo apt-get -y install build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion"

    # Set timezone to UTC
    run "#{sudo} bash -c 'echo UTC > /etc/timezone'"
    run "#{sudo} cp /usr/share/zoneinfo/UTC /etc/localtime"
    run "#{sudo} dpkg-reconfigure -f noninteractive tzdata"
  end
end

我还有一个安装 rvm 的方法。我为此使用 rvm-capistrano gem:

食谱/rvm.rb

set_default(:rvm_ruby_string) { "1.9.3@#{application}" }
set_default(:rvm_install_type, :stable)
set_default(:rvm_type, :user)

require 'rvm/capistrano'

after 'deploy:setup', 'rvm:install_rvm'
after 'deploy:setup', 'rvm:install_ruby'

看起来好像 rvm-capistrano gem 正在修改每个任务的默认 shell 并附加:

rvm_path=$HOME/.rvm/ $HOME/.rvm/bin/rvm-shell '1.9.3@application'

这样做的后果是我的基本配方不再起作用,因为它是在安装 rvm 之前运行的:

cjoudrey (master) app$ cap deploy:install
  * executing `deploy:install'
  * executing "sudo -p 'sudo password: ' apt-get -y update"
    servers: ["33.33.33.10"]
    [33.33.33.10] executing command
    [33.33.33.10] rvm_path=$HOME/.rvm/ $HOME/.rvm/bin/rvm-shell '1.9.3@app' -c 'sudo -p '\''sudo password: '\'' apt-get -y update'
 ** [out :: 33.33.33.10] bash: /home/vagrant/.rvm/bin/rvm-shell: No such file or directory
    command finished in 45ms
failed: "rvm_path=$HOME/.rvm/ $HOME/.rvm/bin/rvm-shell '1.9.3@app' -c 'sudo -p '\\''sudo password: '\\'' apt-get -y update'" on 33.33.33.10
cjoudrey (master) app$

部署.rb

require 'bundler/capistrano'

load 'config/recipes/base'
load 'config/recipes/rvm'
load 'config/recipes/nginx'
load 'config/recipes/mysql'
load 'config/recipes/nodejs'

server '33.33.33.10', :web, :app, :db, primary: true

set :user, 'vagrant'
set :application, 'app'
set :deploy_to, "/home/#{user}/apps/#{application}"
set :deploy_via, :remote_cache
set :use_sudo, false

set :scm, 'git'
set :repository, '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="8ee9e7facee9e7fae6fbeca0ede1e3" rel="noreferrer noopener nofollow">[email protected]</a>:cjoudrey/test.git'
set :branch, 'master'

default_run_options[:pty] = true
ssh_options[:forward_agent] = true
ssh_options[:keys] = `vagrant ssh-config | grep IdentityFile`.split(' ').last

after 'deploy', 'deploy:cleanup'

以前有人遇到过这个问题吗?有没有办法控制 rvm-capistrano 何时修改默认 shell?即有没有办法让它不修改 deploy:install 的默认 shell?

我应该制作自己的 rvm 配方而不是使用 rvm-capistrano 吗?

最佳答案

我遇到了类似的问题,最终在我的deploy.rb中编写了一个disable_rvm_shell函数。我在博客文章中记录了这一点:Capistrano, system wide RVM and creating gemsets as part of deploy:setup .

关于rvm - 使用 capistrano 和 rvm-capistrano 进行部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9944368/

相关文章:

ruby-on-rails-5 - 未找到 Rails list 文件(使用 Capistrano 部署)

python:pythonbrew 和 virtualenv 有什么区别?

ruby-on-rails - Capistrano 3 SSHKit::Runner::ExecuteError: 在主机 [hostname] 上执行时出现异常,代理无法使用请求的身份签署数据

ruby-on-rails - 如何让 Capistrano 3 使用 RVM ruby​​?

ruby-on-rails - 无方法错误 : undefined method `+' for nil:NilClass/ 'additional_paths' [capistrano+webpacker]

ruby-on-rails - 动态站点地图的 Capistrano 3 配方

ruby-on-rails - RVM + Capistrano 失败错误 bug?

ruby - 使用 rvm install ruby​​ 2.0.0 时权限被拒绝的问题

git - 我应该在项目中提交 .rvmrc 文件吗?

mysql - 运行 rails g devise :install generates seg fault in os x 10. 8