2012-10-30 25 views
8

Tôi có một bản dựng Jenkins chạy một triển khai Capistrano như một hành động hậu xây dựng.Triển khai qua Capistrano qua Jenkins - Xác thực SSH không thành công

Chạy tác vụ Capistrano khi người dùng Jenkins từ bảng điều khiển hoạt động hoàn toàn tốt và không có lời nhắc mật khẩu (trước đây tôi đã thiết lập các khóa SSH trên cả máy chủ dựng và dàn dựng). Tuy nhiên, khi chạy cùng một kịch bản thông qua Jenkins, tôi đột nhiên nhận được một lời nhắc mật khẩu và xây dựng sau đó không thành công (không có TTY hiện tại).

[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 

Có vẻ như Ruby không nhận chìa khóa SSH của tôi lên khi chạy qua Jenkins lẽ (Net::SSH::AuthenticationFailed: not-specified)?

Có ai có ý tưởng gì có thể xảy ra ở đây không?

+0

Chạy tập lệnh shell giống chính xác mà Jenkins tạo trong /tmp/hudson*.sh trong vùng làm việc của dự án khi người dùng jenkins hoạt động hoàn toàn tốt. Điều gì cũng kỳ lạ là SSH'ing đến máy chủ hoạt động tốt, nhưng sau đó nhân bản từ git (git máy chủ trên cùng một máy từ xa như xây dựng mục tiêu) không thành công (chỉ khi chạy trong Jenkins xây dựng mặc dù). Tôi bối rối. – Burgi

+0

Tôi nghĩ rằng Jenkins chạy dưới dạng "root", vì vậy hãy đặt "env | sort" vào tập lệnh trước lệnh "cap" để in ra thông tin môi trường, vì vậy bạn có thể xem người dùng là ai. Tôi đang làm việc trên cùng một vấn đề ngay bây giờ. Tôi sẽ cho bạn biết nếu tôi nghĩ ra điều gì đó. – Harmon

+1

Người dùng nào là kịch bản Capistrano của bạn kết nối như? Nó có thể đang chạy "git clone" với tư cách người dùng khác nếu bạn không chỉ định người mà bạn kết nối. Nó sẽ mặc định cho người dùng chạy kịch bản lệnh Cap từ máy chủ triển khai. Ví dụ, đây là thiết lập của chúng tôi: 'server '# {deploy_user} @ # {hostname}",: ứng dụng,: db,: primary => true' và 'set: deploy_user, ENV [' USER ']'. – Harmon

Trả lời

5

Chúng tôi chạy vào một cái gì đó tương tự như sau. Có thể shell đăng nhập cho jenkins đã có một tác nhân ssh chạy tự động, nhưng bối cảnh mà jenkins sinh ra cho việc triển khai của bạn thì không.

Hãy thử bắt đầu một cách thủ công trong kịch bản Jenkins của bạn:

# 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 công trình này dành cho bạn! Vỏ gây phiền nhiễu.

+0

Điều này cố định nó. Cảm ơn bạn! –

0

Đáng tiếc là tôi giải quyết nó chỉ bằng cách thay thế ban đầu deploy.rb trước khi thực hiện cap deploy với một số khác lưu tại địa phương nơi tôi thêm set :password, "sshpassword"