From ba862c7b9be43806229e4636371bc714053bcd7a Mon Sep 17 00:00:00 2001 From: Denis Tikhomirov Date: Tue, 29 Jun 2021 19:08:06 +0300 Subject: [PATCH] Fix dynamic DSL plugins handling in job DSL This commit fixes working with dynamic DSL plugins in job DSL integration code, namely in promotion actions processing. --- .../JobDslPromotionProcessConverter.java | 18 +++++++----------- .../PromotionsDslContextExtensionTest.java | 16 ++++++++++++++++ .../resources/dynamic-dsl-example-dsl.groovy | 17 +++++++++++++++++ 3 files changed, 40 insertions(+), 11 deletions(-) create mode 100644 src/test/resources/dynamic-dsl-example-dsl.groovy diff --git a/src/main/java/hudson/plugins/promoted_builds/integrations/jobdsl/JobDslPromotionProcessConverter.java b/src/main/java/hudson/plugins/promoted_builds/integrations/jobdsl/JobDslPromotionProcessConverter.java index 8155f425..080b4de1 100755 --- a/src/main/java/hudson/plugins/promoted_builds/integrations/jobdsl/JobDslPromotionProcessConverter.java +++ b/src/main/java/hudson/plugins/promoted_builds/integrations/jobdsl/JobDslPromotionProcessConverter.java @@ -87,24 +87,20 @@ public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingC private void writeNodes(HierarchicalStreamWriter writer, List nodes) { for (Node node : nodes) { - writer.startNode(node.name().toString()); - if (node.value() instanceof Collection) { - for (Object subNode : (Collection) node.value()) { - convertNode((Node) subNode, writer); - } - } else { - writer.setValue(node.value().toString()); - } - writer.endNode(); + writeNode(node, writer); } } - private void convertNode(Node node, HierarchicalStreamWriter writer) { + private void writeNode(Node node, HierarchicalStreamWriter writer) { writer.startNode(node.name().toString()); writeNodeAttributes(node, writer); if (node.value() instanceof Collection) { for (Object subNode : (Collection) node.value()) { - convertNode((Node) subNode, writer); + if (subNode instanceof Node) { + writeNode((Node) subNode, writer); + } else { + writer.setValue(subNode.toString()); + } } } else { writer.setValue(node.value().toString()); diff --git a/src/test/java/hudson/plugins/promoted_builds/integrations/jobdsl/PromotionsDslContextExtensionTest.java b/src/test/java/hudson/plugins/promoted_builds/integrations/jobdsl/PromotionsDslContextExtensionTest.java index 4d30d4b6..c927dd07 100644 --- a/src/test/java/hudson/plugins/promoted_builds/integrations/jobdsl/PromotionsDslContextExtensionTest.java +++ b/src/test/java/hudson/plugins/promoted_builds/integrations/jobdsl/PromotionsDslContextExtensionTest.java @@ -98,4 +98,20 @@ public void testShouldGenerateTheJobWithBuildWrappers() throws Exception { .matcher(content).find()); } + @Test + public void testShouldGenerateTheDynamicDslJob() throws Exception { + // Given + String dsl = FileUtils.readFileToString(new File("src/test/resources/dynamic-dsl-example-dsl.groovy")); + FreeStyleProject seedJob = j.createFreeStyleProject(); + seedJob.getBuildersList().add(createScript(dsl)); + // When + QueueTaskFuture scheduleBuild2 = seedJob.scheduleBuild2(0); + j.assertBuildStatusSuccess(scheduleBuild2.get()); + + TopLevelItem item = j.jenkins.getItem("dynamic-dsl-test"); + File config = new File(item.getRootDir(), "promotions/Development/config.xml"); + String content = Files.toString(config, Charset.forName("UTF-8")); + assert content.contains(""); + } + } diff --git a/src/test/resources/dynamic-dsl-example-dsl.groovy b/src/test/resources/dynamic-dsl-example-dsl.groovy new file mode 100644 index 00000000..d14f70ca --- /dev/null +++ b/src/test/resources/dynamic-dsl-example-dsl.groovy @@ -0,0 +1,17 @@ +freeStyleJob('dynamic-dsl-test') { + properties { + promotions { + promotion { + name('Development') + conditions { + manual('tester') + } + actions { + jobDsl { + scriptText('println test') + } + } + } + } + } +}