一尘不染

无法通过Jenkins上的管道作业的jenkinsfile中的Groovy代码(或java代码)创建文件

jenkins

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                echo 'Building..'
                echo "whoami".execute().text
                script {
                    File f = new File('/home/jenkins/test2.txt');
                    f.createNewFile();
                }
            }
        }
        stage('Test') {
            steps {
                echo 'Testing..'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying....'
            }
        }
    }
}

Jenkins控制台日志:(获得例外:由用户Edgar Yu启动在持久性级别中运行:MAX_SURVIVABILITY [Pipeline]节点在/
var / jenkins_home / workspace / test2中的Jenkins上运行[Pipeline]
{[Pipeline]阶段[Pipeline] {(构建) [管道]回声大厦.. [管道]回声詹金斯

[Pipeline]脚本[Pipeline] {[Pipeline]} [Pipeline] //脚本[Pipeline]} [Pipeline]
//阶段[Pipeline]阶段[Pipeline] {(测试)由于早期失败,跳过了“测试”阶段)[管道]} [管道] //阶段[管道]阶段[管道]
{(部署)由于早期故障而跳过了“部署”阶段[管道]} [管道] //阶段[管道]} [管道] //节点[管道]管道末端
java.io.IOException:
在java.io.File.createNewFile(File.java:1012)处的java.io.UnixFileSystem.createFileExclusively(本机方法)
拒绝权限


阅读 263

收藏
2020-07-25

共1个答案

一尘不染

这是由于Jenkins并未实现Groovy本身而是一个解释器(CPS)-https: //github.com/cloudbees/groovy-
cps

为了帮助处理所引入的复杂性,有一些常用的步骤可以解决麻烦,例如创建文件。

要立即使用Jenkins管道步骤,请使用writeFile:https
://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#code-writefile-code-
write-file-to-workspace

writeFile([file: 'file.txt', text: filetxt])

如果您在编写自己的文件时遇到麻烦,建议将其拆分为一个共享库,请注意,这可能会导致ScriptSecurity警报,需要批准:

final class PipelineUtils implements Serializable {
    private script=null
    private static final PipelineUtils instance = new PipelineUtils()
    @NonCPS
    String saveFile(String filename, String text) {
        String PWD = script.pwd()
        String filePath = "${PWD}/${filename}"

        File file = new File(filePath)
        file.text = text
    }
}

有关@NonCPS和不可序列化对象的信息,请参见https://github.com/jenkinsci/pipeline-
plugin/blob/master/TUTORIAL.md。

2020-07-25