1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2025-01-18 05:18:24 +02:00
Daniel Kurzynski f5b19a79e4
Infer project name (#2119)
Co-authored-by: Stephan Aßmus <stephan.assmus@sap.com>
2020-10-05 19:34:43 +02:00

180 lines
6.0 KiB
Groovy

package com.sap.piper
import com.cloudbees.groovy.cps.NonCPS
import com.sap.piper.analytics.Telemetry
import groovy.text.GStringTemplateEngine
import java.nio.charset.StandardCharsets
import java.security.MessageDigest
def stash(name, include = '**/*.*', exclude = '', useDefaultExcludes = true) {
echo "Stash content: ${name} (include: ${include}, exclude: ${exclude}, useDefaultExcludes: ${useDefaultExcludes})"
Map stashParams = [
name : name,
includes: include,
excludes: exclude
]
//only set the optional parameter if default excludes should not be applied
if (!useDefaultExcludes) {
stashParams.useDefaultExcludes = useDefaultExcludes
}
steps.stash stashParams
}
def stashList(script, List stashes) {
for (def stash : stashes) {
def name = stash.name
def include = stash.includes
def exclude = stash.excludes
if (stash?.merge == true) {
String lockingResourceGroup = script.commonPipelineEnvironment.projectName?:env.JOB_NAME
String lockName = "${lockingResourceGroup}/${stash.name}"
lock(lockName) {
unstash stash.name
echo "Stash content: ${name} (include: ${include}, exclude: ${exclude})"
steps.stash name: name, includes: include, excludes: exclude, allowEmpty: true
}
} else {
echo "Stash content: ${name} (include: ${include}, exclude: ${exclude})"
steps.stash name: name, includes: include, excludes: exclude, allowEmpty: true
}
}
}
def stashWithMessage(name, msg, include = '**/*.*', exclude = '', useDefaultExcludes = true) {
try {
stash(name, include, exclude, useDefaultExcludes)
} catch (e) {
echo msg + name + " (${e.getMessage()})"
}
}
def stashStageFiles(Script script, String stageName) {
List stashes = script.commonPipelineEnvironment.configuration.stageStashes?.get(stageName)?.stashes ?: []
stashList(script, stashes)
//NOTE: We do not delete the directory in case Jenkins runs on Kubernetes.
// deleteDir() is not required in pods, but would be nice to have the same behaviour and leave a clean fileSystem.
if (!isInsidePod(script)) {
script.deleteDir()
}
}
def unstashStageFiles(Script script, String stageName, List stashContent = []) {
stashContent += script.commonPipelineEnvironment.configuration.stageStashes?.get(stageName)?.unstash ?: []
script.deleteDir()
unstashAll(stashContent)
return stashContent
}
boolean isInsidePod(Script script) {
return script.env.POD_NAME
}
def unstash(name, msg = "Unstash failed:") {
def unstashedContent = []
try {
echo "Unstash content: ${name}"
steps.unstash name
unstashedContent += name
} catch (e) {
echo "$msg $name (${e.getMessage()})"
}
return unstashedContent
}
def unstashAll(stashContent) {
def unstashedContent = []
if (stashContent) {
for (int i = 0; i < stashContent.size(); i++) {
if (stashContent[i]) {
unstashedContent += unstash(stashContent[i])
}
}
}
return unstashedContent
}
@NonCPS
def generateSha1(input) {
return MessageDigest
.getInstance("SHA-1")
.digest(input.getBytes(StandardCharsets.UTF_8))
.encodeHex().toString()
}
void pushToSWA(Map parameters, Map config) {
try {
parameters.actionName = parameters.get('actionName') ?: 'Piper Library OS'
parameters.eventType = parameters.get('eventType') ?: 'library-os'
parameters.jobUrlSha1 = generateSha1(env.JOB_URL ?: '')
parameters.buildUrlSha1 = generateSha1(env.BUILD_URL ?: '')
Telemetry.notify(this, config, parameters)
} catch (ignore) {
// some error occured in telemetry reporting. This should not break anything though.
echo "[${parameters.step}] Telemetry Report failed: ${ignore.getMessage()}"
}
}
@NonCPS
static String fillTemplate(String templateText, Map binding) {
def engine = new GStringTemplateEngine()
String result = engine.createTemplate(templateText).make(binding)
return result
}
static String downloadSettingsFromUrl(script, String url, String targetFile = 'settings.xml') {
if (script.fileExists(targetFile)) {
throw new RuntimeException("Trying to download settings file to ${targetFile}, but a file with this name already exists. Please specify a unique file name.")
}
def settings = script.httpRequest(url)
script.writeFile(file: targetFile, text: settings.getContent())
return targetFile
}
/*
* Uses the Maven Help plugin to evaluate the given expression into the resolved values
* that maven sees at / generates at runtime. This way, the exact Maven coordinates and
* variables can be used.
*/
static String evaluateFromMavenPom(Script script, String pomFileName, String pomPathExpression) {
String resolvedExpression = script.mavenExecute(
script: script,
pomPath: pomFileName,
goals: ['org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate'],
defines: ["-Dexpression=$pomPathExpression", "-DforceStdout", "-q"],
returnStdout: true
)
if (resolvedExpression.startsWith('null object or invalid expression')) {
// There is no error indication (exit code or otherwise) from the
// 'evaluate' Maven plugin, only this output to stdout. The calling
// code assumes an empty string is returned when the property could
// not be resolved.
throw new RuntimeException("Cannot evaluate property value from '${pomFileName}', " +
"missing property or invalid expression '${pomPathExpression}'.")
}
return resolvedExpression
}
static List appendParameterToStringList(List list, Map parameters, String paramName) {
def value = parameters[paramName]
List result = []
result.addAll(list)
if (value in CharSequence) {
result.add(value)
} else if (value in List) {
result.addAll(value)
}
return result
}