Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to read log file from within pipeline?

I have a pipeline job that runs a maven build. In the "post" section of the pipeline, I want to get the log file so that I can perform some failure analysis on it using some regexes. I have tried the following:

def logContent = Jenkins.getInstance()
        .getItemByFullName(JOB_NAME)
        .getBuildByNumber(
            Integer.parseInt(BUILD_NUMBER))
        .logFile.text

Error for the above code

Scripts not permitted to use staticMethod jenkins.model.Jenkins getInstance

currentBuild.rawBuild.getLogFile()

Error for the above code

Scripts not permitted to use method hudson.model.Run getLogFile

From my research, when I encounter these, I should be able to go to the scriptApproval page and see a prompt to approve these scripts, but when I go to that page, there are no new prompts.

I've also tried loading the script in from a separate file and running it on a different node with no luck.

I'm not sure what else to try at this point, so that's why I'm here. Any help is greatly appreciated.

P.S. I'm aware of the BFA tool, and I've tried manually triggering the analysis early, but in order to do that, I need to be able to access the log file, so I run into the same issue.

like image 849
William Will Avatar asked Oct 30 '25 11:10

William Will


1 Answers

You can use pipeline step httpRequest from here

pipeline {
  agent any

  stages {
      stage('Build') {
          steps {
            echo 'Test fetch build log'
          }
          post {
            always {
              script {
                def logUrl = env.BUILD_URL + 'consoleText'

                def response = httpRequest(
                  url: logUrl,
                  authentication: '<credentialsId of jenkins user>', 
                  ignoreSslErrors: true
                )

                def log = response.content

                echo 'Build log: ' + log
              }
            }
        }
      }
  }
}

If your jenkins job can run on linux machine, you can use curl to archive same goal.

pipeline {
    agent any
    stages {
        stage('Build') {
            environment {
                JENKINS_AUTH = credentials('< credentialsId of jenkins user')
            }
            steps {
                sh 'pwd'
            }
            post {
                always {
                    script {
                        def logUrl = env.BUILD_URL + 'consoleText'
                        def cmd = 'curl -u ${JENKINS_AUTH} -k ' + logUrl

                        def log = sh(returnStdout: true, script: cmd).trim()

                        echo 'Build log: ' + 
                        echo log
                    }
                }
            }
        }

    }
}

Above two approaches both require the credentials is Username and password format. More detail about what is it and how to add in Jenkins, please look at here

like image 157
yong Avatar answered Nov 01 '25 14:11

yong



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!