使用 Groovy 脚本从 Jenkins 中的工作区读取文件

问题描述 投票:0回答:7

我想使用 Groovy 插件添加一个构建步骤来读取文件并根据文件的内容触发构建失败。

如何在groovy插件中注入工作空间文件路径?

myFileDirectory = // Get workspace filepath here ???
myFileName = "output.log"
myFile = new File(myFileDirectory + myFileName)

lastLine = myFile.readLines().get(myFile.readLines().size().toInteger() - 1)
if (lastLine ==~ /.Fatal Error.*/ ){
    println "Fatal error found"
    System.exit(1)
} else{
   println "nothing to see here"
}
groovy jenkins
7个回答
92
投票

我意识到这个问题是关于创建一个插件,但由于新的 Jenkins 2 Pipeline 构建使用 Groovy,我发现自己在这里尝试弄清楚如何从 Pipeline 构建中的工作区读取文件。所以也许我将来可以帮助像我这样的人。

事实证明这很简单,有一个readfile步骤,我应该有rtfm:

env.WORKSPACE = pwd()
def version = readFile "${env.WORKSPACE}/version.txt"

30
投票

如果您尝试在管道构建步骤期间从工作区读取文件,有一个方法可以实现:

readFile('name-of-file.groovy')

有关参考,请参阅 https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#readfile-read-file-from-workspace


12
投票

根据您的评论,您最好使用 Text-finder 插件。

它允许搜索文件以及控制台中的正则表达式,然后设置构建

unstable
failed
(如果找到)。

对于 Groovy,您可以使用以下命令来访问

${WORKSPACE}
环境变量:
def workspace = manager.build.getEnvVars()["WORKSPACE"]

请注意,在“执行系统 Groovy 脚本”步骤中,您可以直接使用

build.getEnvVars()
(也在沙盒脚本中)。例如:

def workspace = build.getEnvVars()["WORKSPACE"]
def myFilePath = "my-logs/script-output.log"
def myFile = new File("${workspace}/${myFilePath}")
def newContent = "<h2>Script log</h2> <pre>${myFile.text}</pre>"
def existingDescription = build.getDescription() ?: ""
build.setDescription(existingDescription + newContent)

build
变量应该可用,无需在系统 Groovy 脚本中进行任何导入。


6
投票

如果有人有相同的要求,这可能会对他们有所帮助。

这将读取包含 Jenkins 作业名称的文件,并从一个作业迭代运行它们。

请在您的 Jenkins 中相应地更改以下代码。

pipeline {
   agent any

   stages {
      stage('Hello') {
         steps {
             script{
            git branch: 'Your Branch name', credentialsId: 'Your crendiatails', url: ' Your BitBucket Repo URL '

##To read file from workspace which will contain the Jenkins Job Name ###
           
     def filePath = readFile "${WORKSPACE}/ Your File Location"                   

##To read file line by line ###
 
     def lines = filePath.readLines() 
      
##To iterate and run Jenkins Jobs one by one ####

                    for (line in lines) {                                            
                      build(job: "$line/branchName",
                        parameters:
                        [string(name: 'vertical', value: "${params.vert}"),
                        string(name: 'environment', value: "${params.env}"),
                        string(name: 'branch', value: "${params.branch}"),
                        string(name: 'project', value: "${params.project}")
                        ]
                    )
                        }  
                                       }
                    
         }
         }
      }
   }


5
投票

虽然这个问题仅与查找目录路径($WORKSPACE)有关,但我需要从工作区读取文件并将其解析为JSON对象以读取声纳问题(忽略次要/注释问题)

可能对某人有帮助,我就是这样做的- 来自 readFile

jsonParse(readFile('xyz.json')) 

和jsonParse方法-

@NonCPS
def jsonParse(text) {
        return new groovy.json.JsonSlurperClassic().parseText(text);
}

这还需要在 ManageJenkins-> 进程内脚本批准中进行脚本批准


0
投票

如果您已经安装了 Groovy(Postbuild)插件,我认为使用(通用)Groovy 而不是安装(专用)插件来完成此任务是合理的愿望。

也就是说,您可以使用

manager.build.workspace.getRemote()
获取工作空间。不要忘记在路径和文件名之间添加
File.separator


0
投票

正如另一篇文章中提到的从 Jenkins 中的工作区 groovy 脚本读取 .txt 文件我正在努力使其适用于工作区中文件的 pom 模块,在 扩展选择参数。这是我使用 printlns 的解决方案:

import groovy.util.XmlSlurper
import java.util.Map
import jenkins.*
import jenkins.model.*
import hudson.*
import hudson.model.*    

try{
//get Jenkins instance
    def jenkins = Jenkins.instance
//get job Item
    def item = jenkins.getItemByFullName("The_JOB_NAME")
    println item
// get workspacePath for the job Item
    def workspacePath = jenkins.getWorkspaceFor (item)
    println workspacePath

    def file = new File(workspacePath.toString()+"\\pom.xml")
    def pomFile = new XmlSlurper().parse(file)
    def pomModules = pomFile.modules.children().join(",")
    return pomModules
} catch (Exception ex){
    println ex.message
}
© www.soinside.com 2019 - 2024. All rights reserved.