From 6c6deb83651465f3672ed4573fdb89041b593833 Mon Sep 17 00:00:00 2001 From: somiljain2006 Date: Fri, 31 Jul 2026 10:06:06 +0530 Subject: [PATCH 1/2] Add draft ItemConfigurator support for WorkflowJob --- pom.xml | 9 +++ .../job/PipelineItemConfigurator.java | 60 +++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 src/main/java/org/jenkinsci/plugins/workflow/job/PipelineItemConfigurator.java diff --git a/pom.xml b/pom.xml index 872f6b01..8c0269cb 100644 --- a/pom.xml +++ b/pom.xml @@ -189,6 +189,15 @@ tests test + + io.jenkins + configuration-as-code + + + org.jenkins-ci.plugins.workflow + workflow-cps + compile + diff --git a/src/main/java/org/jenkinsci/plugins/workflow/job/PipelineItemConfigurator.java b/src/main/java/org/jenkinsci/plugins/workflow/job/PipelineItemConfigurator.java new file mode 100644 index 00000000..5b4347bb --- /dev/null +++ b/src/main/java/org/jenkinsci/plugins/workflow/job/PipelineItemConfigurator.java @@ -0,0 +1,60 @@ +package org.jenkinsci.plugins.workflow.job; + +import hudson.Extension; +import hudson.model.Descriptor; +import io.jenkins.plugins.casc.ConfigurationContext; +import io.jenkins.plugins.casc.ConfiguratorException; +import io.jenkins.plugins.casc.ItemConfigurator; +import io.jenkins.plugins.casc.model.CNode; +import io.jenkins.plugins.casc.model.Mapping; +import jenkins.model.Jenkins; +import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition; + +import java.io.IOException; + +@Extension +public class PipelineItemConfigurator implements ItemConfigurator { + + @Override + public String getName() { + return "pipeline"; + } + + @Override + public Class getTarget() { + return WorkflowJob.class; + } + + @Override + public WorkflowJob configure(String name, CNode config, ConfigurationContext context) throws ConfiguratorException { + try { + Jenkins jenkins = Jenkins.get(); + WorkflowJob job = (WorkflowJob) jenkins.getItem(name); + + if (job == null) { + job = jenkins.createProject(WorkflowJob.class, name); + } + + Mapping mapping = config.asMapping(); + + if (mapping.containsKey("description")) { + job.setDescription(mapping.getScalarValue("description")); + } + + CNode definitionNode = mapping.get("definition"); + if (definitionNode != null) { + Mapping defMapping = definitionNode.asMapping(); + if (defMapping.containsKey("cps")) { + String script = defMapping.get("cps").asMapping().getScalarValue("script"); + job.setDefinition(new CpsFlowDefinition(script, true)); + } + } + + job.save(); + return job; + + } catch (IOException | Descriptor.FormException e) { + throw new ConfiguratorException("Failed to configure pipeline: " + name, e); + } + } +} \ No newline at end of file From d097e9aa3c6899ea3f8ca1523daa77faf4737826 Mon Sep 17 00:00:00 2001 From: somiljain2006 Date: Sat, 1 Aug 2026 03:40:29 +0530 Subject: [PATCH 2/2] Added tests --- pom.xml | 4 ++ .../job/PipelineItemConfiguratorTest.java | 55 +++++++++++++++++++ .../plugins/workflow/job/create-pipeline.yaml | 7 +++ .../plugins/workflow/job/update-pipeline.yaml | 7 +++ 4 files changed, 73 insertions(+) create mode 100644 src/test/java/org/jenkinsci/plugins/workflow/job/PipelineItemConfiguratorTest.java create mode 100644 src/test/resources/org/jenkinsci/plugins/workflow/job/create-pipeline.yaml create mode 100644 src/test/resources/org/jenkinsci/plugins/workflow/job/update-pipeline.yaml diff --git a/pom.xml b/pom.xml index 8c0269cb..d12c681b 100644 --- a/pom.xml +++ b/pom.xml @@ -193,6 +193,10 @@ io.jenkins configuration-as-code + + io.jenkins.configuration-as-code + test-harness + org.jenkins-ci.plugins.workflow workflow-cps diff --git a/src/test/java/org/jenkinsci/plugins/workflow/job/PipelineItemConfiguratorTest.java b/src/test/java/org/jenkinsci/plugins/workflow/job/PipelineItemConfiguratorTest.java new file mode 100644 index 00000000..9292013a --- /dev/null +++ b/src/test/java/org/jenkinsci/plugins/workflow/job/PipelineItemConfiguratorTest.java @@ -0,0 +1,55 @@ +package org.jenkinsci.plugins.workflow.job; + +import io.jenkins.plugins.casc.ConfigurationAsCode; +import io.jenkins.plugins.casc.misc.ConfiguredWithCode; +import io.jenkins.plugins.casc.misc.JenkinsConfiguredWithCodeRule; +import jenkins.model.Jenkins; +import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition; +import org.junit.Rule; +import org.junit.Test; + +import java.util.Objects; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +public class PipelineItemConfiguratorTest { + + @Rule + public JenkinsConfiguredWithCodeRule j = new JenkinsConfiguredWithCodeRule(); + + @Test + @ConfiguredWithCode("create-pipeline.yaml") + public void shouldCreateNewPipeline() { + WorkflowJob job = (WorkflowJob) Jenkins.get().getItem("my-new-pipeline"); + + assertNotNull("Pipeline job should have been created by JCasC", job); + assertEquals("A brand new pipeline created by JCasC", job.getDescription()); + + assertTrue("Definition should be CpsFlowDefinition", job.getDefinition() instanceof CpsFlowDefinition); + CpsFlowDefinition definition = (CpsFlowDefinition) job.getDefinition(); + assertEquals("node { echo 'Hello, JCasC!' }", definition.getScript()); + assertTrue("Sandbox should be true", definition.isSandbox()); + } + + @Test + public void shouldUpdateExistingPipeline() throws Exception { + WorkflowJob existingJob = j.jenkins.createProject(WorkflowJob.class, "existing-pipeline"); + existingJob.setDescription("Old Description"); + existingJob.setDefinition(new CpsFlowDefinition("node { echo 'Old script' }", false)); + + ConfigurationAsCode.get().configure( + Objects.requireNonNull(getClass().getResource("update-pipeline.yaml")).toExternalForm() + ); + + WorkflowJob updatedJob = (WorkflowJob) Jenkins.get().getItem("existing-pipeline"); + + assertNotNull(updatedJob); + assertEquals("Updated description via JCasC", updatedJob.getDescription()); + + CpsFlowDefinition definition = (CpsFlowDefinition) updatedJob.getDefinition(); + assertEquals("node { echo 'Updated script!' }", definition.getScript()); + assertTrue("Sandbox should be reset to true", definition.isSandbox()); + } +} \ No newline at end of file diff --git a/src/test/resources/org/jenkinsci/plugins/workflow/job/create-pipeline.yaml b/src/test/resources/org/jenkinsci/plugins/workflow/job/create-pipeline.yaml new file mode 100644 index 00000000..92f6dd27 --- /dev/null +++ b/src/test/resources/org/jenkinsci/plugins/workflow/job/create-pipeline.yaml @@ -0,0 +1,7 @@ +items: + - pipeline: + name: "my-new-pipeline" + description: "A brand new pipeline created by JCasC" + definition: + cps: + script: "node { echo 'Hello, JCasC!' }" \ No newline at end of file diff --git a/src/test/resources/org/jenkinsci/plugins/workflow/job/update-pipeline.yaml b/src/test/resources/org/jenkinsci/plugins/workflow/job/update-pipeline.yaml new file mode 100644 index 00000000..1a05428c --- /dev/null +++ b/src/test/resources/org/jenkinsci/plugins/workflow/job/update-pipeline.yaml @@ -0,0 +1,7 @@ +items: + - pipeline: + name: "existing-pipeline" + description: "Updated description via JCasC" + definition: + cps: + script: "node { echo 'Updated script!' }" \ No newline at end of file