From 04a2844092e7a0d564e1b761bd62edd50473d2f5 Mon Sep 17 00:00:00 2001 From: Aboorva Devarajan Date: Tue, 5 Apr 2022 05:16:45 +0530 Subject: [PATCH] add a default template path for when we can't find a pipeline_template --- ...fig-driven-pipeline-project-recognizer.png | Bin 27513 -> 20388 bytes ...figDrivenWorkflowBranchProjectFactory.java | 19 +++++++- ...ivenWorkflowMultiBranchProjectFactory.java | 18 ++++++++ .../template/ConfigFileSCMBinder.java | 41 +++++++++++------- .../config.jelly | 4 ++ .../help-pipelinePath.html | 3 ++ .../config.jelly | 4 ++ .../help-pipelinePath.html | 3 ++ 8 files changed, 74 insertions(+), 18 deletions(-) create mode 100644 src/main/resources/org/jenkinsci/plugins/workflow/multibranch/template/ConfigDrivenWorkflowBranchProjectFactory/help-pipelinePath.html create mode 100644 src/main/resources/org/jenkinsci/plugins/workflow/multibranch/template/ConfigDrivenWorkflowMultiBranchProjectFactory/help-pipelinePath.html diff --git a/images/config-driven-pipeline-project-recognizer.png b/images/config-driven-pipeline-project-recognizer.png index 8ec025ad55a2246c480c8a23808144ef46c553df..27e1574283b9ea1a36bfb4eeb091a1b0767ba459 100644 GIT binary patch literal 20388 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 diff --git a/src/main/java/org/jenkinsci/plugins/workflow/multibranch/template/ConfigDrivenWorkflowBranchProjectFactory.java b/src/main/java/org/jenkinsci/plugins/workflow/multibranch/template/ConfigDrivenWorkflowBranchProjectFactory.java index d2c546d..d78c3a8 100644 --- a/src/main/java/org/jenkinsci/plugins/workflow/multibranch/template/ConfigDrivenWorkflowBranchProjectFactory.java +++ b/src/main/java/org/jenkinsci/plugins/workflow/multibranch/template/ConfigDrivenWorkflowBranchProjectFactory.java @@ -21,15 +21,20 @@ public class ConfigDrivenWorkflowBranchProjectFactory extends AbstractWorkflowBranchProjectFactory { // TODO: Make this a parameter that users can adjust to their liking public static final String USER_DEFINITION_PATH = ".yourconfig.yml"; + public static final String USER_DEFINITION_PIPELINE_PATH = "Jenkinsfile"; public static final String PIPELINE_TEMPLATE = "pipeline_template"; private String scriptPath = USER_DEFINITION_PATH; + private String pipelinePath = USER_DEFINITION_PIPELINE_PATH; private SCM jenkinsFileScm = null; public Object readResolve() { if (this.scriptPath == null) { this.scriptPath = USER_DEFINITION_PATH; } + if (this.pipelinePath == null) { + this.pipelinePath = USER_DEFINITION_PIPELINE_PATH; + } return this; } @@ -42,8 +47,18 @@ public void setScriptPath(String scriptPath) { } } + @DataBoundSetter + public void setPipelinePath(String pipelinePath) { + if (StringUtils.isEmpty(pipelinePath)) { + this.pipelinePath = USER_DEFINITION_PIPELINE_PATH; + } else { + this.pipelinePath = pipelinePath; + } + } + public String getScriptPath() { return scriptPath; } + public String getPipelinePath() { return pipelinePath; } public SCM getJenkinsFileScm() { return jenkinsFileScm; @@ -60,7 +75,7 @@ public ConfigDrivenWorkflowBranchProjectFactory() {} @Override protected FlowDefinition createDefinition() { // This creates the CpsScmFlowDefinition... create a new type of "binder"??? // We need a non-hardcoded version of this class... it does almost everything we want already... - return new ConfigFileSCMBinder(scriptPath, jenkinsFileScm); + return new ConfigFileSCMBinder(scriptPath, pipelinePath, jenkinsFileScm); } @Override protected SCMSourceCriteria getSCMSourceCriteria(SCMSource source) { @@ -109,4 +124,4 @@ public Collection> getApplicableDescriptors() { } } -} \ No newline at end of file +} diff --git a/src/main/java/org/jenkinsci/plugins/workflow/multibranch/template/ConfigDrivenWorkflowMultiBranchProjectFactory.java b/src/main/java/org/jenkinsci/plugins/workflow/multibranch/template/ConfigDrivenWorkflowMultiBranchProjectFactory.java index d61aad3..e45aa65 100644 --- a/src/main/java/org/jenkinsci/plugins/workflow/multibranch/template/ConfigDrivenWorkflowMultiBranchProjectFactory.java +++ b/src/main/java/org/jenkinsci/plugins/workflow/multibranch/template/ConfigDrivenWorkflowMultiBranchProjectFactory.java @@ -18,6 +18,8 @@ import java.util.Collection; import static org.jenkinsci.plugins.workflow.multibranch.template.ConfigDrivenWorkflowBranchProjectFactory.USER_DEFINITION_PATH; +import static org.jenkinsci.plugins.workflow.multibranch.template.ConfigDrivenWorkflowBranchProjectFactory.USER_DEFINITION_PIPELINE_PATH; + /** * Defines organization folders by {@link WorkflowBranchProjectFactory}. @@ -25,12 +27,17 @@ public class ConfigDrivenWorkflowMultiBranchProjectFactory extends AbstractWorkflowMultiBranchProjectFactory { private String scriptPath = USER_DEFINITION_PATH; + private String pipelinePath = USER_DEFINITION_PIPELINE_PATH; + private SCM jenkinsFileScm = null; public Object readResolve() { if (this.scriptPath == null) { this.scriptPath = USER_DEFINITION_PATH; } + if (this.pipelinePath == null) { + this.pipelinePath = USER_DEFINITION_PIPELINE_PATH; + } return this; } @@ -43,8 +50,18 @@ public void setScriptPath(String scriptPath) { } } + @DataBoundSetter + public void setpipelinePath(String pipelinePath) { + if (StringUtils.isEmpty(pipelinePath)) { + this.pipelinePath = USER_DEFINITION_PIPELINE_PATH; + } else { + this.pipelinePath = pipelinePath; + } + } + public String getScriptPath() { return scriptPath; } + public String getPipelinePath() { return pipelinePath; } public SCM getJenkinsFileScm() { return jenkinsFileScm; @@ -65,6 +82,7 @@ public ConfigDrivenWorkflowMultiBranchProjectFactory() {} private ConfigDrivenWorkflowBranchProjectFactory newProjectFactory() { ConfigDrivenWorkflowBranchProjectFactory workflowBranchProjectFactory = new ConfigDrivenWorkflowBranchProjectFactory(); workflowBranchProjectFactory.setScriptPath(scriptPath); + workflowBranchProjectFactory.setPipelinePath(pipelinePath); workflowBranchProjectFactory.setJenkinsFileScm(jenkinsFileScm); return workflowBranchProjectFactory; } diff --git a/src/main/java/org/jenkinsci/plugins/workflow/multibranch/template/ConfigFileSCMBinder.java b/src/main/java/org/jenkinsci/plugins/workflow/multibranch/template/ConfigFileSCMBinder.java index 28cac1e..2bbe34a 100644 --- a/src/main/java/org/jenkinsci/plugins/workflow/multibranch/template/ConfigFileSCMBinder.java +++ b/src/main/java/org/jenkinsci/plugins/workflow/multibranch/template/ConfigFileSCMBinder.java @@ -56,6 +56,7 @@ import static org.jenkinsci.plugins.workflow.multibranch.template.ConfigDrivenWorkflowBranchProjectFactory.PIPELINE_TEMPLATE; import static org.jenkinsci.plugins.workflow.multibranch.template.ConfigDrivenWorkflowBranchProjectFactory.USER_DEFINITION_PATH; +import static org.jenkinsci.plugins.workflow.multibranch.template.ConfigDrivenWorkflowBranchProjectFactory.USER_DEFINITION_PIPELINE_PATH; /** * Checks out the desired version of {@link ConfigDrivenWorkflowBranchProjectFactory#USER_DEFINITION_PATH}. @@ -63,17 +64,22 @@ class ConfigFileSCMBinder extends FlowDefinition { private String scriptPath; + private String pipelinePath; private SCM jenkinsFileScm; public Object readResolve() { if (this.scriptPath == null) { this.scriptPath = USER_DEFINITION_PATH; } + if (this.pipelinePath == null) { + this.pipelinePath = USER_DEFINITION_PIPELINE_PATH; + } return this; } - @DataBoundConstructor public ConfigFileSCMBinder(String scriptPath, SCM jenkinsFileScm) { + @DataBoundConstructor public ConfigFileSCMBinder(String scriptPath, String pipelinePath, SCM jenkinsFileScm) { this.scriptPath = scriptPath; + this.pipelinePath = pipelinePath; this.jenkinsFileScm = jenkinsFileScm; } @@ -163,27 +169,30 @@ public Object readResolve() { } } } + + String jenkinsfilePathString; + if (configContents == null) { - String pipelineTemplateNotFound = - String.format("Could not find a value for %s in %s", PIPELINE_TEMPLATE, scriptPath); - throw new AbortException(pipelineTemplateNotFound); + jenkinsfilePathString = pipelinePath; } else { - String jenkinsfilePathString = + jenkinsfilePathString = ConfigurationValueFinder.findFirstConfigurationValue(configContents, - ConfigDrivenWorkflowBranchProjectFactory.PIPELINE_TEMPLATE); - - build.addAction(new ConfigFileEnvironmentContributingAction(configContents)); - - try (SCMFileSystem scriptFileSystem = SCMFileSystem.of(job, jenkinsFileScm)) { - if (scriptFileSystem != null) { - script = scriptFileSystem.child(jenkinsfilePathString).contentAsString(); - listener.getLogger().println("Obtained " + jenkinsfilePathString); + ConfigDrivenWorkflowBranchProjectFactory.PIPELINE_TEMPLATE); + if(jenkinsfilePathString == null) { + jenkinsfilePathString = pipelinePath; + } + } + build.addAction(new ConfigFileEnvironmentContributingAction(configContents)); - } + try (SCMFileSystem scriptFileSystem = SCMFileSystem.of(job, jenkinsFileScm)) { + if (scriptFileSystem != null) { + script = scriptFileSystem.child(jenkinsfilePathString).contentAsString(); + listener.getLogger().println("Obtained " + jenkinsfilePathString); - } catch (FileNotFoundException exception) { - throw new AbortException(String.format("Could not find file %s", jenkinsfilePathString)); } + + } catch (FileNotFoundException exception) { + throw new AbortException(String.format("Could not find file %s", jenkinsfilePathString)); } if (script != null) { diff --git a/src/main/resources/org/jenkinsci/plugins/workflow/multibranch/template/ConfigDrivenWorkflowBranchProjectFactory/config.jelly b/src/main/resources/org/jenkinsci/plugins/workflow/multibranch/template/ConfigDrivenWorkflowBranchProjectFactory/config.jelly index 2edaa1f..2e34807 100644 --- a/src/main/resources/org/jenkinsci/plugins/workflow/multibranch/template/ConfigDrivenWorkflowBranchProjectFactory/config.jelly +++ b/src/main/resources/org/jenkinsci/plugins/workflow/multibranch/template/ConfigDrivenWorkflowBranchProjectFactory/config.jelly @@ -29,5 +29,9 @@ THE SOFTWARE. + + + + diff --git a/src/main/resources/org/jenkinsci/plugins/workflow/multibranch/template/ConfigDrivenWorkflowBranchProjectFactory/help-pipelinePath.html b/src/main/resources/org/jenkinsci/plugins/workflow/multibranch/template/ConfigDrivenWorkflowBranchProjectFactory/help-pipelinePath.html new file mode 100644 index 0000000..9baae27 --- /dev/null +++ b/src/main/resources/org/jenkinsci/plugins/workflow/multibranch/template/ConfigDrivenWorkflowBranchProjectFactory/help-pipelinePath.html @@ -0,0 +1,3 @@ +
+ Relative default location of pipeline_template. +
diff --git a/src/main/resources/org/jenkinsci/plugins/workflow/multibranch/template/ConfigDrivenWorkflowMultiBranchProjectFactory/config.jelly b/src/main/resources/org/jenkinsci/plugins/workflow/multibranch/template/ConfigDrivenWorkflowMultiBranchProjectFactory/config.jelly index 2edaa1f..2e34807 100644 --- a/src/main/resources/org/jenkinsci/plugins/workflow/multibranch/template/ConfigDrivenWorkflowMultiBranchProjectFactory/config.jelly +++ b/src/main/resources/org/jenkinsci/plugins/workflow/multibranch/template/ConfigDrivenWorkflowMultiBranchProjectFactory/config.jelly @@ -29,5 +29,9 @@ THE SOFTWARE. + + + + diff --git a/src/main/resources/org/jenkinsci/plugins/workflow/multibranch/template/ConfigDrivenWorkflowMultiBranchProjectFactory/help-pipelinePath.html b/src/main/resources/org/jenkinsci/plugins/workflow/multibranch/template/ConfigDrivenWorkflowMultiBranchProjectFactory/help-pipelinePath.html new file mode 100644 index 0000000..9baae27 --- /dev/null +++ b/src/main/resources/org/jenkinsci/plugins/workflow/multibranch/template/ConfigDrivenWorkflowMultiBranchProjectFactory/help-pipelinePath.html @@ -0,0 +1,3 @@ +
+ Relative default location of pipeline_template. +