有谁知道我怎么能告诉capistrano在我推动的服务器上使用我的默认rvm版本的ruby.它坚持使用系统版本.
它甚至可能吗?
我正在研究使用Capistrano作为通用部署解决方案的可能性."通用",我的意思是不是铁轨.我对我发现的文档的质量不满意,但是,我认为,我不是在考虑那些假设你正在部署rails的文档.所以我会尝试基于一些例子来解决问题,但是我从一开始就面临着一些问题.
我的问题是cap deploy没有足够的信息来做任何事情.重要的是,它缺少我要部署的版本标签,而这具有在命令行上传递.
另一个问题是我如何指定我的git存储库.我们的git服务器在用户的帐户上通过SSH访问,但我不知道如何更改deploy.rb以使用用户的id作为scm URL的一部分.
那么,我该如何完成这些事情呢?
例
我想部署第二个版本的第一个sprint的结果.那被标记在git存储库中r2s1.另外,假设用户"johndoe"负责部署系统.要访问存储库,他必须使用URL johndoe@gitsrv.domain:app.因此,存储库的远程URL取决于用户ID.
获取所需文件的命令行将是:
git clone johndoe@gitsrv.domain:app
cd app
git checkout r2s1
Run Code Online (Sandbox Code Playgroud) 我想通过它部署我的简单rails 4.0应用程序capistrano 3.0.
我使用bundler 1.3.5所以我添加capistrano-bundler gem来集成bundist与capistrano.
我有非常简单的配置(几乎默认):
set :bundle_gemfile, -> { release_path.join('Gemfile') }
set :bundle_dir, -> { shared_path.join('bundle') }
set :bundle_flags, ''
set :bundle_without, %w{test development}.join(' ')
set :bundle_binstubs, -> { shared_path.join('bin') }
set :bundle_roles, :all
Run Code Online (Sandbox Code Playgroud)
当我运行cap staging deploy --trace它失败时:
[50b524bc] Running /usr/bin/env bundle --gemfile /home/webmaster/www/api/releases/20131014144650/Gemfile --path /home/webmaster/www/api/shared/bundle --binstubs /home/webmaster/www/api/shared/bin --without test development on 125.51.3.1
DEBUG [50b144bc] Command: cd /home/webmaster/www/api/releases/20131014144650 && /usr/bin/env bundle --gemfile /home/webmaster/www/api/releases/20131014144650/Gemfile --path /home/webmaster/www/api/shared/bundle --binstubs /home/webmaster/www/api/shared/bin --without test …Run Code Online (Sandbox Code Playgroud) 我有一个Rails应用程序,它使用PostgreSQL作为后端,具有试图模仿生产的证书环境,除了它需要定期重置数据库以进行QA.
当我db:reset在部署期间尝试从Capistrano任务执行时,我收到错误:
ERROR: database "database_name" is being accessed by other users
并且数据库不能作为重置任务的一部分被删除,从而导致部署失败.有没有办法可以从Capistrano重置数据库连接,这样我就可以成功删除表格?从Capistrano任务管道SQL到psql可能会有效,但我想知道是否有更好的方法来解决这个问题.
我正在尝试为Capistrano 3编写一个涉及在当前版本目录中执行"composer install"的任务.它看起来像这样:
namespace :composer do
desc 'Install dependencies with Composer'
task :install do
on roles(:web) do
within release_path do
execute "#{fetch(:composer_command)} install"
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
composer_command 在登台和生产文件中设置 - 在我的特定情况下 php /home/user/composer.phar
由于某种原因,此命令实际上并不在当前版本目录中运行,而是在父目录中运行(包含当前,共享,发布等)
我深入研究了这一点,发现当我运行单个单词命令时,如:
within release_path do
execute "pwd"
end
Run Code Online (Sandbox Code Playgroud)
它工作得很好,并在当前版本目录中运行该命令.但是......当我运行带空格的命令时,例如:
within release_path do
execute "pwd && ls"
end
Run Code Online (Sandbox Code Playgroud)
它在父目录中运行,而不是在within块设置的目录中运行.
有人可以对此有所了解吗?谢谢!
我想用Capistrano 3编写一个配方,用sudo在远程服务器上执行任务.
使用Capistrano 2,可以这样做:
default_run_options[:pty] = true
task :hello do
run "#{sudo} cp ~/something /something"
end
Run Code Online (Sandbox Code Playgroud)
有了Capistrano 3,我发现:
set :pty, true
Run Code Online (Sandbox Code Playgroud)
但我无法执行使用sudo运行的任务.
如何使用sudo运行任务?
我正在使用capistrano,capistrano/rbenv,capistrano/bundler和capistrano/rails.我在capistrano编译资产的步骤中收到此错误:
DEBUG [49a50df6] /usr/bin/env:
DEBUG [49a50df6] ruby
DEBUG [49a50df6] : No such file or directory
DEBUG [49a50df6]
Run Code Online (Sandbox Code Playgroud)
在生产服务器上/usr/bin/env ruby -v是正确的.我知道这一点:为什么 - 做什么 - 在我的ssh-session-work-but-not-in-capistrano中工作
但是我无法让它工作.
这是我的Capfile:
# Load DSL and Setup Up Stages
require 'capistrano/setup'
# Includes default deployment tasks
require 'capistrano/deploy'
# Includes tasks from other gems included in your Gemfile
#
# For documentation on these, see for example:
#
# https://github.com/capistrano/rvm
# https://github.com/capistrano/rbenv
# https://github.com/capistrano/chruby
# https://github.com/capistrano/bundler
# https://github.com/capistrano/rails/tree/master/assets
# https://github.com/capistrano/rails/tree/master/migrations
# …Run Code Online (Sandbox Code Playgroud) 有没有办法在Capistrano 3中设置默认阶段?
我已经尝试放入set :stage, :productiondeploy.rb,但这不起作用,它给出了错误:
Stage not set, please call something such as `cap production deploy`,
where production is a stage you have defined
Run Code Online (Sandbox Code Playgroud)
我现在只有一个阶段所以我希望能够运行cap deploy并让它在默认情况下执行.
我从git @ ... URL添加一个子模块,以便能够在其中进行开发.现在我想部署应用程序并用git:// ...替换URL,因此它不需要对来自Capistrano的子模块的repo进行身份验证.是否完全在.gitmodules中编辑URL来完成此操作?
我还是习惯了Rails开发生态系统.最近我学会了如何使用capistrano使用apache和passenger来部署到我的服务器,我喜欢如何将一组相当复杂的部署指令放到我的deploy.rb中,以便它们通过单个"cap deploy"调用执行,如果出现任何问题,请自动回滚.
现在我正在考虑在Heroku上部署我的项目,我希望能够在那里使用capistrano进行部署.但我一直无法找到有关如何执行此操作的任何文档.可能吗?是否有capistrano任务可以让我在Heroku上自动部署?
这甚至有意义吗?毕竟capistrano以特定的方式工作(ssh进入服务器)并假设一个特定的目录结构(公共/发布/共享等).据我所知,Heroku无法实现这两个目标.但我仍然希望有capistrano的便利.我知道我可以将部署所需的步骤(git push/migrate/restart resque workers ...)放到一个rake任务中,并且我可以通过调用单个命令来部署; 但我不会受益于capistrano交易和回滚,这在我看来非常重要.
我可能遗漏了一些关于这些技术如何融合在一起的非常基础的东西.令我感到惊讶的是,我无法在任何地方找到关于这个主题的任何讨论.谁能分享他们的经历?
capistrano ×10
ruby ×5
capistrano3 ×2
deployment ×2
bundler ×1
composer-php ×1
git ×1
heroku ×1
postgresql ×1
rvm ×1