From 786de55ff6856392c0ef295929a0ca35606bbd3f Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 18 Mar 2021 17:45:18 -0400 Subject: [PATCH 1/4] =?UTF-8?q?docker-fixtures=20=E2=86=92=20testcontainer?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 13 ++++--- .../security/docker/MultiServerTest.java | 33 ++++++++-------- .../security/docker/PlanetExpressTest.java | 39 ++++++++++--------- .../PlanetExpress/Dockerfile | 1 - 4 files changed, 44 insertions(+), 42 deletions(-) delete mode 100644 src/test/resources/hudson/security/docker/PlanetExpressTest/PlanetExpress/Dockerfile diff --git a/pom.xml b/pom.xml index 64d8c49e..a8f22134 100644 --- a/pom.xml +++ b/pom.xml @@ -86,15 +86,18 @@ 1.32.1 - org.jenkins-ci.test - docker-fixtures - 1.10 + org.testcontainers + testcontainers + 1.15.2 test - + + org.apache.commons + commons-compress + com.fasterxml.jackson.core - jackson-databind + jackson-annotations diff --git a/src/test/java/hudson/security/docker/MultiServerTest.java b/src/test/java/hudson/security/docker/MultiServerTest.java index 9b66fd48..5b2a6aed 100644 --- a/src/test/java/hudson/security/docker/MultiServerTest.java +++ b/src/test/java/hudson/security/docker/MultiServerTest.java @@ -6,17 +6,9 @@ import hudson.tasks.MailAddressResolver; import hudson.tasks.Mailer; import hudson.util.Secret; +import java.util.Arrays; import jenkins.model.IdStrategy; import jenkins.security.plugins.ldap.*; -import org.springframework.security.ldap.userdetails.LdapUserDetails; -import org.jenkinsci.test.acceptance.docker.DockerRule; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.RuleChain; -import org.jvnet.hudson.test.JenkinsRule; - -import java.util.Arrays; - import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.is; @@ -24,6 +16,12 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.RuleChain; +import org.jvnet.hudson.test.JenkinsRule; +import org.springframework.security.ldap.userdetails.LdapUserDetails; +import org.testcontainers.containers.GenericContainer; /** * Tests connecting to two different servers @@ -31,12 +29,14 @@ @LDAPTestConfiguration public class MultiServerTest { - @BeforeClass public static void linuxOnly() { - PlanetExpressTest.linuxOnly(); + @BeforeClass public static void requiresDocker() { + PlanetExpressTest.requiresDocker(); } + @SuppressWarnings("rawtypes") @Rule - public DockerRule docker = new DockerRule<>(PlanetExpressTest.PlanetExpress.class); + public GenericContainer container = new GenericContainer(PlanetExpressTest.TEST_IMAGE).withExposedPorts(389); + public JenkinsRule j = new JenkinsRule(); public LDAPRule ads = new LDAPRule(); @Rule @@ -64,13 +64,12 @@ public void userLookup() throws Exception { adsConf.setDisplayNameAttributeName("cn"); adsConf.setMailAddressAttributeName(null); - PlanetExpressTest.PlanetExpress d = docker.get(); LDAPConfiguration plExprs = new LDAPConfiguration( - d.ipBound(389) + ":" + d.port(389), - PlanetExpressTest.PlanetExpress.DN, + container.getHost() + ":" + container.getFirstMappedPort(), + PlanetExpressTest.DN, false, - PlanetExpressTest.PlanetExpress.MANAGER_DN, - Secret.fromString(PlanetExpressTest.PlanetExpress.MANAGER_SECRET)); + PlanetExpressTest.MANAGER_DN, + Secret.fromString(PlanetExpressTest.MANAGER_SECRET)); plExprs.setUserSearchBase(null); plExprs.setUserSearch(null); plExprs.setGroupSearchBase(null); diff --git a/src/test/java/hudson/security/docker/PlanetExpressTest.java b/src/test/java/hudson/security/docker/PlanetExpressTest.java index 23e091d6..754fa99a 100644 --- a/src/test/java/hudson/security/docker/PlanetExpressTest.java +++ b/src/test/java/hudson/security/docker/PlanetExpressTest.java @@ -4,38 +4,47 @@ import hudson.security.LDAPSecurityRealm; import hudson.tasks.MailAddressResolver; import hudson.util.Secret; -import org.springframework.security.ldap.userdetails.LdapUserDetails; -import org.jenkinsci.test.acceptance.docker.DockerContainer; -import org.jenkinsci.test.acceptance.docker.DockerFixture; -import org.jenkinsci.test.acceptance.docker.DockerRule; -import org.junit.Rule; -import org.junit.Test; -import org.jvnet.hudson.test.JenkinsRule; - import static org.hamcrest.core.StringContains.containsString; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.junit.Assume.assumeFalse; +import static org.junit.Assume.assumeTrue; import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; +import org.springframework.security.ldap.userdetails.LdapUserDetails; +import org.testcontainers.DockerClientFactory; +import org.testcontainers.containers.GenericContainer; /** * Tests the plugin when logging in to rroemhild/test-openldap */ public class PlanetExpressTest { + static final String TEST_IMAGE = "rroemhild/test-openldap@sha256:b4e433bbcba1f17899d6bcb0a8e854bbe52c754faa4e785d0c27a2b55eb12cd8"; + static final String DN = "dc=planetexpress,dc=com"; + static final String MANAGER_DN = "cn=admin,dc=planetexpress,dc=com"; + static final String MANAGER_SECRET = "GoodNewsEveryone"; + + @BeforeClass public static void requiresDocker() { + assumeTrue(DockerClientFactory.instance().isDockerAvailable()); + } + @BeforeClass public static void linuxOnly() { assumeFalse("Windows CI builders now have Docker installed…but it does not support Linux images", Functions.isWindows() && System.getenv("JENKINS_URL") != null); } + @SuppressWarnings("rawtypes") @Rule - public DockerRule docker = new DockerRule<>(PlanetExpress.class); + public GenericContainer container = new GenericContainer(TEST_IMAGE).withExposedPorts(389); + @Rule public JenkinsRule j = new JenkinsRule(); @Test public void login() throws Exception { - PlanetExpress d = docker.get(); - LDAPSecurityRealm realm = new LDAPSecurityRealm(d.ipBound(389) + ":" + d.port(389), PlanetExpress.DN, null, null, null, null, null, PlanetExpress.MANAGER_DN, Secret.fromString(PlanetExpress.MANAGER_SECRET), false, false, null, null, "cn", "mail", null,null); + LDAPSecurityRealm realm = new LDAPSecurityRealm(container.getHost() + ":" + container.getFirstMappedPort(), DN, null, null, null, null, null, MANAGER_DN, Secret.fromString(MANAGER_SECRET), false, false, null, null, "cn", "mail", null,null); j.jenkins.setSecurityRealm(realm); j.configRoundtrip(); String content = j.createWebClient().login("fry", "fry").goTo("whoAmI").getBody().getTextContent(); @@ -50,12 +59,4 @@ public void login() throws Exception { } - @DockerFixture(id = "openldap-express", ports = {389, 636}) - public static class PlanetExpress extends DockerContainer { - - static final String DN = "dc=planetexpress,dc=com"; - static final String MANAGER_DN = "cn=admin,dc=planetexpress,dc=com"; - static final String MANAGER_SECRET = "GoodNewsEveryone"; - - } } diff --git a/src/test/resources/hudson/security/docker/PlanetExpressTest/PlanetExpress/Dockerfile b/src/test/resources/hudson/security/docker/PlanetExpressTest/PlanetExpress/Dockerfile deleted file mode 100644 index d0708a84..00000000 --- a/src/test/resources/hudson/security/docker/PlanetExpressTest/PlanetExpress/Dockerfile +++ /dev/null @@ -1 +0,0 @@ -FROM rroemhild/test-openldap@sha256:b4e433bbcba1f17899d6bcb0a8e854bbe52c754faa4e785d0c27a2b55eb12cd8 From 377d2e14b583538f07cb2dee03e07a11a64a836c Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 18 Mar 2021 17:51:25 -0400 Subject: [PATCH 2/4] Use RealJenkinsRule in PlanetExpressTest --- .../security/docker/PlanetExpressTest.java | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/test/java/hudson/security/docker/PlanetExpressTest.java b/src/test/java/hudson/security/docker/PlanetExpressTest.java index 754fa99a..4f2785f2 100644 --- a/src/test/java/hudson/security/docker/PlanetExpressTest.java +++ b/src/test/java/hudson/security/docker/PlanetExpressTest.java @@ -13,6 +13,7 @@ import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.RealJenkinsRule; import org.springframework.security.ldap.userdetails.LdapUserDetails; import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.GenericContainer; @@ -40,23 +41,32 @@ public class PlanetExpressTest { public GenericContainer container = new GenericContainer(TEST_IMAGE).withExposedPorts(389); @Rule - public JenkinsRule j = new JenkinsRule(); + public RealJenkinsRule rr = new RealJenkinsRule(); @Test - public void login() throws Exception { - LDAPSecurityRealm realm = new LDAPSecurityRealm(container.getHost() + ":" + container.getFirstMappedPort(), DN, null, null, null, null, null, MANAGER_DN, Secret.fromString(MANAGER_SECRET), false, false, null, null, "cn", "mail", null,null); - j.jenkins.setSecurityRealm(realm); - j.configRoundtrip(); - String content = j.createWebClient().login("fry", "fry").goTo("whoAmI").getBody().getTextContent(); - assertThat(content, containsString("Philip J. Fry")); - - - LdapUserDetails zoidberg = (LdapUserDetails) j.jenkins.getSecurityRealm().loadUserByUsername2("zoidberg"); - assertEquals("cn=John A. Zoidberg,ou=people,dc=planetexpress,dc=com", zoidberg.getDn()); + public void login() throws Throwable { + String server = container.getHost() + ":" + container.getFirstMappedPort(); + rr.then(new Login(server)); + } + private static class Login implements RealJenkinsRule.Step { + private final String server; + Login(String server) { + this.server = server; + } + @Override + public void run(JenkinsRule j) throws Throwable { + LDAPSecurityRealm realm = new LDAPSecurityRealm(server, DN, null, null, null, null, null, MANAGER_DN, Secret.fromString(MANAGER_SECRET), false, false, null, null, "cn", "mail", null,null); + j.jenkins.setSecurityRealm(realm); + j.configRoundtrip(); + String content = j.createWebClient().login("fry", "fry").goTo("whoAmI").getBody().getTextContent(); + assertThat(content, containsString("Philip J. Fry")); - String leelaEmail = MailAddressResolver.resolve(j.jenkins.getUser("leela")); - assertEquals("leela@planetexpress.com", leelaEmail); + LdapUserDetails zoidberg = (LdapUserDetails) j.jenkins.getSecurityRealm().loadUserByUsername2("zoidberg"); + assertEquals("cn=John A. Zoidberg,ou=people,dc=planetexpress,dc=com", zoidberg.getDn()); + String leelaEmail = MailAddressResolver.resolve(j.jenkins.getUser("leela")); + assertEquals("leela@planetexpress.com", leelaEmail); + } } } From 79e2404cd378e9b355df95ef5ab8994d7bd60a61 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 18 Mar 2021 17:55:54 -0400 Subject: [PATCH 3/4] Switch baseline to 2.277.1 LTS, and use BOM --- pom.xml | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index a8f22134..8209284a 100644 --- a/pom.xml +++ b/pom.xml @@ -18,7 +18,7 @@ The MIT license - https://www.opensource.org/licenses/mit-license.php + https://opensource.org/licenses/MIT repo @@ -28,9 +28,8 @@ -SNAPSHOT jenkinsci/${project.artifactId}-plugin 2.0.0.AM25 - 2.266 + 2.277.1 8 - 1.47 @@ -83,7 +82,6 @@ org.jenkins-ci.plugins mailer - 1.32.1 org.testcontainers @@ -282,18 +280,28 @@ io.jenkins configuration-as-code - ${configuration-as-code.version} test io.jenkins.configuration-as-code test-harness - ${configuration-as-code.version} test + + + + io.jenkins.tools.bom + bom-2.277.x + 26 + import + pom + + + + From 904e34cb150791555a6d56402cd70293222a04c4 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 19 Mar 2021 12:58:06 -0400 Subject: [PATCH 4/4] Ensure we have an index.jelly, expected by https://github.com/jenkinsci/jenkins-test-harness/pull/286 --- pom.xml | 1 - src/main/resources/index.jelly | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/index.jelly diff --git a/pom.xml b/pom.xml index 8209284a..e0eceea2 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,6 @@ hpi LDAP Plugin - Adds LDAP authentication to Jenkins https://github.com/jenkinsci/ldap-plugin diff --git a/src/main/resources/index.jelly b/src/main/resources/index.jelly new file mode 100644 index 00000000..7d86c146 --- /dev/null +++ b/src/main/resources/index.jelly @@ -0,0 +1,4 @@ + +
+ Adds LDAP authentication to Jenkins +