2019-12-16 23:09:25 +02:00
|
|
|
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()
|
2020-02-03 13:28:16 +02:00
|
|
|
return new FilePath(channel, logFileName)
|
2019-12-16 23:09:25 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 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)
|
|
|
|
}
|
|
|
|
}
|