Jenkins管道脚本可将文件复制或移动到另一个目标

时间:2018-11-17 17:12:32

标签: java-stream jenkins-pipeline jenkins-groovy

我正在用Groovy语言编写Jenkins管道脚本。我想将所有文件和文件夹移动到另一个位置。由于Groovy支持Java,所以我在下面的Java代码中执行了该操作。

管道{      代理

 stages{    
     stage('Organise Files'){                         
         steps{  
                script{                        
                    File sourceFolder = new File("C:\\My-Source");
                    File  destinationFolder = new File("C:\\My-Destination");                                                   
                    File[] listOfFiles = sourceFolder.listFiles();
                    echo "Files Total: " + listOfFiles.length;  

                    for (File file : listOfFiles) {
                        if (file.isFile()) {
                            echo file.getName()                                                                
                            Files.copy(Paths.get(file.path), Paths.get("C:\\My-Destination"));                                   
                        }
                    }                  
                }                                
            }                           
        } 
    }
}

此代码引发以下异常:

  

groovy.lang.MissingPropertyException:无此类属性:的文件   类别:WorkflowScript

我也尝试了下面的代码,但是它也不起作用。

FileUtils.copyFile(file.path, "C:\\My-Destination");

最后,我确实尝试使用java I / O Stream执行操作,并且代码如下:

def srcStream = new File("C:\\My-Source\\**\\*").newDataInputStream()
def dstStream = new File("C:\\My-Destination").newDataOutputStream()
dstStream << srcStream
srcStream.close()
dstStream.close()

但是它也不起作用,并引发以下异常:

  

java.io.FileNotFoundException:C:\ My-Source(访问被拒绝)

有人可以建议我如何解决该问题,也请让我知道复制或移动文件后如何从源位置删除文件?还有一件事,在复制期间我可以使用通配符过滤一些文件夹和文件吗?也请让我知道。

2 个答案:

答案 0 :(得分:4)

不要使用纯Java / Groovy执行这些I / O功能。即使您运行了该程序,它也将始终在主服务器而不是构建代理程序上执行。为此,也请使用pipeline steps,例如:

bat("xcopy C:\\My-Source C:\\My-Destination /O /X /E /H /K")

或使用File Operations Plugin

fileOperations([fileCopyOperation(
  excludes: '',
  flattenFiles: false,
  includes: 'C:\\My-Destination\\**',
  targetLocation: "C:\\My-Destination"
)]).

在我的示例中,我认为我没有针对Windows路径使用非常正确的语法,但我希望您明白这一点。

答案 1 :(得分:1)

Jenkins Pipeline脚本代码复制文件。 'bat'选项对我有用,但是fileOperations没有。有谁知道为什么fileOperations阶段无法正常工作?

pipeline {
    agent any
    //Worked
    stages {
        stage ('Bat - Copying file') {
            steps {
                bat("xcopy ..\\..\\sharedspace\\folder\\* . /O /X /E /H /K")
            }
        }
    }
    //Not working
    stages {
        stage ('FileOperations - Copying file') {
            steps {
                fileOperations([fileCopyOperation(
                    excludes: '',
                    flattenFiles: true,
                    includes: '..\\..\\sharedspace\\folder\\*',
                    targetLocation: '.'
                )])
            }
        }
    }
    //The post will always notify you regarding the job status by email
    post {
        always {
            mail to: 'xxxxx@domain.com',
            subject: "Status of pipeline: ${currentBuild.fullDisplayName}",
            body: "${env.BUILD_URL} has result ${currentBuild.result}"
        }
    }
}