Skip to content

Instantly share code, notes, and snippets.

@languitar
Created August 26, 2013 07:59

Revisions

  1. languitar created this gist Aug 26, 2013.
    90 changes: 90 additions & 0 deletions violations_trigger.groovy
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,90 @@
    import jenkins.model.Jenkins
    build = Jenkins.instance.items[0].builds[0]
    println build

    println("Available actions on the build: " + build.actions)

    def analysisCoreActions = []

    // All static analysis actions based on static analysis core can be handled uniformly
    analysisCoreActions.addAll(build.actions.findAll{it.class.name =~ "hudson.plugins.checkstyle.CheckStyle.*ResultAction"})
    analysisCoreActions.addAll(build.actions.findAll{it.class.name =~ "hudson.plugins.findbugs.FindBugs.*ResultAction"})
    analysisCoreActions.addAll(build.actions.findAll{it.class.name =~ "hudson.plugins.pmd.Pmd.*ResultAction"})
    analysisCoreActions.addAll(build.actions.findAll{it.class.name =~ "hudson.plugins.dry.Dry.*ResultAction"})
    analysisCoreActions.addAll(build.actions.findAll{it.class.name =~ "hudson.plugins.warnings.*ResultAction"})
    analysisCoreActions.removeAll([null])

    println "Found analysis core actions: " + analysisCoreActions

    def newViolations = analysisCoreActions.sum{it.result.numberOfNewWarnings}

    println "Found " + newViolations + " new violations in analysis core plugins"

    // Specifically handle new tasks as we probably want to send something different in this case

    def tasksAction = build.actions.find{it.class.name =~ "hudson.plugins.tasks.*ResultAction"}
    def newTasks = 0
    if (tasksAction != null) {
    newTasks = tasksAction.result.numberOfNewWarnings
    println "Found " + newTasks + " new tasks"
    }

    // now there are some special rules for plugins that do not use analysis core

    // violations plugin
    def violationsStatus(build) {
    def violationsAction = build.actions.find{it.class.name =~ "hudson.plugins.violations.ViolationsBuildAction"}
    if (violationsAction == null) {
    return false
    }
    def previousBuild = build.previousBuild
    if (previousBuild == null) {
    return false
    }
    def previousViolationsAction = previousBuild.actions.find{it.class.name =~ "hudson.plugins.violations.ViolationsBuildAction"}
    if (previousViolationsAction == null) {
    return false
    }
    for (currentViolationState in violationsAction.report.violations) {
    println currentViolationState.key + ": " + currentViolationState.value
    def previousState = previousViolationsAction.report.violations[currentViolationState.key]
    if (previousState == null) {
    continue
    }
    println "Previous: " + previousState
    if (currentViolationState.value > previousState && previousState >= 0) {
    return true
    }
    }
    return false
    }
    def violationsAdded = violationsStatus(build)
    println "Added violations: " + violationsAdded

    // cppcheck
    def cppcheckStatus(build) {

    def cppcheckAction = build.actions.find{it.class.name =~ "org.jenkinsci.plugins.cppcheck.CppcheckBuildAction"}
    if (cppcheckAction == null) {
    return false
    }
    def previousBuild = build.previousBuild
    println "Previous cppcheck build: " + previousBuild
    if (previousBuild == null) {
    return false
    }
    def previousCppcheckAction = previousBuild.actions.find{it.class.name =~ "org.jenkinsci.plugins.cppcheck.CppcheckBuildAction"}
    println "Previous cppcheck action: " + previousCppcheckAction
    if (previousCppcheckAction == null) {
    return false
    }

    return cppcheckAction.result.report.allErrors.size() > previousCppcheckAction.result.report.allErrors.size()
    }

    def cppcheckAdded = cppcheckStatus(build)
    println "Added cppcheck errors: " + cppcheckAdded

    // send email if we have new warnings

    newViolations > 0 || newTasks > 0 || violationsAdded || cppcheckAdded