Jenkins 声明式管道中的 Stash 和 Unstash

Jenkins 声明式管道中的 Stash 和 Unstash
pipeline{
    agent none
     stages{
        stage('Git checkout'){
            agent { label 'master' }
            steps{  
               stash includes: '/root/hello-world/*', name: 'mysrc'  
               }
}
        
        stage('maven build'){
            agent { label 'slave-1' }
            steps{
            
               unstash 'mysrc'
               sh label: '', script: 'mvn clean package'
            }
        }
    }
    
}

我已经将我的代码克隆到掌握目录中hello-world。现在我需要将该文件夹复制hello-world到从属服务器。复制后,我需要mvn clean package运行奴隶节点。

当我运行它时,出现了这个错误:

Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] stage
[Pipeline] { (Git checkout)
[Pipeline] node
Running on Jenkins in /var/lib/jenkins/workspace/test-12
[Pipeline] {
[Pipeline] stash
[Pipeline] }
[Pipeline] // node
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (maven build)
Stage "maven build" skipped due to earlier failure(s)
[Pipeline] }
[Pipeline] // stage
[Pipeline] End of Pipeline
ERROR: No files included in stash ‘mysrc’
Finished: FAILURE 

答案1

提供给 stash 命令的包含路径必须相对于工作目录(通常是工作区)。即使它们以 开头,Jenkins 也会将它们视为相对路径/。但是,您可以通过将 stash 指令包装在 中来从任意位置进行存储dir

dir( '/root' ) {
  stash includes: 'hello-world', name: 'mysrc'
}

但是,如果您确实在存储/root,那么您的问题也可能是,除非您以 root 身份运行 Jenkins,否则权限/root可能不允许您访问该目录,这可以解释为什么您会收到关于存储中不包含任何文件的错误(因为没有任何东西被存储,因为它不可读)。

您可以通过添加存储选项来避免“未存储任何内容”的问题allowEmpty: false,如果未找到任何文件,则在存储时引发错误,而不是在取消存储时引发错误。

相关内容