diff --git a/Jenkinsfile b/Jenkinsfile index ac25f53..9bdbcc7 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,11 +1,10 @@ -#!groovy -def recentLTS = '2.375.2' +/* + See the documentation for more options: + https://github.com/jenkins-infra/pipeline-library/ +*/ buildPlugin( - // Container agents start faster and are easier to administer - useContainerAgent: true, + useContainerAgent: true, // Set to `false` if you need to use Docker for containerized tests configurations: [ - [platform: 'linux', jdk: '11'], - [platform: 'linux', jdk: '17', jenkins: recentLTS], - [platform: 'windows', jdk: '17', jenkins: recentLTS], - ] -) + [platform: 'linux', jdk: 21], + [platform: 'windows', jdk: 17], +]) diff --git a/pom.xml b/pom.xml index 910d6f2..15c5211 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ scm:git:ssh://github.com/${gitHubRepo}.git - scm:git:ssh://git@github.com/${gitHubRepo}.git + scm:git:git@github.com:${gitHubRepo}.git ${scmTag} https://github.com/${gitHubRepo} @@ -42,22 +42,32 @@ 999999-SNAPSHOT jenkinsci/simple-theme-plugin - 2.361.1 - 1569.vb_72405b_80249 + 2.421 + 171 false + + + + io.jenkins.tools.bom + bom-2.414.x + 2357.v1043f8578392 + pom + import + + + + io.jenkins configuration-as-code - ${configuration-as-code.version} test io.jenkins.configuration-as-code test-harness - ${configuration-as-code.version} test diff --git a/src/main/java/org/codefirst/SimpleThemeDecorator.java b/src/main/java/org/codefirst/SimpleThemeDecorator.java index 944c185..10aac52 100644 --- a/src/main/java/org/codefirst/SimpleThemeDecorator.java +++ b/src/main/java/org/codefirst/SimpleThemeDecorator.java @@ -1,11 +1,14 @@ package org.codefirst; +import edu.umd.cs.findbugs.annotations.NonNull; import hudson.Extension; import hudson.model.PageDecorator; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; +import jenkins.appearance.AppearanceCategory; +import jenkins.model.GlobalConfigurationCategory; import net.sf.json.JSONObject; import org.apache.commons.lang.StringUtils; import org.jenkinsci.Symbol; @@ -20,7 +23,7 @@ import org.kohsuke.stapler.StaplerRequest; @Extension -@Symbol("simple-theme-plugin") +@Symbol("simpleTheme") public class SimpleThemeDecorator extends PageDecorator { private List elements = new ArrayList<>(); @@ -50,6 +53,12 @@ public boolean configure(StaplerRequest req, JSONObject formData) throws FormExc return true; } + @NonNull + @Override + public GlobalConfigurationCategory getCategory() { + return GlobalConfigurationCategory.get(AppearanceCategory.class); + } + public List getElements() { return elements; } diff --git a/src/main/resources/org/codefirst/SimpleThemeDecorator/global.groovy b/src/main/resources/org/codefirst/SimpleThemeDecorator/global.groovy index 6a5db12..ccfa12a 100644 --- a/src/main/resources/org/codefirst/SimpleThemeDecorator/global.groovy +++ b/src/main/resources/org/codefirst/SimpleThemeDecorator/global.groovy @@ -4,7 +4,7 @@ import lib.FormTagLib def f = namespace(FormTagLib) -f.section(title: _("Theme")) { +f.section(title: _("Customizable theme")) { f.entry(title: _("Theme elements")) { f.repeatableHeteroProperty(field: "elements", hasHeader: true) } diff --git a/src/test/java/org/jenkinsci/plugins/simpletheme/ConfigurationAsCodeTest.java b/src/test/java/org/jenkinsci/plugins/simpletheme/ConfigurationAsCodeTest.java index bffe4a7..d2e08f9 100644 --- a/src/test/java/org/jenkinsci/plugins/simpletheme/ConfigurationAsCodeTest.java +++ b/src/test/java/org/jenkinsci/plugins/simpletheme/ConfigurationAsCodeTest.java @@ -1,6 +1,5 @@ package org.jenkinsci.plugins.simpletheme; -import static io.jenkins.plugins.casc.misc.Util.getUnclassifiedRoot; import static io.jenkins.plugins.casc.misc.Util.toStringFromYamlFile; import static io.jenkins.plugins.casc.misc.Util.toYamlString; import static org.hamcrest.MatcherAssert.assertThat; @@ -11,11 +10,17 @@ import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertNotNull; +import hudson.ExtensionList; import io.jenkins.plugins.casc.ConfigurationContext; import io.jenkins.plugins.casc.ConfiguratorRegistry; +import io.jenkins.plugins.casc.impl.configurators.GlobalConfigurationCategoryConfigurator; import io.jenkins.plugins.casc.misc.ConfiguredWithCode; import io.jenkins.plugins.casc.misc.JenkinsConfiguredWithCodeRule; import io.jenkins.plugins.casc.model.CNode; +import io.jenkins.plugins.casc.model.Mapping; +import java.util.Objects; +import jenkins.appearance.AppearanceCategory; +import jenkins.model.GlobalConfigurationCategory; import org.codefirst.SimpleThemeDecorator; import org.junit.ClassRule; import org.junit.Test; @@ -44,7 +49,7 @@ public void testConfig() { @Test public void testExport() throws Exception { ConfigurationContext context = new ConfigurationContext(ConfiguratorRegistry.get()); - CNode yourAttribute = getUnclassifiedRoot(context).get("simple-theme-plugin"); + CNode yourAttribute = getAppearanceRoot(context).get("simpleTheme"); String exported = toYamlString(yourAttribute); @@ -52,4 +57,12 @@ public void testExport() throws Exception { assertThat(exported, is(expected)); } + + private static Mapping getAppearanceRoot(ConfigurationContext context) throws Exception { + GlobalConfigurationCategory category = + ExtensionList.lookup(AppearanceCategory.class).get(0); + GlobalConfigurationCategoryConfigurator configurator = new GlobalConfigurationCategoryConfigurator(category); + return Objects.requireNonNull(configurator.describe(configurator.getTargetComponent(context), context)) + .asMapping(); + } } diff --git a/src/test/java/org/jenkinsci/plugins/simpletheme/SimpleThemeConfigurationTest.java b/src/test/java/org/jenkinsci/plugins/simpletheme/SimpleThemeConfigurationTest.java index 8ea3256..5702f33 100644 --- a/src/test/java/org/jenkinsci/plugins/simpletheme/SimpleThemeConfigurationTest.java +++ b/src/test/java/org/jenkinsci/plugins/simpletheme/SimpleThemeConfigurationTest.java @@ -27,7 +27,7 @@ public void testConfigRoundTrip() throws Exception { SimpleThemeDecorator decorator = j.jenkins.getDescriptorByType(SimpleThemeDecorator.class); fill(decorator); - j.configRoundtrip(); + configRoundTrip(); decorator = j.jenkins.getDescriptorByType(SimpleThemeDecorator.class); @@ -35,12 +35,16 @@ public void testConfigRoundTrip() throws Exception { assertThat(decorator.getElements(), hasSize(4)); } + private void configRoundTrip() throws Exception { + j.submit(j.createWebClient().goTo("manage/appearance").getFormByName("config")); + } + @Test public void testConfigCreatesHtml() throws Exception { SimpleThemeDecorator decorator = j.jenkins.getDescriptorByType(SimpleThemeDecorator.class); fill(decorator); - HtmlPage configPage = j.createWebClient().goTo("configure"); + HtmlPage configPage = j.createWebClient().goTo("manage/appearance"); HtmlForm form = configPage.getFormByName("config"); urlThemeInput(form, CssUrlThemeElement.class).setValue("SOMECSSFILE.css"); diff --git a/src/test/resources/org/jenkinsci/plugins/simpletheme/ConfigurationAsCode.yml b/src/test/resources/org/jenkinsci/plugins/simpletheme/ConfigurationAsCode.yml index db2d63c..161a387 100644 --- a/src/test/resources/org/jenkinsci/plugins/simpletheme/ConfigurationAsCode.yml +++ b/src/test/resources/org/jenkinsci/plugins/simpletheme/ConfigurationAsCode.yml @@ -1,6 +1,6 @@ --- -unclassified: - simple-theme-plugin: +appearance: + simpleTheme: elements: - cssUrl: url: "https://example.bogus/test.css"