繁体   English   中英

在 Jenkinsfile 中逐行读取文件 - groovy

[英]Read file line by line in Jenkinsfile - groovy

我有一个简单的输入文件,每行有两个单词,并在 Jenkinsfile (groovy) 中解析,但看到一个问题,

pipeline {
  agent any
  stages {
    stage('Test-1') {
      steps {
        echo 'Building..'
        script {
          for (x in 1..5) {
            println x //0,1,2,3,4,5
          }
        }
      }
    }
    stage('Test-2 ') {
      steps {
      script {
        File file = new File("my_file.txt")
        def line, noOfLines = 0;
        file.withReader { reader ->
          while ((line = reader.readLine()) != null) {
            println "${line}"
            noOfLines++
          }
        }
      }
      }
    }
    stage('Test-3') {
      steps {
          script {
          def whole_file_data = readFile(file: 'my_file.txt')
            whole_file_data.eachLine { String line ->
              def (p1, p2) = line.tokenize()
              println("line:${line}")
              println("p1:${p1} & p2:${p2}")
            }
        }
      }
    }
  }
}

Test-1 可以很好地进行测试,而 Test-2 给我的错误是

Scripts not permitted to use new java.io.File java.lang.String. Administrators can decide whether to approve or reject this signature.

Test-3 阶段仅打印第一行并给出警告,

[Pipeline] readFile
expected to call java.lang.String.eachLine but wound up catching org.jenkinsci.plugins.workflow.cps.CpsClosure2.call; see: https://jenkins.io/redirect/pipeline-cps-method-mismatches/
line:1111 one
[Pipeline] echo

我的 Jenkins 版本是 Jenkins 2.249.1 导致问题的原因是什么? p1:1111 & p2:一个

测试1:

这是一个 shell 脚本迭代器。 我不确定它与其他两个阶段的关系如何,但它很好。

测试 2:

这使用管道中的File class 来读取文件系统上的文件。 这有两个安全问题需要管理员批准挂起沙盒模式启用,并且也仅适用于 Jenkins 主机给定问题中的用法。 实际上,您会遇到安全问题,出于所有这些原因,应该避免这种用法。

测试 3:

这使用了 Pipeline 中的readFile管道步骤方法。 这是最佳实践,应该比测试 2 中的用法更可取。文件中的字符串内容被迭代,并以正确的用法打印该行。 问题出在这条线上:

def (p1, p2) = line.tokenize()

其中 Tuple (p1, p2)被分配给从tokenize返回的 Array(并隐式重铸)。 如您在错误中看到的,此 lambda 迭代器 scope 元组导致您的管道出现Cps问题。 您可以通过在script块末尾重新分配给null来解决此问题:

p1 = null
p2 = null

或者甚至不使用临时变量:

println("p1:${line.tokenize()[0]} & p2:${line.tokenize()[1]}")

但是,对这两种方法更安全的替代方法可能是迭代标记化的行,并在没有换行符的情况下打印它以确保预期的格式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM