mirror of
https://github.com/SAP/jenkins-library.git
synced 2024-12-14 11:03:09 +02:00
86 lines
2.4 KiB
Groovy
86 lines
2.4 KiB
Groovy
|
import com.sap.piper.ConfigurationHelper
|
||
|
import com.sap.piper.GenerateDocumentation
|
||
|
import com.sap.piper.k8s.ContainerMap
|
||
|
import hudson.FilePath
|
||
|
import com.sap.piper.Utils
|
||
|
import groovy.transform.Field
|
||
|
import java.util.UUID
|
||
|
import java.io.File
|
||
|
import com.cloudbees.groovy.cps.NonCPS
|
||
|
import com.sap.piper.JenkinsUtils
|
||
|
|
||
|
import static com.sap.piper.Prerequisites.checkScript
|
||
|
|
||
|
@Field String STEP_NAME = getClass().getName()
|
||
|
@Field Set GENERAL_CONFIG_KEYS = []
|
||
|
|
||
|
@Field Set STEP_CONFIG_KEYS = GENERAL_CONFIG_KEYS
|
||
|
@Field Set PARAMETER_KEYS = STEP_CONFIG_KEYS
|
||
|
|
||
|
|
||
|
/**
|
||
|
* This step allows you to materialize the Jenkins log file of the running build.
|
||
|
*
|
||
|
* It acts as a wrapper executing the passed function body.
|
||
|
*
|
||
|
* Note: the file that has been created during step execution will be removed automatically.
|
||
|
*/
|
||
|
@GenerateDocumentation
|
||
|
void call(Map parameters = [:], body) {
|
||
|
handlePipelineStepErrors (stepName: STEP_NAME, stepParameters: parameters) {
|
||
|
def jenkinsUtils = parameters.jenkinsUtilsStub ?: new JenkinsUtils()
|
||
|
checkScript(this, parameters)
|
||
|
withMaterializedLogFile(body, jenkinsUtils)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
@NonCPS
|
||
|
def writeLogToFile(fp) {
|
||
|
def logInputStream = currentBuild.rawBuild.getLogInputStream()
|
||
|
fp.copyFrom(logInputStream)
|
||
|
logInputStream.close()
|
||
|
}
|
||
|
|
||
|
@NonCPS
|
||
|
def deleteLogFile(fp) {
|
||
|
if(fp.exists()) {
|
||
|
fp.delete()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
def getFilePath(logFileName, jenkinsUtils) {
|
||
|
def nodeName = env['NODE_NAME']
|
||
|
if (nodeName == null || nodeName.size() == 0) {
|
||
|
throw new IllegalArgumentException("Environment variable NODE_NAME is undefined")
|
||
|
}
|
||
|
def file = new File(logFileName)
|
||
|
def instance = jenkinsUtils.getInstance()
|
||
|
if (instance == null) {
|
||
|
// fall back
|
||
|
return new FilePath(file);
|
||
|
} else {
|
||
|
def computer = instance.getComputer(nodeName)
|
||
|
if (computer == null) {
|
||
|
// fall back
|
||
|
println "Warning: Jenkins returned computer instance null on node " + nodeName
|
||
|
return new FilePath(file);
|
||
|
}
|
||
|
def channel = computer.getChannel()
|
||
|
return new FilePath(channel, file)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
// The method cannot be NonCPS because we call CPS
|
||
|
def withMaterializedLogFile(body, jenkinsUtils) {
|
||
|
def tempLogFileName = "${env.WORKSPACE}/log-${UUID.randomUUID().toString()}.txt"
|
||
|
def fp = getFilePath(tempLogFileName, jenkinsUtils)
|
||
|
writeLogToFile(fp)
|
||
|
try {
|
||
|
body(tempLogFileName)
|
||
|
} finally {
|
||
|
deleteLogFile(fp)
|
||
|
}
|
||
|
}
|