Jenkins迭代stash/unstash文件触发AccessDeniedException的解决办法
问题解决:Jenkins Stash/Unstash 触发 AccessDeniedException
错误核心原因
报错java.nio.file.AccessDeniedException: /home/test/version1/abc.war明确说明:Jenkins在testNode上运行的用户(通常是jenkins用户)没有目标目录的读写权限,无法创建或写入war文件。
修复方案
方案1:直接修复testNode的目录权限
登录到testNode服务器,调整/home/test/目录的权限,让Jenkins用户拥有读写权限:
# 方式1:将目录所有者改为Jenkins用户 sudo chown -R jenkins:jenkins /home/test/ # 方式2:如果需要保留原所有者,开放目录组权限 sudo chmod -R 775 /home/test/ sudo usermod -aG $(stat -c "%G" /home/test/) jenkins
注意:优先选择最小权限原则,避免使用
777权限。
方案2:调整Pipeline代码,确保目录存在且权限可控
你的原有代码存在一个小错误:versionList()是错误调用(versionList是数组,不是方法),应改为versionList.each。同时在unstash前先创建目标目录,避免因目录不存在导致的权限问题:
def versionList = ["1", "2", "3"] node(buildNode){ versionList.each { stage("Build version ${it}") { def pwDir = "${outputDir}/version${it}" dir(pwDir){ stash includes: "*.war", name: "warFile${it}" } } } } node("testNode"){ def warBasePath = "/home/test/" versionList.each { def targetDir = "${warBasePath}version${it}" // 先创建目标目录,确保路径存在 sh "mkdir -p ${targetDir}" // 可选:临时调整目录权限(如果需要) // sh "chown jenkins:jenkins ${targetDir}" dir(targetDir){ unstash "warFile${it}" } } }
方案3:替代方案——用SCP/RSync直接传输文件
Stash/Unstash更适合小文件场景,多版本二进制文件传输可以用SCP或RSync,效率更高且避免Stash的权限问题(需要提前配置buildNode到testNode的SSH免密登录):
def versionList = ["1", "2", "3"] def testNodeUser = "testuser" // testNode上的登录用户 def testNodeAddr = "192.168.1.100" // testNode的IP或主机名 node(buildNode){ versionList.each { stage("Deploy version ${it}") { def warFile = "${outputDir}/version${it}/*.war" def targetDir = "/home/test/version${it}/" // 创建目标目录 sh "ssh ${testNodeUser}@${testNodeAddr} 'mkdir -p ${targetDir}'" // SCP传输文件 sh "scp ${warFile} ${testNodeUser}@${testNodeAddr}:${targetDir}" } } }
内容的提问来源于stack exchange,提问作者ek777
相关产品推荐
相关产品推荐

