我真的需要你的帮助。我在我的本地机器上有一个Ruby on Rails应用程序,在GitHub上有一个Repository和一个Ubuntu服务器,它使用Nginx托管应用程序。
我公开了很多时间我的回购公司,通过capistrano的部署工作得很好。现在我将我的repo转换为私有repo,部署不起作用。当我尝试部署它时,我收到以下错误:
* executing `deploy'
* executing `deploy:update'
** transaction: start
* executing `deploy:update_code'
updating the cached checkout on all servers
executing locally: "git ls-remote git://github.com/GIT_USER/APPLICATION.git master"
fatal: The remote end hung up unexpectedly
*** [deploy:update_code] rolling back
* executing "rm -rf /var/www/APPLICATION/releases/DATE_OF_DEPLOY; true"
servers: ["DOMAIN"]
[DOMAIN] executing command
command finished in 424ms
所以,我的猜测是,认证不起作用,但确实如此。我将我的公钥复制到GitHub,甚至可以在那里SSH。我可以从服务器SSH到GitHub,它说我已成功通过身份验证。我甚至可以看到哪些键有效。但是“git ls-remote [...]”不起作用,除了我已经获得的信息之外,我没有得到跟踪的信息。
所以,我的主要问题是我不知道在哪里寻找错误。如果你知道如何解决这个问题,或者可以指出我的方向很好。
这是我的deploy.rb的主要部分:
$:.unshift(File.expand_path('./lib', ENV['rvm_path']))
require "rvm/capistrano"
require 'bundler/capistrano'
default_run_options[:pty] = true
set :user, "DEPLOY_USER"
set :domain, "DOMAIN"
set :application, "APPLICATION"
set :repository, "git@github.com:GIT_USER/APPLICATION.git"
set :deploy_to, "/var/www/#{application}"
set :deploy_via, :remote_cache
set :scm, :git
set :git_account, "GIT_USER"
set :branch, "master"
set :git_shallow_clone, 1
set :scm_verbose, true
set :use_sudo, false
set :rvm_bin_path, "/usr/local/rvm/bin"
set :rvm_ruby_string, '1.9.2'
set :rvm_type, :user # Don't use system-wide RVM
ssh_options[:port] = PORT_NUMBER
set :user, user
ssh_options[:keys] = %w(/home/DEPLOY_USER/.ssh/id_rsa)
set :ssh_options, { :forward_agent => true}
server domain, :app, :web
# Your HTTP server, Apache/etc
role :web, domain
# This may be the same as your `Web` server
role :app, domain
# This is where Rails migrations will run
role :db, domain, :primary => true
很抱歉,这件事看起来很混乱,但我尝试了一千个提示,tipps和教程。
感谢您的帮助!
顺便说一句:是的,所有用Capslock编写的东西都是出于隐私原因,当然不是我使用的真实设置。
答案 0 :(得分:2)
我似乎记得在使用私有github repo进行部署时遇到了类似的问题。我不认为我们已经解决了问题的原因,但最后我认为我们使用ssh-add
来解决问题,将github密钥添加到ssh-agent中 - 可能值得一试
答案 1 :(得分:2)
由于这是一个非公开的回购,你应该使用git @ ...地址。
我看到你在deploy.rb文件中有这个,但ls-remote仍在git上执行:// ...
问题可能是您在服务器上拥有的存储库的缓存副本。检查shared / cached-copy / .git / config文件中是否有正确的源地址。你应该有git @ ...而不是git:// ...那里
答案 2 :(得分:1)
对于私人仓库,您必须使用https样式:
set :repository, "https://github.com/git_name/repo_name.git"
..但您必须在每次部署时输入两次用户名和密码! 所以我写了一个Expect-script来为我做这个
查看此gist
..或作为演练:
#!/usr/bin/expect -f
# Expect script to supply username/password to cap deploy to git private repository
# This script needs username and password as arguments to connect to git server:
# ------------------------------------------------------------------------
# ./git_cap gituser gitpwd
# -------------------------------------------------------------------------
# set Variables
set g_user [lrange $argv 0 0]
set g_pwd [lrange $argv 1 1]
set timeout -1
spawn cap deploy
match_max 100000
# Look for user prompt
expect "*?sername:*"
send -- "$g_user\r"
send -- "\r"
# Look for passwod prompt
expect "*?assword:*"
send -- "$g_pwd\r"
send -- "\r"
# Look for user prompt
expect "*?sername:*"
send -- "$g_user\r"
send -- "\r"
# Look for passwod prompt
expect "*?assword:*"
send -- "$g_pwd\r"
send -- "\r"
expect eof
$ chmod 755 ~/git_cap
$ chmod +x ~/git_cap
alias gcap='~/git_cap gitname gitpwd'
(因为这个原因,用户名和密码预计2次,即使它可能使用它多次..但这样你可以用exp_continue添加密码行,所以每个下一个密码都会发送sudo-pwd和不是你的git-pwd)
rails_root$ gcap