1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2025-01-30 05:59:39 +02:00
sap-jenkins-library/src/com/sap/piper/JenkinsUtils.groovy
Daniel Kurzynski d9a8537eb5
Revert to again use curl to download binary (#1637)
Revert "Remove curl for unstashing binary (#1580)"
This reverts commit 8b296f74

Improve error message

Co-authored-by: Christopher Fenner <26137398+CCFenner@users.noreply.github.com>
2020-06-10 10:11:20 +02:00

246 lines
8.2 KiB
Groovy

package com.sap.piper
import com.cloudbees.groovy.cps.NonCPS
import hudson.Functions
import hudson.tasks.junit.TestResultAction
import jenkins.model.Jenkins
import org.apache.commons.io.IOUtils
import org.jenkinsci.plugins.workflow.libs.LibrariesAction
import org.jenkinsci.plugins.workflow.steps.MissingContextVariableException
@NonCPS
def getActiveJenkinsInstance() {
return Jenkins.getActiveInstance()
}
@API
@NonCPS
static def isPluginActive(pluginId) {
return Jenkins.instance.pluginManager.plugins.find { p -> p.isActive() && p.getShortName() == pluginId }
}
static boolean hasTestFailures(build){
//build: https://javadoc.jenkins.io/plugin/workflow-support/org/jenkinsci/plugins/workflow/support/steps/build/RunWrapper.html
//getRawBuild: https://javadoc.jenkins.io/plugin/workflow-job/org/jenkinsci/plugins/workflow/job/WorkflowRun.html
//getAction: http://www.hudson-ci.org/javadoc/hudson/tasks/junit/TestResultAction.html
def action = build?.getRawBuild()?.getAction(TestResultAction.class)
return action && action.getFailCount() != 0
}
boolean addWarningsNGParser(String id, String name, String regex, String script, String example = ''){
def classLoader = this.getClass().getClassLoader()
// usage of class loader to avoid plugin dependency for other use cases of JenkinsUtils class
def parserConfig = classLoader.loadClass('io.jenkins.plugins.analysis.warnings.groovy.ParserConfiguration', true)?.getInstance()
if(parserConfig.contains(id)){
return false
}else{
parserConfig.setParsers(
parserConfig.getParsers().plus(
classLoader.loadClass('io.jenkins.plugins.analysis.warnings.groovy.GroovyParser', true)?.newInstance(id, name, regex, script, example)
)
)
return true
}
}
@NonCPS
static String getFullBuildLog(currentBuild) {
Reader reader = currentBuild.getRawBuild().getLogReader()
String logContent = IOUtils.toString(reader);
reader.close();
reader = null
return logContent
}
def nodeAvailable() {
try {
sh "echo 'Node is available!'"
} catch (MissingContextVariableException e) {
echo "No node context available."
return false
}
return true
}
@NonCPS
def getCurrentBuildInstance() {
return currentBuild
}
@NonCPS
def getParentJob() {
return getRawBuild().getParent()
}
@NonCPS
def getRawBuild() {
return getCurrentBuildInstance().rawBuild
}
def isJobStartedByTimer() {
return isJobStartedByCause(hudson.triggers.TimerTrigger.TimerTriggerCause.class)
}
def isJobStartedByUser() {
return isJobStartedByCause(hudson.model.Cause.UserIdCause.class)
}
@NonCPS
def isJobStartedByCause(Class cause) {
def startedByGivenCause = false
def detectedCause = getRawBuild().getCause(cause)
if (null != detectedCause) {
startedByGivenCause = true
echo "Found build cause ${detectedCause}"
}
return startedByGivenCause
}
@NonCPS
String getIssueCommentTriggerAction() {
try {
def triggerCause = getRawBuild().getCause(org.jenkinsci.plugins.pipeline.github.trigger.IssueCommentCause)
if (triggerCause) {
//triggerPattern e.g. like '.* /piper ([a-z]*) .*'
def matcher = triggerCause.comment =~ triggerCause.triggerPattern
if (matcher) {
return matcher[0][1]
}
}
return null
} catch (err) {
return null
}
}
def getJobStartedByUserId() {
return getRawBuild().getCause(hudson.model.Cause.UserIdCause.class)?.getUserId()
}
@NonCPS
def getLibrariesInfo() {
def libraries = []
def build = getRawBuild()
def libs = build.getAction(LibrariesAction.class).getLibraries()
for (def i = 0; i < libs.size(); i++) {
Map lib = [:]
lib['name'] = libs[i].name
lib['version'] = libs[i].version
lib['trusted'] = libs[i].trusted
libraries.add(lib)
}
return libraries
}
@NonCPS
void addRunSideBarLink(String relativeUrl, String displayName, String relativeIconPath) {
try {
def linkActionClass = this.class.classLoader.loadClass("hudson.plugins.sidebar_link.LinkAction")
if (relativeUrl != null && displayName != null) {
def run = getRawBuild()
def iconPath = (null != relativeIconPath) ? "${Functions.getResourcePath()}/${relativeIconPath}" : null
def action = linkActionClass.newInstance(relativeUrl, displayName, iconPath)
echo "Added run level sidebar link to '${action.getUrlName()}' with name '${action.getDisplayName()}' and icon '${action.getIconFileName()}'"
run.getActions().add(action)
}
} catch (e) {
e.printStackTrace()
}
}
@NonCPS
def getPlugin(name){
for (plugin in getActiveJenkinsInstance().pluginManager.plugins) {
if (name == plugin.getShortName()) {
return plugin
}
}
return null
}
@NonCPS
String getPluginVersion(name) {
return getPlugin(name)?.getVersion()
}
@NonCPS
void addJobSideBarLink(String relativeUrl, String displayName, String relativeIconPath) {
try {
def linkActionClass = this.class.classLoader.loadClass("hudson.plugins.sidebar_link.LinkAction")
if (relativeUrl != null && displayName != null) {
def parentJob = getParentJob()
def buildNumber = getCurrentBuildInstance().number
def iconPath = (null != relativeIconPath) ? "${Functions.getResourcePath()}/${relativeIconPath}" : null
def action = linkActionClass.newInstance("${buildNumber}/${relativeUrl}", displayName, iconPath)
echo "Added job level sidebar link to '${action.getUrlName()}' with name '${action.getDisplayName()}' and icon '${action.getIconFileName()}'"
parentJob.getActions().add(action)
}
} catch (e) {
e.printStackTrace()
}
}
@NonCPS
void removeJobSideBarLinks(String relativeUrl = null) {
try {
def linkActionClass = this.class.classLoader.loadClass("hudson.plugins.sidebar_link.LinkAction")
def parentJob = getParentJob()
def listToRemove = new ArrayList()
for (def action : parentJob.getActions()) {
if (linkActionClass.isAssignableFrom(action.getClass()) && (null == relativeUrl || action.getUrlName().endsWith(relativeUrl))) {
echo "Removing job level sidebar link to '${action.getUrlName()}' with name '${action.getDisplayName()}' and icon '${action.getIconFileName()}'"
listToRemove.add(action)
}
}
parentJob.getActions().removeAll(listToRemove)
echo "Removed Jenkins global sidebar links ${listToRemove}"
} catch (e) {
e.printStackTrace()
}
}
void handleStepResults(String stepName, boolean failOnMissingReports, boolean failOnMissingLinks) {
def reportsFileName = "${stepName}_reports.json"
def reportsFileExists = fileExists(file: reportsFileName)
if (failOnMissingReports && !reportsFileExists) {
error "Expected to find ${reportsFileName} in workspace but it is not there"
} else if (reportsFileExists) {
def reports = readJSON(file: reportsFileName)
for (report in reports) {
String target = report['target'] as String
if (target != null && target.startsWith("./")) {
// archiveArtifacts does not match any files when they start with "./",
// even though that is a correct relative path.
target = target.substring(2)
}
archiveArtifacts artifacts: target, allowEmptyArchive: !report['mandatory']
}
}
def linksFileName = "${stepName}_links.json"
def linksFileExists = fileExists(file: linksFileName)
if (failOnMissingLinks && !linksFileExists) {
error "Expected to find ${linksFileName} in workspace but it is not there"
} else if (linksFileExists) {
def links = readJSON(file: linksFileName)
for (link in links) {
if(link['scope'] == 'job') {
removeJobSideBarLinks(link['target'])
addJobSideBarLink(link['target'], link['name'], "images/24x24/graph.png")
}
addRunSideBarLink(link['target'], link['name'], "images/24x24/graph.png")
}
}
}
def getInstance() {
Jenkins.get()
}