Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Deploying via Capistrano through Jenkins - SSH authentication failed

I've got a Jenkins build that runs a Capistrano deploy as a post-build action.

Running the Capistrano task as the Jenkins user from the console works absolutely fine and without a password prompt (I've previously set up SSH keys on both build and staging server). However, when running the same script through Jenkins, I suddenly get a password prompt and the build subsequently fails (no TTY present).

[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 [email protected]:my_project.git master"
    command finished in 1200ms
  * executing "git clone -q [email protected]: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

It looks like Ruby doesn't pick my SSH key up when running through Jenkins perhaps (Net::SSH::AuthenticationFailed: not-specified)?

Does anyone have an idea what might be going wrong here?

like image 776
Burgi Avatar asked Oct 30 '12 18:10

Burgi


1 Answers

We ran into something similar to this. It's possible that the login shell for jenkins already has an ssh agent running automatically, but the context that jenkins spawns for your deployment does not.

Try starting one manually within your jenkins script:

# 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

Hope this works for you! Shells are annoying.

like image 149
Fitzsimmons Avatar answered Nov 11 '22 19:11

Fitzsimmons