GitLab CI/CD执行chmod og= $STAGE_ID_RSA报exit code 1错误
报错根因
- 最核心的问题是变量用法错误:配置的
STAGE_ID_RSA变量存储的是SSH私钥的原始文本内容,不是流水线容器内私钥文件的路径。执行chmod og= $STAGE_ID_RSA时,shell会把变量替换为完整的多行私钥文本,chmod会将这些文本逐行识别为待修改权限的文件路径,自然找不到对应目标,直接触发参数错误,输出chmod命令的使用说明后以exit code 1退出。 - 配置文件还存在两个隐藏问题:一是内容里混入了HTML转义字符(
&、"),二是最后docker run命令中存在双引号嵌套冲突,就算修复chmod问题,后续步骤也会执行失败。
修复步骤
- 不要直接把私钥内容传给chmod/ssh命令,先将私钥内容写入流水线容器内的本地文件,再对该文件设置权限,ssh连接时指定这个本地文件的路径即可。
- 修正配置中的转义字符、引号嵌套问题。
修正后的可直接使用的配置如下:
deploy-stage: stage: deploy image: alpine:latest script: # 创建ssh目录,将私钥变量内容写入本地文件 - mkdir -p ~/.ssh - echo "$STAGE_ID_RSA" > ~/.ssh/id_rsa # 给私钥文件设置符合SSH要求的600权限(权限过宽会被SSH拒绝连接) - chmod 600 ~/.ssh/id_rsa # 安装SSH客户端,加--no-cache避免不必要的缓存,提升执行速度 - apk update && apk add --no-cache openssh-client # 所有SSH命令统一指定本地私钥路径,关闭主机密钥校验 - ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker stop $CI_PROJECT_NAME || true" - ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker rm $CI_PROJECT_NAME || true" - ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker image rm $CI_REGISTRY_IMAGE:latest || true" - ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY" - ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker pull $CI_REGISTRY_IMAGE:latest" # 内部环境变量参数用单引号包裹,避免和外层双引号冲突导致命令截断 - ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no $STAGE_SERVER_USER@$STAGE_SERVER_IP "docker run -d --restart unless-stopped --name $CI_PROJECT_NAME -p 8882:4000 -e 'variableData=Docker-Run-Command' $CI_REGISTRY_IMAGE:latest"
补充说明
- 私钥变量值末尾保留换行符的操作是正确的,不需要调整,否则SSH识别私钥时可能报错。
- 如果把
STAGE_ID_RSA变量类型设置为GitLab CI的File类型,GitLab会自动将变量内容写入临时文件,此时变量值存储的是临时文件路径,原有chmod逻辑可以正常运行,但手动写入文件的方式不受变量类型影响,兼容性更强。
内容的提问来源于stack exchange,提问作者No NAME
相关产品推荐
相关产品推荐

