当前位置: 首页 > 知识库问答 >
问题:

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

盛建德
2023-03-14
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[Pipeline]{[Pipeline]stage[Pipeline]{(Build)[Pipeline]echo Building..[Pipeline]echo Jenkins

[管道]脚本[管道]{[管道]}[管道]//脚本[管道]}[管道]//阶段[管道]阶段[管道]{(测试)阶段'测试'跳过由于早期故障(s)[管道]}[管道]//阶段[管道]阶段[管道]{(部署)阶段'部署'跳过由于早期故障(s)[管道]}[管道]//阶段[管道]}[管道]//节点[管道]管道java.io.结束IO异常:权限拒绝在java.io.UnixFileSystem.create文件独家(本机方法)java.io.File.createNewFile(File.java:1012)

共有1个答案

祁杰
2023-03-14

这是因为Jenkins没有实现Groovy本身,而是实现了一个解释器(CPS)——https://github.com/cloudbees/groovy-cps

为了帮助处理引入的复杂性,有一些常见的步骤可以用来解决创建文件等任务带来的麻烦。

要使用Jenkins管道开箱即用,请使用writeFile:https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#code-writefile代码将文件写入工作区

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。

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

  • 我使用jenkins的代码为每个插件生成覆盖率,并显示我喜欢的管道。是否有一个插件我可以使用它(例如Cobertura,但它似乎不受管道支持)?

  • 我已经准备好了创建约100个测试作业的工作DSL代码(主脚本)。方法是它们应该可以手动执行,并且我们希望有管道让它们在晚上执行。因此,管道作业(多个)也将被创建。没问题。 但是由于主DSL groovy脚本会很大,我希望相应的管道脚本(管道作业将加载)放在单独的文件中。由于作业太多,我已经将所有作业的配置放在一个单独的文件中,它们在MAP中定义。创建所有测试作业的逻辑都放在主脚本中,它会循环通过位

  • 问题内容: 在我的jenkins管道项目中,我可以从git fine中检出代码…但是我们需要做一些git checkins,而且显然没有缓存凭据。 这是示例输出: 有人对此有很好的解决方案吗? 谢谢 问题答案: 答案是使用强大的jenkins插件: http://getmesh.io/Blog/Jenkins+2+Pipeline+101 该插件为git访问注入SSH_AUTH_SOCK环境变量

  • 我想在管道Jenkins作业中获得最后的构建输出,并在电子邮件中附加(使用emailext插件)。Curl工作正常,并提供适当的构建输出,但我无法将其存储在变量中以附加到电子邮件中。我用的是詹金斯的最新版本。 我可以看到,对于简单的sh命令,有几个相关的帖子,但这对于curl响应存储不起作用。 1. 2. 3.

  • 问题内容: 我在Oracle 9的数据库blob列中存储了一些文件。 我想将那些文件存储在文件系统中。 这应该很容易,但是我找不到正确的选择。 如何在Java中执行此操作? 我知道应该是这样的…我不知道被评论为有 雾 谢谢 编辑 我终于从大卫的问题中得到了这一点。 这是我的懒惰实现: 问题答案: 您希望将blob作为输入流并将其内容转储到输出流。因此,“痛苦”应类似于: 如果您发现自己做了很多这样