我设置了一个 Bitbucket 管道,如下所示(之前关于构建和推送 docker 映像的步骤被省略但有效):
- step:
name: Deploy to EC2
script:
- |
ssh -i ${EC2_KEY_PEM} ${EC2_USER}@${EC2_HOST} <<'EOF'
docker ps -q | grep -q . && docker stop $(docker ps -q)
echo ${DOCKER_PASSWORD} | docker login --username ${DOCKER_USERNAME} --password-stdin
docker pull ${DOCKER_REPO}/${IMAGE_NAME}:${IMAGE_VERSION}
docker run -d --name my_container_name ${DOCKER_REPO}/${IMAGE_NAME}:${IMAGE_VERSION}
EOF
services:
- docker
其中
${EC2_KEY_PEM}
是包含原始 .pem
文件的存储库变量。
我的 Bitbucket 管道因以下错误而不断失败:
<1s
+ ssh -i ${EC2_KEY_PEM} ${EC2_USER}@${EC2_HOST} <<'EOF'
docker ps -q | grep -q . && docker stop $(docker ps -q)
echo ${DOCKER_PASSWORD} | docker login --username ${DOCKER_USERNAME} --password-stdin
docker pull ${DOCKER_REPO}/${IMAGE_NAME}:${IMAGE_VERSION}
docker run -d --name my_container_name ${DOCKER_REPO}/${IMAGE_NAME}:${IMAGE_VERSION}
EOF
Warning: Identity file @ not accessible: No such file or directory.
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
[-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
[-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
[-i identity_file] [-J [user@]host[:port]] [-L address]
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
[-Q query_option] [-R address] [-S ctl_path] [-W host:port]
[-w local_tun[:remote_tun]] destination [command]
(我尝试过用
<<EOF
代替<<'EOF'
)
我还尝试了以下方法来定义私有 ssh 密钥,如下所示:
- echo ${EC2_KEY_BASE64} | base64 -d > ec2-key.pem
- chmod 600 ec2-key.pem
- |
ssh -i ec2-key.pem ${EC2_USER}@${EC2_HOST} <<'EOF'
其中
${EC2_KEY_BASE64}
从 .pem
转换为 base64
字符串。所有情况下都出现同样的错误。
问题在于
${EC2_KEY_BASE64}
变量的位置。 Bitbucket 有存储库变量和部署变量。我的 bitbucket-pipelines.yml
中没有显示的是,我将上一步标记为 deployment: Production
,假设这将滚动到下一步。
事实并非如此。换句话说,命令
echo ${EC2_KEY_BASE64} | base64 -d > ec2-key.pem
生成了一个空的 ec2-key.pem
文件,导致随后的失败。
要点:
deployment
(例如Production
)只能在一步中使用。Production
的特定步骤中将值定义为 bitbucket-pipelines.yml
部署变量,则它们在任何其他步骤中将不可用。