Skip to content

Commit

Permalink
[JENKINS-45882] Jenkins Lint Global Configuration and new Checkers (#21)
Browse files Browse the repository at this point in the history
* Initial approach to use GlobalConfiguration

* Added Lint global settings to enable/disable it

* Disabling and Ignoring are now different status.

* Fixed README.md

* Added remaining checkers

* Saving global configuration based on the https://wiki.jenkins.io/display/JENKINS/Manage+global+settings+and+tools+installations

* Some minor bits and pieces to only show defects when they are in the right state

* Fixed Tests to use the enabled flag

* Enabled JobAction managed by GlobalSettings although the system property will be deprecated shortly

* Added Threshold option in the Global Settings

* Added TestCases for the new hardcoded threshold argument/variable

* Added FormValidation Test Case for the Threshold value

* SpeedUp TestCases usng the ClassRule pattern

[maven-release-plugin] prepare release jenkinslint-0.10.0

[maven-release-plugin] prepare for next development iteration

[maven-release-plugin] rollback the release of jenkinslint-0.10.0
  • Loading branch information
v1v committed Aug 1, 2017
1 parent dca5fad commit c05f72c
Show file tree
Hide file tree
Showing 72 changed files with 750 additions and 176 deletions.
9 changes: 5 additions & 4 deletions README.md
Expand Up @@ -6,7 +6,7 @@ This plugin has mainly two goals:

See [JenkinsLint Plugin](https://wiki.jenkins-ci.org/display/JENKINS/JenkinsLint+Plugin) for more information.

[![Build Status](https://ci.jenkins.io/job/Plugins/job/jenkinslint-plugin/job/master/badge/icon)](https://ci.jenkins.io/job/Plugins/job/jenkinslint-plugin/job/)
[![Build Status](https://ci.jenkins.io/buildStatus/icon?job=Plugins/jenkinslint-plugin/master)](https://ci.jenkins.io/job/Plugins/jenkinslint-plugin/master)

## Motivation

Expand All @@ -27,13 +27,12 @@ a hundred other projects is where it gets difficult and tedious. This provides a
- Load checks dynamically via Reflection
- Show graphs
- Configure Checks (enabled, disabled, change severity)
- Example: Groovy script to configure globally.
- Example: XML API to query
- Load checks dynamically.
- Jobs action to show those Jenkins lints.
- System.exit in system admin groovy scripts (publishers and parameters)
- Support pipeline
- BFA check
- Cyclomatic complexity check when using conditional steps plugin
- Git Submodule Ref cache repo check
- Fix Findbugs/Checkstyle defects
- Integrate with Sonar or any other Linting defects tool

Expand All @@ -42,10 +41,12 @@ a hundred other projects is where it gets difficult and tedious. This provides a
### Jobs based

* Artifact Publisher check
* BFA check
* Build timeout check
* CleanUp Workspace check
* Git Shallow clone check
* Git Ref repo check
* Git Ref Submodule repo check
* Gradle Wrapper check
* Hardcoded Script check
* Javadoc Publisher check
Expand Down
Expand Up @@ -34,7 +34,9 @@ public void getData() throws IOException {
Job newJob = new Job(item.getName(), item.getUrl());
for (InterfaceCheck checker : this.getCheckList()) {
LOG.log(Level.FINER, checker.getName() + " " + item.getName() + " " + checker.executeCheck(item));
newJob.addLint(new Lint(checker.getName(), checker.executeCheck(item), checker.isIgnored(item.getDescription())));
// Lint is disabled when is ignored or globally disabled
newJob.addLint(new Lint(checker.getName(), checker.executeCheck(item), checker.isIgnored(item.getDescription()), checker.isEnabled()));

}
jobSet.put(item.getName(),newJob);
LOG.log(Level.FINER, newJob.toString());
Expand All @@ -47,7 +49,7 @@ public void getData() throws IOException {
for (InterfaceSlaveCheck checker : this.getSlaveCheckList()) {
boolean status = checker.executeCheck(node);
LOG.log(Level.FINER, checker.getName() + " " + node.getDisplayName() + " " + status);
newSlave.addLint(new Lint(checker.getName(), status, checker.isIgnored(node.getNodeDescription())));
newSlave.addLint(new Lint(checker.getName(), status, checker.isIgnored(node.getNodeDescription()), checker.isEnabled()));
}
slaveSet.put(newSlave.getName(), newSlave);
LOG.log(Level.FINER, newSlave.toString());
Expand Down
@@ -0,0 +1,313 @@
package org.jenkins.ci.plugins.jenkinslint;

import hudson.Extension;
import hudson.util.FormValidation;
import jenkins.model.GlobalConfiguration;
import jenkins.model.Jenkins;
import net.sf.json.JSONObject;
import org.jenkins.ci.plugins.jenkinslint.check.HardcodedScriptChecker;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;

import javax.servlet.ServletException;
import java.io.IOException;

@Extension
public final class JenkinsLintGlobalConfiguration extends GlobalConfiguration {

private boolean globalEnabled = true;
private boolean jobActionEnabled = true;

private boolean artifactCheckerEnabled = true;
private boolean bfaCheckerEnabled = true;
private boolean cleanupWorkspaceCheckerEnabled = true;
private boolean gitRefCheckerEnabled = true;
private boolean gitRefSubmoduleCheckerEnabled = true;
private boolean gitShallowCheckerEnabled = true;
private boolean gradleWrapperCheckerEnabled = true;
private boolean groovySystemExitCheckerEnabled = true;
private boolean hardcodedScriptCheckerEnabled = true;
private boolean javadocCheckerEnabled = true;
private boolean jobAssignedLabelCheckerEnabled = true;
private boolean jobDescriptionCheckerEnabled = true;
private boolean jobLogRotatorCheckerEnabled = true;
private boolean jobNameCheckerEnabled = true;
private boolean masterLabelCheckerEnabled = true;
private boolean mavenJobTypeCheckerEnabled = true;
private boolean multibranchJobTypeCheckerEnabled = true;
private boolean nullSCMCheckerEnabled = true;
private boolean pollingSCMTriggerCheckerEnabled = true;
private boolean slaveDescriptionCheckerEnabled = true;
private boolean slaveLabelCheckerEnabled = true;
private boolean slaveVersionCheckerEnabled = true;
private boolean timeoutCheckerEnabled = true;
private boolean timerTriggerCheckerEnabled = true;
private boolean windowsSlaveLaunchCheckerEnabled = true;

private int hardcodedScriptThreshold = HardcodedScriptChecker.THRESHOLD;

public JenkinsLintGlobalConfiguration() {
load();
}

public static JenkinsLintGlobalConfiguration get() {
return Jenkins.getInstance().getInjector().getInstance(JenkinsLintGlobalConfiguration.class);
}

public boolean isArtifactCheckerEnabled() {
return artifactCheckerEnabled;
}

public void setArtifactCheckerEnabled(boolean artifactCheckerEnabled) {
this.artifactCheckerEnabled = artifactCheckerEnabled;
}

@Override
public String getDisplayName() {
return Messages.DisplayName();
}

@Override
public boolean configure(StaplerRequest req, JSONObject json) throws FormException {
req.bindJSON(this, json.getJSONObject("jenkinslint"));
req.bindJSON(this, json.getJSONObject("jenkinslint-checkers"));

save();
return true;
}

public boolean isBfaCheckerEnabled() {
return get().bfaCheckerEnabled;
}

public void setBfaCheckerEnabled(boolean bfaCheckerEnabled) {
this.bfaCheckerEnabled = bfaCheckerEnabled;
}

public boolean isCleanupWorkspaceCheckerEnabled() {
return get().cleanupWorkspaceCheckerEnabled;
}

public void setCleanupWorkspaceCheckerEnabled(boolean cleanupWorkspaceCheckerEnabled) {
this.cleanupWorkspaceCheckerEnabled = cleanupWorkspaceCheckerEnabled;
}

public boolean isGitRefCheckerEnabled() {
return get().gitRefCheckerEnabled;
}

public void setGitRefCheckerEnabled(boolean gitRefCheckerEnabled) {
this.gitRefCheckerEnabled = gitRefCheckerEnabled;
}

public boolean isGitRefSubmoduleCheckerEnabled() {
return get().gitRefSubmoduleCheckerEnabled;
}

public void setGitRefSubmoduleCheckerEnabled(boolean gitRefSubmoduleCheckerEnabled) {
this.gitRefSubmoduleCheckerEnabled = gitRefSubmoduleCheckerEnabled;
}

public boolean isGitShallowCheckerEnabled() {
return get().gitShallowCheckerEnabled;
}

public void setGitShallowCheckerEnabled(boolean gitShallowCheckerEnabled) {
this.gitShallowCheckerEnabled = gitShallowCheckerEnabled;
}

public boolean isGradleWrapperCheckerEnabled() {
return get().gradleWrapperCheckerEnabled;
}

public void setGradleWrapperCheckerEnabled(boolean gradleWrapperCheckerEnabled) {
this.gradleWrapperCheckerEnabled = gradleWrapperCheckerEnabled;
}

public boolean isGroovySystemExitCheckerEnabled() {
return get().groovySystemExitCheckerEnabled;
}

public void setGroovySystemExitCheckerEnabled(boolean groovySystemExitCheckerEnabled) {
this.groovySystemExitCheckerEnabled = groovySystemExitCheckerEnabled;
}

public boolean isHardcodedScriptCheckerEnabled() {
return get().hardcodedScriptCheckerEnabled;
}

public void setHardcodedScriptCheckerEnabled(boolean hardcodedScriptCheckerEnabled) {
this.hardcodedScriptCheckerEnabled = hardcodedScriptCheckerEnabled;
}

public boolean isJavadocCheckerEnabled() {
return get().javadocCheckerEnabled;
}

public void setJavadocCheckerEnabled(boolean javadocCheckerEnabled) {
this.javadocCheckerEnabled = javadocCheckerEnabled;
}

public boolean isJobAssignedLabelCheckerEnabled() {
return get().jobAssignedLabelCheckerEnabled;
}

public void setJobAssignedLabelCheckerEnabled(boolean jobAssignedLabelCheckerEnabled) {
this.jobAssignedLabelCheckerEnabled = jobAssignedLabelCheckerEnabled;
}

public boolean isJobDescriptionCheckerEnabled() {
return get().jobDescriptionCheckerEnabled;
}

public void setJobDescriptionCheckerEnabled(boolean jobDescriptionCheckerEnabled) {
this.jobDescriptionCheckerEnabled = jobDescriptionCheckerEnabled;
}

public boolean isJobLogRotatorCheckerEnabled() {
return get().jobLogRotatorCheckerEnabled;
}

public void setJobLogRotatorCheckerEnabled(boolean jobLogRotatorCheckerEnabled) {
this.jobLogRotatorCheckerEnabled = jobLogRotatorCheckerEnabled;
}

public boolean isJobNameCheckerEnabled() {
return get().jobNameCheckerEnabled;
}

public void setJobNameCheckerEnabled(boolean jobNameCheckerEnabled) {
this.jobNameCheckerEnabled = jobNameCheckerEnabled;
}

public boolean isMasterLabelCheckerEnabled() {
return get().masterLabelCheckerEnabled;
}

public void setMasterLabelCheckerEnabled(boolean masterLabelCheckerEnabled) {
this.masterLabelCheckerEnabled = masterLabelCheckerEnabled;
}

public boolean isMavenJobTypeCheckerEnabled() {
return get().mavenJobTypeCheckerEnabled;
}

public void setMavenJobTypeCheckerEnabled(boolean mavenJobTypeCheckerEnabled) {
this.mavenJobTypeCheckerEnabled = mavenJobTypeCheckerEnabled;
}

public boolean isMultibranchJobTypeCheckerEnabled() {
return get().multibranchJobTypeCheckerEnabled;
}

public void setMultibranchJobTypeCheckerEnabled(boolean multibranchJobTypeCheckerEnabled) {
this.multibranchJobTypeCheckerEnabled = multibranchJobTypeCheckerEnabled;
}

public boolean isNullSCMCheckerEnabled() {
return get().nullSCMCheckerEnabled;
}

public void setNullSCMCheckerEnabled(boolean nullSCMCheckerEnabled) {
this.nullSCMCheckerEnabled = nullSCMCheckerEnabled;
}

public boolean isPollingSCMTriggerCheckerEnabled() {
return get().pollingSCMTriggerCheckerEnabled;
}

public void setPollingSCMTriggerCheckerEnabled(boolean pollingSCMTriggerCheckerEnabled) {
this.pollingSCMTriggerCheckerEnabled = pollingSCMTriggerCheckerEnabled;
}

public boolean isSlaveDescriptionCheckerEnabled() {
return get().slaveDescriptionCheckerEnabled;
}

public void setSlaveDescriptionCheckerEnabled(boolean slaveDescriptionCheckerEnabled) {
this.slaveDescriptionCheckerEnabled = slaveDescriptionCheckerEnabled;
}

public boolean isSlaveLabelCheckerEnabled() {
return get().slaveLabelCheckerEnabled;
}

public void setSlaveLabelCheckerEnabled(boolean slaveLabelCheckerEnabled) {
this.slaveLabelCheckerEnabled = slaveLabelCheckerEnabled;
}

public boolean isSlaveVersionCheckerEnabled() {
return get().slaveVersionCheckerEnabled;
}

public void setSlaveVersionCheckerEnabled(boolean slaveVersionCheckerEnabled) {
this.slaveVersionCheckerEnabled = slaveVersionCheckerEnabled;
}

public boolean isTimeoutCheckerEnabled() {
return get().timeoutCheckerEnabled;
}

public void setTimeoutCheckerEnabled(boolean timeoutCheckerEnabled) {
this.timeoutCheckerEnabled = timeoutCheckerEnabled;
}

public boolean isTimerTriggerCheckerEnabled() {
return get().timerTriggerCheckerEnabled;
}

public void setTimerTriggerCheckerEnabled(boolean timerTriggerCheckerEnabled) {
this.timerTriggerCheckerEnabled = timerTriggerCheckerEnabled;
}

public boolean isWindowsSlaveLaunchCheckerEnabled() {
return get().windowsSlaveLaunchCheckerEnabled;
}

public void setWindowsSlaveLaunchCheckerEnabled(boolean windowsSlaveLaunchCheckerEnabled) {
this.windowsSlaveLaunchCheckerEnabled = windowsSlaveLaunchCheckerEnabled;
}

public boolean isGlobalEnabled() {
return get().globalEnabled;
}

public void setGlobalEnabled(boolean globalEnabled) {
this.globalEnabled = globalEnabled;
}

public boolean isJobActionEnabled() {
return get().jobActionEnabled;
}

public void setJobActionEnabled(boolean jobActionEnabled) {
this.jobActionEnabled = jobActionEnabled;
}

public int getHardcodedScriptThreshold() {
return hardcodedScriptThreshold;
}

public void setHardcodedScriptThreshold(int hardcodedScriptThreshold) {
this.hardcodedScriptThreshold = hardcodedScriptThreshold;
}

/**
* Performs on-the-fly validation of the form field 'name'.
*
* @param value
* This parameter receives the value that the user has typed.
* @return
* Indicates the outcome of the validation. This is sent to the browser.
* <p>
* Note that returning {@link FormValidation#error(String)} does not
* prevent the form from being saved. It just means that a message
* will be displayed to the user.
*/
public FormValidation doCheckHardcodedScriptThreshold(@QueryParameter int value)
throws IOException, ServletException {
if (value <= 1)
return FormValidation.error("Please set a value greater than 1");
return FormValidation.ok();
}
}
Expand Up @@ -21,7 +21,14 @@ public final class JobLintAction extends AbstractAction implements Action {
private Job job;

public static boolean isDisabled () {
return Boolean.getBoolean(JobLintAction.class.getName() + ".disabled");
// DEPRECATED: Release 0.11.0
if (Boolean.getBoolean(JobLintAction.class.getName() + ".disabled")) {
LOG.warning("This system property is deprecated and it will be removed in the release 0.11.0. " +
"We encourage to use the Global Settings properties.");
return true;
} else {
return !JenkinsLintGlobalConfiguration.get().isJobActionEnabled();
}
}

public JobLintAction(AbstractProject<?, ?> project) {
Expand All @@ -42,7 +49,7 @@ public void getData() throws IOException {
this.reloadCheckList();
this.job = new Job(this.project.getName(), this.project.getUrl());
for (InterfaceCheck checker : this.getCheckList()) {
this.job.addLint(new Lint(checker.getName(), checker.executeCheck(this.project), checker.isIgnored(this.project.getDescription())));
this.job.addLint(new Lint(checker.getName(), checker.executeCheck(this.project), checker.isIgnored(this.project.getDescription()), checker.isEnabled()) );
}
LOG.log(Level.FINE, this.job.getLintList().toString());
}
Expand Down

0 comments on commit c05f72c

Please sign in to comment.