10

我有一个 Jenkins 构建,它运行 Capistrano 部署作为构建后操作。

从控制台以 Jenkins 用户身份运行 Capistrano 任务绝对可以正常工作,并且没有密码提示(我之前在构建和登台服务器上都设置了 SSH 密钥)。但是,当通过 Jenkins 运行相同的脚本时,我突然收到密码提示,随后构建失败(不存在 TTY)。

[workspace] $ /bin/sh -xe /tmp/hudson7321493219694918714.sh
Performing Post build task...
Match found for : : True
Logical operation result is TRUE
Running script  : cap _2.13.4_ deploy
[workspace] $ /bin/sh -xe /tmp/hudson1545664641721322948.sh
+ cap _2.13.4_ deploy
  * executing `deploy'
  * executing `deploy:update'
 ** transaction: start
  * executing `deploy:update_code'
    triggering before callbacks for `deploy:update_code'
[32m--> Updating code base with checkout strategy[0m
    executing locally: "git ls-remote git@my.staging-server.com:my_project.git master"
    command finished in 1200ms
  * executing "git clone -q git@my.staging-server.com:my_project.git /var/www/staging/my_project/releases/20121029223619 && cd /var/www/staging/my_project/releases/20121029223619 && git checkout -q -b deploy 1fb11d669a6cb5a714d077162305dfcfaba82f01 && (echo 1fb11d669a6cb5a714d077162305dfcfaba82f01 > /var/www/staging/my_project/releases/20121029223619/REVISION)"
servers: ["my.staging-server.com"]
Password: stty: standard input: Inappropriate ioctl for device
stty: standard input: Inappropriate ioctl for device
stty: standard input: Inappropriate ioctl for device

*** [deploy:update_code] rolling back
  * executing "rm -rf /var/www/staging/my_project/releases/20121029223619; true"
    servers: ["my.staging-server.com"]
 ** [deploy:update_code] exception while rolling back: Capistrano::ConnectionError, connection failed for: my.staging-server.com (Net::SSH::AuthenticationFailed: not-specified)
connection failed for: my.staging-server.com (Net::SSH::AuthenticationFailed: not-specified)
POST BUILD TASK : FAILURE

看起来 Ruby 在通过 Jenkins 运行时可能没有选择我的 SSH 密钥(Net::SSH::AuthenticationFailed: not-specified)?

有谁知道这里可能出了什么问题?

4

2 回答 2

7

我们遇到了类似的事情。jenkins 的登录 shell 可能已经有一个自动运行的 ssh 代理,但 jenkins 为您的部署生成的上下文没有。

尝试在您的 jenkins 脚本中手动启动一个:

# Start the ssh agent. Evaling the output will set the relevant environment 
# variables
eval `ssh-agent` 

# Add the default keys like id_rsa and id_dsa (or explicitly specify your key,
# if it's not a default)
ssh-add

# Your normal deploy script here

# Save the return value of your script
RETVAL=$?

# Clean up
kill $SSH_AGENT_PID

# Exit the script with the true return value instead of the return value of kill
# which could be successful even when the capistrano portion of the build has
# crashed
exit $RETVAL

希望这对你有用!贝壳很烦人。

于 2013-04-02T21:57:51.333 回答
-1

deploy.rb不幸的是,我只是通过在执行之前替换原来的来解决它,然后cap deploy用另一个保存在我添加的本地保存set :password, "sshpassword"

于 2013-04-02T17:58:57.383 回答