使用Groovy脚本从Jenkins中的Workspace读取文件

时间:2014-04-07 16:03:56

标签: groovy jenkins

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

如何在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"
}

7 个答案:

答案 0 :(得分:41)

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

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

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

答案 1 :(得分:10)

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

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

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

答案 2 :(得分:6)

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

它允许搜索正则表达式的文件和控制台,然后设置构建unstablefailed(如果找到)。

对于Groovy,您可以使用以下方法访问${WORKSPACE}环境变量:
def workspace = manager.build.getEnvVars()["WORKSPACE"]

答案 3 :(得分:1)

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

可能会帮助某人,这就是我的做法- 来自readFile

jsonParse(readFile('xyz.json')) 

和jsonParse方法-

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

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

答案 4 :(得分:0)

如果您已经安装了Groovy(Postbuild)插件,我认为通过(通用)Groovy完成此操作而不是安装(专用)插件是一种有效的愿望。

也就是说,您可以使用manager.build.workspace.getRemote()获取工作区。不要忘记在路径和文件名之间添加File.separator

答案 5 :(得分:0)

如另一篇Read .txt file from workspace groovy script in Jenkins所述,我正在努力使其适用于工作空间中文件的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
}

答案 6 :(得分:0)

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

这将读取一个包含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.vertical}"),
                        string(name: 'environment', value: "${params.environment}"),
                        string(name: 'branch', value: "${params.aerdevops_branch}"),
                        string(name: 'project', value: "${params.host_project}")
                        ]
                    )
                        }  
                                       }
                    
         }
         }
      }
   }