【问题标题】:can not create file via Groovy code(or java code) in jenkinsfile of a pipeline job on Jenkins无法通过 Jenkins 管道作业的 jenkinsfile 中的 Groovy 代码(或 java 代码)创建文件
【发布时间】:2018-07-24 20:23:17
【问题描述】:
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 控制台日志:(出现异常:Started by user Edgar Yu Running 在耐久性级别:MAX_SURVIVABILITY [Pipeline] 节点上运行 Jenkins 在 /var/jenkins_home/workspace/test2 [管道] { [管道] stage [Pipeline] { (Build) [Pipeline] echo Building.. [Pipeline] echo 詹金斯

[管道] 脚本 [管道] { [管道] } [管道] // 脚本 [管道] } [管道] // 阶段 [管道] 阶段 [管道] { (测试) 由于早期故障而跳过阶段“测试”[管道] } [管道] // stage [Pipeline] stage [Pipeline] { (Deploy) Stage 'Deploy' 跳过 由于较早的故障 [Pipeline] } [Pipeline] // 阶段 [Pipeline] } [Pipeline] // 节点 [Pipeline] 管道结束 java.io.IOException: Permission denied at java.io.UnixFileSystem.createFileExclusively(Native Method) at java.io.File.createNewFile(File.java:1012)

【问题讨论】:

  • 您的 jenkins 用户是否对 /home/jenkins 目录有写入权限?好像没有……
  • 向给定目录/文件的应用程序运行用户授予权限,例如,chmod 777 fileName(这将授予所有用户和组的所有权限)
  • 在这里阅读文档...computerhope.com/unix/uchmod.htm
  • 你有什么问题?
  • 你根本不知道情况。你不明白我在说什么。

标签: jenkins groovy jenkins-pipeline


【解决方案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

【讨论】:

  • 如果您使用writeFile,您将如何附加到同一个文件?
  • 这个对另一个问题的回答可以提供帮助:stackoverflow.com/a/46941503/7223663,本质上是读取然后附加到 groovy 中并重新写入文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多