Jenkins部署阶段sshPut至远程服务器SFTP失败求助
问题概述
使用Jenkins部署预发布环境,3条流水线中仅第二条的SFTP上传Debian包步骤失败,错误为SSH_FX_FAILURE: An error occurred。Debian包构建正常,同流水线在原项目可正常运行,当前项目为原项目克隆版本,怀疑Jenkins节点配置缺失。
错误日志
[2024-03-18T13:12:42.832Z] Sending a file/directory to oauth-web02.b2bapi-stg.ovh.cloud.de[oauth-web02.b2bapi-stg.ovh.cloud.de]: from: /var/lib/jenkins/workspace/b2b-oauth-new/Oauth-server-Packager/b2b-oauth-server-new-staging_1.0.25_all.deb into: /home/b2bapiadm/b2b-oauth-server-new/ [2024-03-18T13:12:44.659Z] Failed SFTP PUT: /var/lib/jenkins/workspace/b2b-oauth-new/Oauth-server-Packager/b2b-oauth-server-new-staging_1.0.25_all.deb -> oauth-web02.b2bapi-stg.ovh.cloud.de:/home/b2bapiadm/b2b-oauth-server-new/ Failed SFTP PUT: /var/lib/jenkins/workspace/b2b-oauth-new/Oauth-server-Packager/b2b-oauth-server-new-staging_1.0.25_all.deb -> oauth-web02.b2bapi-stg.ovh.fti-cloud.de:/home/b2bapiadm/b2b-oauth-server-new/: (SSH_FX_FAILURE: An error occurred): Failure
相关Groovy代码片段
stage('Deploying to staging') { steps { script{ for(int i=0; i< pipelineParams.STG_SERVER_CONFIG_NAME.size(); i++){ echo "Deploying ${pipelineParams.STG_SERVER_CONFIG_NAME[i]}" def remote = [:] remote.name = "${pipelineParams.STG_SERVER_CONFIG_NAME[i]}" remote.host = "${pipelineParams.STG_SERVER_CONFIG_NAME[i]}" remote.allowAnyHosts = true withCredentials([ sshUserPrivateKey( credentialsId: "${JENKINS_SSH_KEY_ID}", keyFileVariable: 'identity', passphraseVariable: '', usernameVariable: 'userName' ) ]) { remote.user = userName remote.identityFile = identity sshPut remote: remote, from: "${ARTIFACTS_NAME_PREFIX}-staging_${BuildTag}_all.deb", into: "${DEB_FILE_PATH}${ARTIFACTS_NAME_PREFIX}/", dryRun: env.DRY_RUN } } } } }
排查建议
核对Jenkins节点SSH客户端配置
确认当前项目运行的Jenkins节点是否安装了OpenSSH客户端(ssh/sftp命令),原项目节点可能已预装,克隆项目若分配到新节点可能缺失。执行which sftp验证,未安装则通过包管理器安装(如Debian/Ubuntu用apt install openssh-client)。验证节点到目标服务器的SSH连通性
登录Jenkins节点,用流水线使用的SSH私钥手动连接目标服务器:ssh -i /path/to/private/key b2bapiadm@oauth-web02.b2bapi-stg.ovh.cloud.de尝试手动执行SFTP上传:
sftp -i /path/to/private/key b2bapiadm@oauth-web02.b2bapi-stg.ovh.cloud.de put /var/lib/jenkins/workspace/b2b-oauth-new/Oauth-server-Packager/b2b-oauth-server-new-staging_1.0.25_all.deb /home/b2bapiadm/b2b-oauth-server-new/观察是否有具体错误(如权限不足、目录不存在、密钥未授权),
SSH_FX_FAILURE通常是服务器端返回的通用错误,手动操作能暴露细节。检查流水线参数与环境变量一致性
对比原项目与当前克隆项目的JENKINS_SSH_KEY_ID、DEB_FILE_PATH、ARTIFACTS_NAME_PREFIX等参数:- 确认
JENKINS_SSH_KEY_ID对应的凭证在当前项目有权限使用(克隆项目可能未继承凭证权限) - 验证
DEB_FILE_PATH拼接后的目标目录/home/b2bapiadm/b2b-oauth-server-new/是否存在,且b2bapiadm用户有写入权限 - 检查
BuildTag变量是否正确生成,确保from路径指向的Debian包确实存在于当前节点的工作区
- 确认
核对Jenkins SSH插件版本
确认当前节点的SSH插件版本与原项目节点一致,插件版本差异可能导致兼容性问题,尤其是sshPut步骤的参数解析逻辑。检查节点工作区权限
确认Jenkins节点运行用户(通常是jenkins)对工作区的Debian包有读取权限:ls -l /var/lib/jenkins/workspace/b2b-oauth-new/Oauth-server-Packager/b2b-oauth-server-new-staging_1.0.25_all.deb若权限不足,调整工作区或文件权限。
内容的提问来源于stack exchange,提问作者Airish

