CircleCI 1.0迁移至2.0:部署SSH密钥不可用问题求助
CircleCI 2.0迁移后SSH密钥无法用于Capistrano部署的解决方案
我来帮你搞定这个问题——你遇到的核心矛盾是CircleCI 2.0不会自动把项目配置的SSH密钥注入构建容器,而且就算密钥存在,Capistrano也需要正确的SSH代理环境才能调用它们。
问题根源
你之前移除add_ssh_keys步骤是关键失误:CircleCI 2.0不会默认把项目SSH权限里配置的密钥放到容器的~/.ssh目录下,必须通过add_ssh_keys步骤完成挂载。另外,就算密钥成功挂载,当前shell环境也没把密钥加载到SSH代理中,导致Capistrano触发认证失败。
具体修复步骤
恢复
add_ssh_keys步骤
这是CircleCI 2.0将项目配置的SSH密钥同步到容器~/.ssh目录的必要操作,必须放在部署步骤之前。部署前启动SSH代理并加载密钥
在执行bundle exec cap staging deploy前,需要启动SSH代理并把密钥添加进去,确保当前环境能调用密钥完成认证。开启Capistrano的SSH代理转发
在Capistrano的阶段配置文件(比如config/deploy/staging.rb)中添加代理转发配置,让Capistrano通过SSH代理使用密钥。
修改后的配置示例
CircleCI config.yml中的部署片段
# Deploy if develop - add_ssh_keys - deploy: name: Deploy to staging if branch is develop command: | if [ "${CIRCLE_BRANCH}" == "develop" ]; then eval `ssh-agent` && ssh-add ~/.ssh/id_rsa* && bundle exec cap staging deploy else echo "Not on develop branch => Not deploying to staging" fi
Capistrano staging配置文件
# config/deploy/staging.rb set :ssh_options, forward_agent: true
修复逻辑说明
add_ssh_keys:负责把你在CircleCI项目里配置的SSH密钥复制到构建容器的~/.ssh目录,让后续命令能访问到密钥。evalssh-agent&& ssh-add ~/.ssh/id_rsa*:启动SSH代理进程,把密钥加载到代理中,这样Capistrano执行远程命令时可以通过代理调用密钥。forward_agent: true:告诉Capistrano使用本地SSH代理完成认证,既避免在远程服务器存密钥,又能保证认证流程正常运行。
内容的提问来源于stack exchange,提问作者Yannick Fonjallaz
相关产品推荐
相关产品推荐

