1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2024-12-14 11:03:09 +02:00
sap-jenkins-library/src/com/sap/piper/DebugReport.groovy
2020-04-17 10:31:04 +02:00

145 lines
5.5 KiB
Groovy

package com.sap.piper
import com.cloudbees.groovy.cps.NonCPS
import groovy.text.SimpleTemplateEngine
@Singleton
class DebugReport implements Serializable {
static final long serialVersionUID = 1L
String projectIdentifier = null
Map environment = ['environment': 'custom']
String buildTool = null
Map modulesMap = [:]
List npmModules = []
Set plugins = []
Map gitRepo = [:]
Map localExtensions = [:]
String globalExtensionRepository = null
Map globalExtensions = [:]
String globalExtensionConfigurationFilePath = null
String sharedConfigFilePath = null
Set additionalSharedLibraries = []
Map failedBuild = [:]
/**
* Initialize debug report information from the environment variables.
*
* @param env The Jenkins global 'env' variable.
*/
void initFromEnvironment(def env) {
Set buildDetails = []
buildDetails.add('Jenkins Version | ' + env.JENKINS_VERSION)
buildDetails.add('JAVA Version | ' + env.JAVA_VERSION)
environment.put('build_details', buildDetails)
if (!Boolean.valueOf(env.ON_K8S) && EnvironmentUtils.cxServerDirectoryExists()) {
environment.put('environment', 'cx-server')
String serverConfigContents = getServerConfigContents(
'/var/cx-server/server.cfg',
'/workspace/var/cx-server/server.cfg')
String dockerImage = EnvironmentUtils.getDockerFile(serverConfigContents)
environment.put('docker_image', dockerImage)
}
else if(Boolean.valueOf(env.ON_K8S)){
DebugReport.instance.environment.put("environment", "Kubernetes")
}
}
private static String getServerConfigContents(String... possibleFileLocations) {
for (String location in possibleFileLocations) {
File file = new File(location)
if (file.exists())
return file.getText('UTF-8')
}
return ''
}
/**
* Pulls and stores repository information from the provided Map for later inclusion in the debug report.
*
* @param scmCheckoutResult A Map including information about the checked out project,
* i.e. as returned by the Jenkins checkout() function.
*/
void setGitRepoInfo(Map scmCheckoutResult) {
if (!scmCheckoutResult.GIT_URL)
return
gitRepo.put('URI', scmCheckoutResult.GIT_URL)
if (scmCheckoutResult.GIT_LOCAL_BRANCH) {
gitRepo.put('branch', scmCheckoutResult.GIT_LOCAL_BRANCH)
} else {
gitRepo.put('branch', scmCheckoutResult.GIT_BRANCH)
}
}
/**
* Stores crash information for a failed step. Multiple calls to this method overwrite already
* stored information, only the information stored last will appear in the debug report. In the
* current use-case where this can be called multiple times, all 'unstable' steps are listed in
* the 'unstableSteps' entry of the commonPipelineEnvironment.
*
* @param stepName The name of the crashed step or stage
* @param err The Throwable that was thrown
* @param failedOnError Whether the failure was deemed fatal at the time of calling this method.
*/
void storeStepFailure(String stepName, Throwable err, boolean failedOnError) {
failedBuild.put('step', stepName)
failedBuild.put('reason', err)
failedBuild.put('stack_trace', err.getStackTrace())
failedBuild.put('fatal', failedOnError ? 'true' : 'false')
}
Map generateReport(Script script, boolean shareConfidentialInformation) {
String template = script.libraryResource 'com.sap.piper/templates/debug_report.txt'
if (!projectIdentifier) {
projectIdentifier = 'NOT_SET'
}
try {
Jenkins.instance.getPluginManager().getPlugins().each {
plugins.add("${it.getShortName()} | ${it.getVersion()} | ${it.getDisplayName()}")
}
} catch (Throwable t) {
script.echo "Failed to retrieve Jenkins plugins for debug report (${t.getMessage()})"
}
Date now = new Date()
Map binding = [
'projectIdentifier' : projectIdentifier,
'environment' : environment,
'buildTool': buildTool,
'modulesMap' : modulesMap,
'npmModules' : npmModules,
'plugins' : plugins,
'gitRepo' : gitRepo,
'localExtensions' : localExtensions,
'globalExtensionRepository' : globalExtensionRepository,
'globalExtensions' : globalExtensions,
'globalExtensionConfigurationFilePath' : globalExtensionConfigurationFilePath,
'sharedConfigFilePath' : sharedConfigFilePath,
'additionalSharedLibraries' : additionalSharedLibraries,
'failedBuild' : failedBuild,
'shareConfidentialInformation' : shareConfidentialInformation,
'utcTimestamp' : now.format('yyyy-MM-dd HH:mm', TimeZone.getTimeZone('UTC'))
]
String fileNameTimestamp = now.format('yyyy-MM-dd-HH-mm', TimeZone.getTimeZone('UTC'))
String fileNamePrefix = shareConfidentialInformation ? 'confidential' : 'redacted'
Map result = [:]
result.fileName = "${fileNamePrefix}_debug_log_${fileNameTimestamp}_${projectIdentifier}.txt"
result.contents = fillTemplate(template, binding)
return result
}
@NonCPS
private String fillTemplate(String template, binding) {
def engine = new SimpleTemplateEngine()
return engine.createTemplate(template).make(binding)
}
}