Bitbucket Pipeline部署EC2时Load key格式无效错误的排查与解决
问题描述
我正在用Bitbucket Pipeline将应用部署到EC2服务器,以下是我的配置和遇到的错误:
bitbucket-pipelines.yaml 配置
image: atlassian/default-image:3 pipelines: branches: dev: - step: name: automated deployment script: - pipe: atlassian/scp-deploy:1.2.1 variables: USER: 'ubuntu' SERVER: $SERVER_IP REMOTE_PATH: '/home/ubuntu/utags-test/server' LOCAL_PATH: '${BITBUCKET_CLONE_DIR}/*' - pipe: atlassian/ssh-run:0.4.1 variables: SSH_USER: 'ubuntu' SERVER: $SERVER_IP COMMAND: 'cd /home/ubuntu/utags-test/server;docker pull paranjay1/utags-paranjay:dev;docker-compose down;docker-compose up -d' SSH_KEY: $SERVER_PRIVATE_KEY DEBUG: 'true' services: - docker
错误日志
Build setup13s pipe: atlassian/scp-deploy:1.2.1 .... .... Digest: sha256:b9111f61b5824ca7ed1cb63689a6da55ca6d6e8985eb778c36a5dfc2ffe776a8 Status: Downloaded newer image for bitbucketpipelines/scp-deploy:1.2.1 INFO: Configuring ssh with default ssh key. INFO: Adding known hosts... INFO: Appending to ssh config file private key path INFO: Applied file permissions to ssh directory. ✔ Deployment finished. pipe: atlassian/ssh-run:0.4.1 .... .... Digest: sha256:b8ff5416420ef659869bf1ea6e95502b8fa28ccd5e51321e4832d9d81fdefc18 Status: Downloaded newer image for bitbucketpipelines/ssh-run:0.4.1 INFO: Executing the pipe... INFO: Using passed SSH_KEY INFO: Executing command on 13.235.33.118 ssh -A -tt -i /root/.ssh/pipelines_id -o StrictHostKeyChecking=no -p 22 ubuntu@13.235.33.118 bash -c 'cd /utags-test/server;docker pull paranjay1/utags-paranjay:dev;docker-compose down;docker-compose up -d' Load key "/root/.ssh/pipelines_id": invalid format Load key "/root/.ssh/pipelines_id": invalid format ubuntu@13.235.33.118: Permission denied (publickey,gssapi-keyex,gssapi-with-mic). ✖ Execution failed.
已完成的前置操作:
- EC2服务器已安装Docker和docker-compose
- 在Bitbucket的SSH密钥部分生成了密钥,公钥已添加到EC2的
authorized_keys文件中 $SERVER_PRIVATE_KEY变量存储EC2服务器的私钥$SERVER_IP变量存储EC2公网IP
错误成因分析
- 私钥格式不合法:日志里的
Load key "/root/.ssh/pipelines_id": invalid format明确说明,Bitbucket Pipeline读取到的$SERVER_PRIVATE_KEY内容不符合SSH私钥的标准格式。常见诱因包括:- 粘贴私钥到Bitbucket变量时丢失了换行符
- 私钥缺失开头/结尾的标识行(比如
-----BEGIN OPENSSH PRIVATE KEY-----) - 变量值被自动添加了多余的空格或转义字符
- 密钥使用逻辑混淆:你提到在Bitbucket生成了密钥对并把公钥放到EC2,但配置里却用了EC2本身的私钥。正确逻辑应该是:用Bitbucket侧的私钥(自己生成或Bitbucket生成的)连接EC2,而不是反过来用EC2的私钥。
解决步骤
步骤1:修正私钥格式
- 打开Bitbucket仓库的Settings → Repository variables,找到
SERVER_PRIVATE_KEY变量 - 确保变量值是完整的SSH私钥:
- 必须包含开头和结尾的标识行
- 中间的每一行私钥内容完整保留,不能丢失换行
- 私钥前后无多余空格或空行
步骤2:调整密钥使用逻辑(若之前混淆了密钥对)
如果之前错误使用了EC2的私钥,改成以下流程:
- 在Bitbucket仓库的Settings → SSH keys中生成或添加一对SSH密钥(也可以用本地生成的密钥对)
- 将该密钥对的公钥添加到EC2服务器的
/home/ubuntu/.ssh/authorized_keys文件中 - 在Bitbucket的Repository variables里,把该密钥对的私钥赋值给
SERVER_PRIVATE_KEY变量
步骤3:修正命令路径
错误日志中的命令用了cd /utags-test/server,但scp配置的远程路径是/home/ubuntu/utags-test/server,路径不一致会导致后续docker命令执行失败,建议把SSH命令里的路径改成cd /home/ubuntu/utags-test/server,保持和部署路径一致。
步骤4:重新触发Pipeline
修改完成后,重新运行dev分支的Pipeline,验证是否能正常连接EC2并完成部署。
内容的提问来源于stack exchange,提问作者fayir
相关产品推荐
相关产品推荐

