diff --git a/pom.xml b/pom.xml index 7a7596ad..af2ac261 100644 --- a/pom.xml +++ b/pom.xml @@ -11,8 +11,8 @@ - 1.554.1 - 1.554.1 + 1.580 + 1.580 false @@ -60,6 +60,11 @@ org.apache.maven.plugins maven-checkstyle-plugin + + org.apache.maven.plugins + maven-surefire-report-plugin + 2.20 + @@ -130,7 +135,7 @@ org.jenkins-ci.plugins git - 2.3.4 + 2.4.1 test @@ -162,6 +167,13 @@ test + + org.jenkins-ci.plugins + matrix-project + 1.4.1 + test + + org.jenkins-ci.plugins diff --git a/src/main/java/org/jenkins/ci/plugins/jenkinslint/JenkinsLintAction.java b/src/main/java/org/jenkins/ci/plugins/jenkinslint/JenkinsLintAction.java index 28244c19..95f00210 100644 --- a/src/main/java/org/jenkins/ci/plugins/jenkinslint/JenkinsLintAction.java +++ b/src/main/java/org/jenkins/ci/plugins/jenkinslint/JenkinsLintAction.java @@ -5,45 +5,19 @@ import hudson.model.Node; import hudson.model.RootAction; import jenkins.model.Jenkins; -import org.jenkins.ci.plugins.jenkinslint.check.ArtifactChecker; -import org.jenkins.ci.plugins.jenkinslint.check.CleanupWorkspaceChecker; -import org.jenkins.ci.plugins.jenkinslint.check.GitRefChecker; -import org.jenkins.ci.plugins.jenkinslint.check.GitShallowChecker; -import org.jenkins.ci.plugins.jenkinslint.check.GradleWrapperChecker; -import org.jenkins.ci.plugins.jenkinslint.check.GroovySystemExitChecker; -import org.jenkins.ci.plugins.jenkinslint.check.HardcodedScriptChecker; -import org.jenkins.ci.plugins.jenkinslint.check.JavadocChecker; -import org.jenkins.ci.plugins.jenkinslint.check.JobAssignedLabelChecker; -import org.jenkins.ci.plugins.jenkinslint.check.JobDescriptionChecker; -import org.jenkins.ci.plugins.jenkinslint.check.JobLogRotatorChecker; -import org.jenkins.ci.plugins.jenkinslint.check.JobNameChecker; -import org.jenkins.ci.plugins.jenkinslint.check.TimerTriggerChecker; -import org.jenkins.ci.plugins.jenkinslint.check.MasterLabelChecker; -import org.jenkins.ci.plugins.jenkinslint.check.MavenJobTypeChecker; -import org.jenkins.ci.plugins.jenkinslint.check.MultibranchJobTypeChecker; -import org.jenkins.ci.plugins.jenkinslint.check.NullSCMChecker; -import org.jenkins.ci.plugins.jenkinslint.check.PollingSCMTriggerChecker; -import org.jenkins.ci.plugins.jenkinslint.check.SlaveDescriptionChecker; -import org.jenkins.ci.plugins.jenkinslint.check.SlaveLabelChecker; -import org.jenkins.ci.plugins.jenkinslint.check.SlaveVersionChecker; -import org.jenkins.ci.plugins.jenkinslint.check.TimeoutChecker; -import org.jenkins.ci.plugins.jenkinslint.check.WindowsSlaveLaunchChecker; import org.jenkins.ci.plugins.jenkinslint.model.AbstractAction; import org.jenkins.ci.plugins.jenkinslint.model.InterfaceCheck; import org.jenkins.ci.plugins.jenkinslint.model.InterfaceSlaveCheck; import org.jenkins.ci.plugins.jenkinslint.model.Job; import org.jenkins.ci.plugins.jenkinslint.model.Lint; import org.jenkins.ci.plugins.jenkinslint.model.Slave; -import org.jenkins.ci.plugins.jenkinslint.model.AbstractCheck; import java.io.IOException; -import java.util.ArrayList; import java.util.Hashtable; import java.util.logging.Level; import java.util.logging.Logger; import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.ExportedBean; -import hudson.model.Api; @ExportedBean @Extension diff --git a/src/main/java/org/jenkins/ci/plugins/jenkinslint/check/GitRefSubmoduleChecker.java b/src/main/java/org/jenkins/ci/plugins/jenkinslint/check/GitRefSubmoduleChecker.java new file mode 100644 index 00000000..b7aa2a55 --- /dev/null +++ b/src/main/java/org/jenkins/ci/plugins/jenkinslint/check/GitRefSubmoduleChecker.java @@ -0,0 +1,64 @@ +package org.jenkins.ci.plugins.jenkinslint.check; + +import hudson.PluginWrapper; +import hudson.model.Item; +import hudson.model.Project; +import jenkins.model.Jenkins; +import org.jenkins.ci.plugins.jenkinslint.model.AbstractCheck; + +import java.lang.reflect.Method; +import java.util.AbstractList; +import java.util.logging.Level; + +/** + * @author Victor Martinez + */ +public class GitRefSubmoduleChecker extends AbstractCheck { + + public GitRefSubmoduleChecker() { + super(); + this.setDescription(Messages.GitRefSubmoduleCheckerDesc()); + this.setSeverity(Messages.GitRefSubmoduleCheckerSeverity()); + } + + public boolean executeCheck(Item item) { + if (item instanceof Project) { + PluginWrapper plugin = Jenkins.getInstance().pluginManager.getPlugin("git"); + if (plugin!=null && plugin.getVersionNumber().isNewerThan(new hudson.util.VersionNumber("2.4.0"))) { + if (Jenkins.getInstance().pluginManager.getPlugin("git") != null) { + if (((Project) item).getScm().getClass().getName().endsWith("GitSCM")) { + boolean status = true; + try { + Method method = ((Project) item).getScm().getClass().getMethod("getExtensions",null); + Object extensionsList = method.invoke(((Project) item).getScm()); + if (extensionsList instanceof AbstractList) { + for (Object extension : ((AbstractList) extensionsList)) { + if (extension.getClass().getName().endsWith("SubmoduleOption")) { + Object reference = extension.getClass().getMethod("getReference",null).invoke(extension); + if (reference instanceof String) { + LOG.log(Level.WARNING, "foundXXX " + reference); + status = ((String) reference).isEmpty(); + } + } + } + } + } catch (Exception e) { + LOG.log(Level.WARNING, "Exception " + e.getMessage(), e.getCause()); + status = false; + } finally { + return status; + } + } + } else { + LOG.log(Level.FINE, "Plugin GIT hasn't been configured in this project"); + return false; + } + } else { + LOG.log(Level.FINE, "Plugin GIT doesn't exist"); + return false; + } + + } + return false; + } +} diff --git a/src/main/java/org/jenkins/ci/plugins/jenkinslint/check/GradleWrapperChecker.java b/src/main/java/org/jenkins/ci/plugins/jenkinslint/check/GradleWrapperChecker.java index e93ae6f6..f4a82923 100644 --- a/src/main/java/org/jenkins/ci/plugins/jenkinslint/check/GradleWrapperChecker.java +++ b/src/main/java/org/jenkins/ci/plugins/jenkinslint/check/GradleWrapperChecker.java @@ -1,6 +1,5 @@ package org.jenkins.ci.plugins.jenkinslint.check; -import hudson.matrix.MatrixProject; import hudson.model.Item; import hudson.model.Project; import hudson.tasks.Builder; @@ -37,10 +36,16 @@ public boolean executeCheck(Item item) { if (item instanceof Project) { found = isGradlew(((Project) item).getBuilders()); } - if (item instanceof MatrixProject) { - found = isGradlew(((MatrixProject) item).getBuilders()); + if (item.getClass().getSimpleName().equals("MatrixProject")) { + try { + Object getBuilders = item.getClass().getMethod("getBuilders", null).invoke(item); + if (getBuilders instanceof List) { + found = isGradlew((List) getBuilders); + } + }catch (Exception e) { + LOG.log(Level.WARNING, "Exception " + e.getMessage(), e.getCause()); + } } - } return found; } diff --git a/src/main/java/org/jenkins/ci/plugins/jenkinslint/check/GroovySystemExitChecker.java b/src/main/java/org/jenkins/ci/plugins/jenkinslint/check/GroovySystemExitChecker.java index fab7ad46..ac4f2219 100644 --- a/src/main/java/org/jenkins/ci/plugins/jenkinslint/check/GroovySystemExitChecker.java +++ b/src/main/java/org/jenkins/ci/plugins/jenkinslint/check/GroovySystemExitChecker.java @@ -1,6 +1,5 @@ package org.jenkins.ci.plugins.jenkinslint.check; -import hudson.matrix.MatrixProject; import hudson.model.Item; import hudson.model.Project; import hudson.tasks.Builder; @@ -38,10 +37,16 @@ public boolean executeCheck(Item item) { if (item instanceof Project) { found = isSystemExit(((Project) item).getBuilders()); } - if (item instanceof MatrixProject) { - found = isSystemExit(((MatrixProject) item).getBuilders()); + if (item.getClass().getSimpleName().equals("MatrixProject")) { + try { + Object getBuilders = item.getClass().getMethod("getBuilders", null).invoke(item); + if (getBuilders instanceof List) { + found = isSystemExit((List) getBuilders); + } + }catch (Exception e) { + LOG.log(Level.WARNING, "Exception " + e.getMessage(), e.getCause()); + } } - } else { LOG.log(Level.INFO, "Groovy is not installed"); } diff --git a/src/main/java/org/jenkins/ci/plugins/jenkinslint/check/HardcodedScriptChecker.java b/src/main/java/org/jenkins/ci/plugins/jenkinslint/check/HardcodedScriptChecker.java index c07fbd2e..3fb964a0 100644 --- a/src/main/java/org/jenkins/ci/plugins/jenkinslint/check/HardcodedScriptChecker.java +++ b/src/main/java/org/jenkins/ci/plugins/jenkinslint/check/HardcodedScriptChecker.java @@ -1,11 +1,9 @@ package org.jenkins.ci.plugins.jenkinslint.check; -import hudson.matrix.MatrixProject; import hudson.model.Item; import hudson.model.Project; import hudson.tasks.Builder; import hudson.tasks.CommandInterpreter; -import jenkins.model.Jenkins; import org.jenkins.ci.plugins.jenkinslint.model.AbstractCheck; import java.util.List; @@ -41,8 +39,15 @@ public boolean executeCheck(Item item) { if (item instanceof Project) { found = isBuilderHarcoded (((Project)item).getBuilders()); } - if (item instanceof MatrixProject) { - found = isBuilderHarcoded (((MatrixProject)item).getBuilders()); + if (item.getClass().getSimpleName().equals("MatrixProject")) { + try { + Object getBuilders = item.getClass().getMethod("getBuilders", null).invoke(item); + if (getBuilders instanceof List) { + found = isBuilderHarcoded((List) getBuilders); + } + }catch (Exception e) { + LOG.log(Level.WARNING, "Exception " + e.getMessage(), e.getCause()); + } } return found; } diff --git a/src/main/java/org/jenkins/ci/plugins/jenkinslint/check/TimeoutChecker.java b/src/main/java/org/jenkins/ci/plugins/jenkinslint/check/TimeoutChecker.java index a7b247b8..d014ce40 100644 --- a/src/main/java/org/jenkins/ci/plugins/jenkinslint/check/TimeoutChecker.java +++ b/src/main/java/org/jenkins/ci/plugins/jenkinslint/check/TimeoutChecker.java @@ -1,6 +1,5 @@ package org.jenkins.ci.plugins.jenkinslint.check; -import hudson.matrix.MatrixProject; import hudson.model.Descriptor; import hudson.model.Item; import hudson.model.Project; @@ -8,7 +7,6 @@ import hudson.util.DescribableList; import jenkins.model.Jenkins; import org.jenkins.ci.plugins.jenkinslint.model.AbstractCheck; - import java.lang.reflect.Method; import java.util.List; import java.util.logging.Level; @@ -40,8 +38,15 @@ public boolean executeCheck(Item item) { if (item instanceof Project) { notfound = !isTimeout(((Project) item).getBuildWrappersList()); } - if (item instanceof MatrixProject) { - notfound = !isTimeout(((MatrixProject) item).getBuildWrappersList()); + if (item.getClass().getSimpleName().equals("MatrixProject")) { + try { + Object getBuildWrappersList = item.getClass().getMethod("getBuildWrappersList", null).invoke(item); + if (getBuildWrappersList instanceof List) { + notfound = !isTimeout((List) getBuildWrappersList); + } + }catch (Exception e) { + LOG.log(Level.WARNING, "Exception " + e.getMessage(), e.getCause()); + } } } return notfound; diff --git a/src/main/java/org/jenkins/ci/plugins/jenkinslint/model/AbstractAction.java b/src/main/java/org/jenkins/ci/plugins/jenkinslint/model/AbstractAction.java index b96b7c43..175d1d9e 100644 --- a/src/main/java/org/jenkins/ci/plugins/jenkinslint/model/AbstractAction.java +++ b/src/main/java/org/jenkins/ci/plugins/jenkinslint/model/AbstractAction.java @@ -2,29 +2,7 @@ import hudson.model.Api; import org.jenkins.ci.plugins.jenkinslint.Messages; -import org.jenkins.ci.plugins.jenkinslint.check.ArtifactChecker; -import org.jenkins.ci.plugins.jenkinslint.check.CleanupWorkspaceChecker; -import org.jenkins.ci.plugins.jenkinslint.check.GitRefChecker; -import org.jenkins.ci.plugins.jenkinslint.check.GitShallowChecker; -import org.jenkins.ci.plugins.jenkinslint.check.GradleWrapperChecker; -import org.jenkins.ci.plugins.jenkinslint.check.GroovySystemExitChecker; -import org.jenkins.ci.plugins.jenkinslint.check.HardcodedScriptChecker; -import org.jenkins.ci.plugins.jenkinslint.check.JavadocChecker; -import org.jenkins.ci.plugins.jenkinslint.check.JobAssignedLabelChecker; -import org.jenkins.ci.plugins.jenkinslint.check.JobDescriptionChecker; -import org.jenkins.ci.plugins.jenkinslint.check.JobLogRotatorChecker; -import org.jenkins.ci.plugins.jenkinslint.check.JobNameChecker; -import org.jenkins.ci.plugins.jenkinslint.check.MasterLabelChecker; -import org.jenkins.ci.plugins.jenkinslint.check.MavenJobTypeChecker; -import org.jenkins.ci.plugins.jenkinslint.check.MultibranchJobTypeChecker; -import org.jenkins.ci.plugins.jenkinslint.check.NullSCMChecker; -import org.jenkins.ci.plugins.jenkinslint.check.PollingSCMTriggerChecker; -import org.jenkins.ci.plugins.jenkinslint.check.SlaveDescriptionChecker; -import org.jenkins.ci.plugins.jenkinslint.check.SlaveLabelChecker; -import org.jenkins.ci.plugins.jenkinslint.check.SlaveVersionChecker; -import org.jenkins.ci.plugins.jenkinslint.check.TimeoutChecker; -import org.jenkins.ci.plugins.jenkinslint.check.TimerTriggerChecker; -import org.jenkins.ci.plugins.jenkinslint.check.WindowsSlaveLaunchChecker; +import org.jenkins.ci.plugins.jenkinslint.check.*; import java.io.IOException; import java.util.ArrayList; @@ -97,6 +75,7 @@ protected void reloadCheckList() { checkList.add(new GroovySystemExitChecker()); checkList.add(new GitRefChecker()); checkList.add(new TimerTriggerChecker()); + checkList.add(new GitRefSubmoduleChecker()); } protected void reloadSlaveCheckList() { diff --git a/src/main/resources/org/jenkins/ci/plugins/jenkinslint/check/Messages.properties b/src/main/resources/org/jenkins/ci/plugins/jenkinslint/check/Messages.properties index 0cbf4480..2d7b105a 100644 --- a/src/main/resources/org/jenkins/ci/plugins/jenkinslint/check/Messages.properties +++ b/src/main/resources/org/jenkins/ci/plugins/jenkinslint/check/Messages.properties @@ -18,6 +18,12 @@ GitRefCheckerDesc=\ GitRefCheckerSeverity=Low +GitRefSubmoduleCheckerDesc=\ + When setting Jenkins Jobs with Git SCM you might speed up the cloning time if \ + you use git ref repos when cloning submodules.\ + +GitRefSubmoduleCheckerSeverity=Low + GitShallowCheckerDesc=\ When setting Jenkins Jobs with Git SCM Artifact you might speed up the \ cloning time if you use shallow cloning.\ diff --git a/src/test/java/org/jenkins/ci/plugins/jenkinslint/JenkinsLintActionTestCase.java b/src/test/java/org/jenkins/ci/plugins/jenkinslint/JenkinsLintActionTestCase.java index 4ae60fb5..df784aa2 100644 --- a/src/test/java/org/jenkins/ci/plugins/jenkinslint/JenkinsLintActionTestCase.java +++ b/src/test/java/org/jenkins/ci/plugins/jenkinslint/JenkinsLintActionTestCase.java @@ -83,6 +83,7 @@ public void testUITable() throws Exception { assertTrue(content.contains(htmlLint("GroovySystemExitChecker", "JL-17"))); assertTrue(content.contains(htmlLint("GitRefChecker", "JL-18"))); assertTrue(content.contains(htmlLint("TimerTriggerChecker", "JL-19"))); + assertTrue(content.contains(htmlLint("GitRefSubmoduleChecker", "JL-20"))); } private String htmlLint (String name, String id) { diff --git a/src/test/java/org/jenkins/ci/plugins/jenkinslint/check/GitRefSubmoduleCheckerTestCase.java b/src/test/java/org/jenkins/ci/plugins/jenkinslint/check/GitRefSubmoduleCheckerTestCase.java new file mode 100644 index 00000000..8c32d63f --- /dev/null +++ b/src/test/java/org/jenkins/ci/plugins/jenkinslint/check/GitRefSubmoduleCheckerTestCase.java @@ -0,0 +1,72 @@ +package org.jenkins.ci.plugins.jenkinslint.check; + +import hudson.model.FreeStyleProject; +import hudson.plugins.git.extensions.GitSCMExtension; +import hudson.plugins.git.extensions.impl.CleanCheckout; +import hudson.plugins.git.extensions.impl.SubmoduleOption; +import org.junit.Test; + +import java.util.ArrayList; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * GitRefSubmoduleChecker Test Case. + * + * @author Victor Martinez + */ +public class GitRefSubmoduleCheckerTestCase extends AbstractCheckerTestCase { + private GitRefSubmoduleChecker checker = new GitRefSubmoduleChecker(); + + @Test public void testEmptyJob() throws Exception { + FreeStyleProject project = j.createFreeStyleProject(); + assertFalse(checker.executeCheck(project)); + } + @Test public void testGitSCMJob() throws Exception { + FreeStyleProject project = j.createFreeStyleProject(); + project.setScm(new hudson.plugins.git.GitSCM("")); + assertTrue(checker.executeCheck(project)); + } + @Test public void testGitSCMWithFurtherValuesJob() throws Exception { + FreeStyleProject project = j.createFreeStyleProject(); + project.setScm(new hudson.plugins.git.GitSCM(null, null, false, null, null, "", null)); + assertTrue(checker.executeCheck(project)); + } + @Test public void testGitSCMWithEmptyExtensionJob() throws Exception { + FreeStyleProject project = j.createFreeStyleProject(); + ArrayList extensions = new ArrayList(); + project.setScm(new hudson.plugins.git.GitSCM(null,null,false,null,null,"", extensions)); + assertTrue(checker.executeCheck(project)); + } + @Test public void testGitSCMWithSomeExtensionJob() throws Exception { + FreeStyleProject project = j.createFreeStyleProject(); + ArrayList extensions = new ArrayList(); + extensions.add(new CleanCheckout()); + project.setScm(new hudson.plugins.git.GitSCM(null,null,false,null,null,"", extensions)); + assertTrue(checker.executeCheck(project)); + extensions.add(new SubmoduleOption(false,false,false,null,1)); + project.setScm(new hudson.plugins.git.GitSCM(null,null,false,null,null, "", extensions)); + assertTrue(checker.executeCheck(project)); + } + @Test public void testGitSCMWithCloneOptionExtensionNoRefJob() throws Exception { + FreeStyleProject project = j.createFreeStyleProject(); + ArrayList extensions = new ArrayList(); + extensions.add(new SubmoduleOption(false, false,false,null,1)); + project.setScm(new hudson.plugins.git.GitSCM(null,null,false,null,null,"", extensions)); + assertTrue(checker.executeCheck(project)); + } + @Test public void testGitSCMWithCloneOptionExtensionRefJob() throws Exception { + FreeStyleProject project = j.createFreeStyleProject(); + ArrayList extensions = new ArrayList(); + extensions.add(new SubmoduleOption(false,false,false,"/path/.git-cache",1)); + project.setScm(new hudson.plugins.git.GitSCM(null,null,false,null,null,"", extensions)); + assertFalse(checker.executeCheck(project)); + } + @Test public void testControlComment() throws Exception { + FreeStyleProject project = j.createFreeStyleProject(); + assertFalse(checker.isIgnored(project.getDescription())); + project.setDescription("#lint:ignore:" + checker.getClass().getSimpleName()); + assertTrue(checker.isIgnored(project.getDescription())); + } +} diff --git a/src/test/java/org/jenkins/ci/plugins/jenkinslint/check/MasterLabelCheckerTestCase.java b/src/test/java/org/jenkins/ci/plugins/jenkinslint/check/MasterLabelCheckerTestCase.java index 7162e29b..3fad460c 100644 --- a/src/test/java/org/jenkins/ci/plugins/jenkinslint/check/MasterLabelCheckerTestCase.java +++ b/src/test/java/org/jenkins/ci/plugins/jenkinslint/check/MasterLabelCheckerTestCase.java @@ -16,7 +16,7 @@ public class MasterLabelCheckerTestCase extends AbstractCheckerTestCase { @Test public void testDefaultJob() throws Exception { FreeStyleProject project = j.createFreeStyleProject(); - assertTrue(checker.executeCheck(project)); + assertFalse(checker.executeCheck(project)); } @Test public void testNonDefaultJob() throws Exception { FreeStyleProject project = j.createFreeStyleProject();