Deployment capistrano ssh连接-不';从cron或teamcity运行时无法工作

Deployment capistrano ssh连接-不';从cron或teamcity运行时无法工作,deployment,teamcity,capistrano,multistage,Deployment,Teamcity,Capistrano,Multistage,我已经研究了一整天,似乎找不到答案,所以我在这里发布。我们正在使用capistrano multistage部署我们的ruby on rails应用程序,在实现自动化部署之前,一切都很好 现在,无论何时以交互方式运行,只要没有问题,部署就可以顺利完成。我们现在正在考虑在每次成功构建之后使用ci(Teamcity)部署到我们的暂存环境 在CI服务器上,运行“ssh server1”或“ssh”deploy@server1“没有问题 我的ci阶段看起来像这样,并且在命令行中也可以正常工作 set :

我已经研究了一整天,似乎找不到答案,所以我在这里发布。我们正在使用capistrano multistage部署我们的ruby on rails应用程序,在实现自动化部署之前,一切都很好

现在,无论何时以交互方式运行,只要没有问题,部署就可以顺利完成。我们现在正在考虑在每次成功构建之后使用ci(Teamcity)部署到我们的暂存环境

在CI服务器上,运行“ssh server1”或“ssh”deploy@server1“没有问题

我的ci阶段看起来像这样,并且在命令行中也可以正常工作

set :branch, "development"
set :rails_env, "staging"
set :user, "deploy"

$:.unshift(File.expand_path('./lib', ENV['rvm_path']))
require 'rvm/capistrano'
set :rvm_ruby_string, 'ruby-1.9.2-p290'
set :rvm_bin_path, "/usr/local/rvm/bin/"

default_run_options[:pty] = true
ssh_options[:verbose] = :debug 
default_run_options[:pty] = true 

role :app, "server1"
role :web, "server1"
role :utility, "server2"
role :db,  "server1", :primary => true
my deploy.rb非常大,但这些是相关的设置

# Repo Settings
set :repository,  "git@github.com:myrepo/myrepo.git"
set :scm, "git"
set :checkout, 'export'
set :copy_exclude, ".git/*"
set :deploy_via, :remote_cache

# General Settings
default_run_options[:pty] = true
set :ssh_options, { :forward_agent => true }
set :keep_releases, 20
set :use_sudo, false
在TeamCity作为最终构建步骤下,我添加了一个简单的命令行任务“capcideploy:setup”——这是一个比完全部署更简单的测试

cap日志向我显示了以下内容:

[03:27:38]: [Step 4/10] D, [2011-11-21T03:27:38.103284 #22035] DEBUG -- net.ssh.authentication.session[70ca88]: allowed methods: publickey,password
[03:27:38]: [Step 4/10] E, [2011-11-21T03:27:38.103328 #22035] ERROR -- net.ssh.authentication.session[70ca88]: all authorization methods failed (tried publickey)
同样的事情似乎也发生在cronjob上——但是没有日志

对我来说,这似乎是一个环境问题,因为Teamcity和cron可能没有加载我的完整环境。我已经尝试直接在cap文件中指定ssh密钥,但似乎没有任何效果

另一件奇怪的事情是,在我试图部署到的远程服务器上,auth.log显示没有尝试连接,因此从服务器端对此进行故障排除似乎不是一个选项

所以我的问题是,我如何让它工作?关于确定问题所在的测试的任何想法,或者我需要设置的环境变量

任何能让我找到解决方案的答案都会被接受


谢谢。

我通过在ssh/config中修改ssh连接、使用特定pid运行ssh代理、添加环境变量和添加构建步骤来修复此问题,以便在运行的构建中向ssh代理添加密钥


为什么将
转发代理
选项设置为是?crontab中不会有SSH代理。我希望使用转发代理,而不是在远程服务器上放置私钥。根据我所读到的,如果代理不可用,net.ssh无论如何都会尝试建立连接。cron是否以所需用户的身份运行脚本?如果脚本以root用户身份运行,它还将尝试使用root用户提供的公钥,服务器可能无法识别该公钥。(公钥是用户绑定的)