[英]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.