Jenkins Pipeline执行报错:身份文件无法访问,寻求解决指导
本人是Jenkins及DevOps新手,正尝试将war包部署至运行在Amazon EC2实例上的Tomcat 9.xx(可通过浏览器访问)。
我的Jenkinsfile如下:
pipeline { agent any parameters { string(name: 'tomcat_dev', defaultValue: 'VALID_IP_HIDDEN', description: 'Staging Server') } triggers { pollSCM('* * * * *') } stages{ stage('Build'){ steps { sh 'mvn clean package' } post { success { echo 'Now Archiving...' archiveArtifacts artifacts: '**/target/*.war' } } } stage ('Deployments'){ parallel{ stage ('Deploy to Staging'){ steps { sh "scp -i /home/user/.ssh/tomcatdeployment.pem **/target/*.war ec2-user@${params.tomcat_dev}:/opt/tomcat/apache-tomcat-9.0.83/webapps" } } } } } }
我可通过上述身份文件连接EC2实例,但运行Jenkins Pipeline时持续报错:
scp -i /home/user/.ssh/tomcatdeployment.pem webapp/target/webapp.war ec2-user@IP_VALUE_HIDDEN:/opt/tomcat/apache-tomcat-9.0.83/webapps
Warning: Identity file /home/user/.ssh/tomcatdeployment.pem not accessible: Permission denied.
Host key verification failed.
我已尝试将Jenkins加入root用户组并配置免密sudo(参考Stack Overflow相关教程),但仍出现相同错误,恳请提供解决指导。
1. 修复SSH密钥权限问题
Jenkins默认以jenkins用户运行,你当前指定的密钥路径/home/user/.ssh/tomcatdeployment.pem属于普通用户user,jenkins用户无访问权限:
- 复制密钥到Jenkins用户的主目录:
sudo cp /home/user/.ssh/tomcatdeployment.pem /var/lib/jenkins/.ssh/ - 修改密钥的所有者和权限(SSH密钥要求权限必须为
*600*,否则会被拒绝):sudo chown jenkins:jenkins /var/lib/jenkins/.ssh/tomcatdeployment.pem sudo chmod 600 /var/lib/jenkins/.ssh/tomcatdeployment.pem - 更新Jenkinsfile中的scp命令,将密钥路径改为
/var/lib/jenkins/.ssh/tomcatdeployment.pem
2. 解决主机密钥验证失败问题
该错误是因为jenkins用户从未连接过目标EC2实例,未在known_hosts中记录主机密钥:
- 手动切换到jenkins用户,执行一次SSH连接确认主机密钥:
连接时输入sudo su - jenkins ssh -i /var/lib/jenkins/.ssh/tomcatdeployment.pem ec2-user@你的EC2_IPyes确认添加主机密钥,之后退出jenkins用户。 - 若为测试环境,可临时跳过主机密钥验证(不推荐生产环境使用),修改Jenkinsfile中的sh命令:
sh "scp -o StrictHostKeyChecking=no -i /var/lib/jenkins/.ssh/tomcatdeployment.pem **/target/*.war ec2-user@${params.tomcat_dev}:/opt/tomcat/apache-tomcat-9.0.83/webapps"
3. 放弃不必要的root权限配置
将Jenkins加入root组并配置免密sudo属于不安全操作,且并非解决此问题的必要方案。保持Jenkins以自身用户运行,通过调整文件权限和正确配置SSH密钥即可解决问题。
内容的提问来源于stack exchange,提问作者Spindoctor

