diff --git a/pom.xml b/pom.xml
index f3df9427..a8e9d6df 100644
--- a/pom.xml
+++ b/pom.xml
@@ -68,7 +68,6 @@
io.jenkins
configuration-as-code
- test
io.jenkins.configuration-as-code
diff --git a/src/main/java/com/cloudbees/hudson/plugins/folder/FolderItemConfigurator.java b/src/main/java/com/cloudbees/hudson/plugins/folder/FolderItemConfigurator.java
new file mode 100644
index 00000000..f719f305
--- /dev/null
+++ b/src/main/java/com/cloudbees/hudson/plugins/folder/FolderItemConfigurator.java
@@ -0,0 +1,52 @@
+package com.cloudbees.hudson.plugins.folder;
+
+import hudson.Extension;
+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 java.io.IOException;
+
+@Extension
+public class FolderItemConfigurator implements ItemConfigurator {
+
+ @Override
+ public String getName() {
+ return "folder";
+ }
+
+ @Override
+ public Class getTarget() {
+ return Folder.class;
+ }
+
+ @Override
+ public Folder configure(String name, CNode config, ConfigurationContext context) throws ConfiguratorException {
+ try {
+ Jenkins jenkins = Jenkins.get();
+ Folder folder = (Folder) jenkins.getItem(name);
+
+ if (folder == null) {
+ folder = jenkins.createProject(Folder.class, name);
+ }
+
+ Mapping mapping = config.asMapping();
+
+ if (mapping.containsKey("description")) {
+ folder.setDescription(mapping.getScalarValue("description"));
+ }
+
+ if (mapping.containsKey("displayName")) {
+ folder.setDisplayName(mapping.getScalarValue("displayName"));
+ }
+
+ folder.save();
+ return folder;
+
+ } catch (IOException e) {
+ throw new ConfiguratorException("Failed to configure folder: " + name, e);
+ }
+ }
+}
diff --git a/src/test/java/com/cloudbees/hudson/plugins/folder/FolderItemConfiguratorTest.java b/src/test/java/com/cloudbees/hudson/plugins/folder/FolderItemConfiguratorTest.java
new file mode 100644
index 00000000..65f37db0
--- /dev/null
+++ b/src/test/java/com/cloudbees/hudson/plugins/folder/FolderItemConfiguratorTest.java
@@ -0,0 +1,46 @@
+package com.cloudbees.hudson.plugins.folder;
+
+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.junit.Rule;
+import org.junit.Test;
+
+import java.util.Objects;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+public class FolderItemConfiguratorTest {
+
+ @Rule
+ public JenkinsConfiguredWithCodeRule j = new JenkinsConfiguredWithCodeRule();
+
+ @Test
+ @ConfiguredWithCode("create-folder.yaml")
+ public void shouldCreateNewFolder() {
+ Folder folder = (Folder) Jenkins.get().getItem("team-alpha");
+
+ assertNotNull("Folder should have been created by JCasC", folder);
+ assertEquals("Team Alpha", folder.getDisplayName());
+ assertEquals("Description for Team Alpha", folder.getDescription());
+ }
+
+ @Test
+ public void shouldUpdateExistingFolder() throws Exception {
+ Folder existingFolder = j.jenkins.createProject(Folder.class, "team-beta");
+ existingFolder.setDescription("Old Description");
+ existingFolder.setDisplayName("Old Display Name");
+
+ ConfigurationAsCode.get().configure(
+ Objects.requireNonNull(getClass().getResource("update-folder.yaml")).toExternalForm()
+ );
+
+ Folder updatedFolder = (Folder) Jenkins.get().getItem("team-beta");
+
+ assertNotNull(updatedFolder);
+ assertEquals("Team Beta Updated", updatedFolder.getDisplayName());
+ assertEquals("New Description via JCasC", updatedFolder.getDescription());
+ }
+}
diff --git a/src/test/resources/com/cloudbees/hudson/plugins/folder/create-folder.yaml b/src/test/resources/com/cloudbees/hudson/plugins/folder/create-folder.yaml
new file mode 100644
index 00000000..ed6c1d94
--- /dev/null
+++ b/src/test/resources/com/cloudbees/hudson/plugins/folder/create-folder.yaml
@@ -0,0 +1,5 @@
+items:
+ - folder:
+ name: "team-alpha"
+ displayName: "Team Alpha"
+ description: "Description for Team Alpha"
\ No newline at end of file
diff --git a/src/test/resources/com/cloudbees/hudson/plugins/folder/update-folder.yaml b/src/test/resources/com/cloudbees/hudson/plugins/folder/update-folder.yaml
new file mode 100644
index 00000000..71963ba5
--- /dev/null
+++ b/src/test/resources/com/cloudbees/hudson/plugins/folder/update-folder.yaml
@@ -0,0 +1,5 @@
+items:
+ - folder:
+ name: "team-beta"
+ displayName: "Team Beta Updated"
+ description: "New Description via JCasC"
\ No newline at end of file