diff --git a/pom.xml b/pom.xml index fd85c81b6a..3619589ca5 100644 --- a/pom.xml +++ b/pom.xml @@ -414,6 +414,11 @@ and org.slf4j slf4j-jdk14 + + org.testcontainers + testcontainers + 2.0.3 + org.zeroturnaround zt-zip @@ -427,7 +432,7 @@ and com.github.dasniko testcontainers-keycloak - 3.9.1 + 4.1.1 test diff --git a/src/main/java/org/jenkinsci/test/acceptance/docker/fixtures/SshAgentContainer.java b/src/main/java/org/jenkinsci/test/acceptance/docker/fixtures/SshAgentContainer.java index 91038a9444..a02bafc78f 100644 --- a/src/main/java/org/jenkinsci/test/acceptance/docker/fixtures/SshAgentContainer.java +++ b/src/main/java/org/jenkinsci/test/acceptance/docker/fixtures/SshAgentContainer.java @@ -24,28 +24,46 @@ package org.jenkinsci.test.acceptance.docker.fixtures; -import org.jenkinsci.test.acceptance.docker.DockerFixture; +import java.io.IOException; +import java.nio.charset.StandardCharsets; import org.jenkinsci.test.acceptance.plugins.ssh_slaves.SshSlaveLauncher; import org.jenkinsci.test.acceptance.po.DumbSlave; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.images.builder.ImageFromDockerfile; /** * Jenkins agent with various login methods. */ -@DockerFixture(id = "ssh-agent", ports = 22) -public class SshAgentContainer extends JavaContainer { +public class SshAgentContainer extends GenericContainer { - public String getEncryptedEd25519PrivateKey() { - return resource("ed25519.priv").asText(); + public SshAgentContainer() { + super(new ImageFromDockerfile("localhost/testcontainers/ath-ssh-agent", false) + .withFileFromClasspath(".", SshAgentContainer.class.getName().replace('.', '/'))); + withExposedPorts(22); } - public String getEncryptedEd25519PrivateKeyPassphrase() { - return resource("ed25519.pass").asText(); + public String getEncryptedEd25519PrivateKey() throws IOException { + return load("ed25519.priv"); + } + + public String getEncryptedEd25519PrivateKeyPassphrase() throws IOException { + return load("ed25519.pass"); + } + + public String getPrivateKeyString() throws IOException { + return load("unsafe"); + } + + private String load(String resourceFile) throws IOException { + try (var is = SshAgentContainer.class.getResourceAsStream("SshAgentContainer/" + resourceFile)) { + return new String(is.readAllBytes(), StandardCharsets.US_ASCII); + } } public SshSlaveLauncher configureSSHSlaveLauncher(DumbSlave agent) { SshSlaveLauncher launcher = agent.setLauncher(SshSlaveLauncher.class); - launcher.host.set(ipBound(22)); - launcher.port(port(22)); + launcher.host.set(getHost()); + launcher.port(getMappedPort(22)); launcher.setSshHostKeyVerificationStrategy(SshSlaveLauncher.NonVerifyingKeyVerificationStrategy.class); return launcher; } diff --git a/src/main/java/org/jenkinsci/test/acceptance/docker/fixtures/XvncSlaveContainer.java b/src/main/java/org/jenkinsci/test/acceptance/docker/fixtures/XvncSlaveContainer.java index 809599cfdd..857ed22ef1 100644 --- a/src/main/java/org/jenkinsci/test/acceptance/docker/fixtures/XvncSlaveContainer.java +++ b/src/main/java/org/jenkinsci/test/acceptance/docker/fixtures/XvncSlaveContainer.java @@ -24,17 +24,23 @@ package org.jenkinsci.test.acceptance.docker.fixtures; -import org.jenkinsci.test.acceptance.docker.DockerFixture; import org.jenkinsci.test.acceptance.plugins.ssh_slaves.SshSlaveLauncher; import org.jenkinsci.test.acceptance.po.DumbSlave; import org.jenkinsci.test.acceptance.po.Jenkins; import org.jenkinsci.test.acceptance.po.Slave; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.images.builder.ImageFromDockerfile; /** * A fixture consisting of a Jenkins slave which can run XVNC. */ -@DockerFixture(id = "xvnc-slave", ports = 22) -public class XvncSlaveContainer extends JavaContainer { +public class XvncSlaveContainer extends GenericContainer { + + public XvncSlaveContainer() { + super(new ImageFromDockerfile("localhost/testcontainers/ath-xvnc-agent", false) + .withFileFromClasspath(".", XvncSlaveContainer.class.getName().replace('.', '/'))); + withExposedPorts(22); + } /** * Attaches the slave to Jenkins. @@ -45,8 +51,8 @@ public Slave connect(Jenkins j) { // Some code from SshSlaveController could be applicable here, but looks too tricky to reuse. DumbSlave s = j.slaves.create(DumbSlave.class); SshSlaveLauncher launcher = s.setLauncher(SshSlaveLauncher.class); - launcher.host.set(ipBound(22)); - launcher.port(port(22)); + launcher.host.set(getHost()); + launcher.port(getMappedPort(22)); launcher.pwdCredentials("test", "test"); launcher.setSshHostKeyVerificationStrategy(SshSlaveLauncher.NonVerifyingKeyVerificationStrategy.class); s.remoteFS.set("/home/test"); diff --git a/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/SshAgentContainer/Dockerfile b/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/SshAgentContainer/Dockerfile index e65abf4af8..54b1e2d550 100644 --- a/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/SshAgentContainer/Dockerfile +++ b/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/SshAgentContainer/Dockerfile @@ -1,4 +1,47 @@ -# curl -s https://raw.githubusercontent.com/jenkinsci/docker-fixtures/master/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/JavaContainer/Dockerfile | sha1sum | cut -c 1-12 -FROM jenkins/java:978f1af53461 -COPY *.pub /tmp +# originally SshdContainer/Dockerfile + +# +# Runs sshd and allow the 'test' user to login +# + +FROM ubuntu:noble + +# install SSHD +RUN apt-get update -y && \ + apt-get install -y \ + openssh-server \ + locales +RUN mkdir -p /var/run/sshd + +# create a test user +RUN useradd test -d /home/test && \ + mkdir -p /home/test/.ssh && \ + echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDzpxmTW9mH87DMkMSqBrSecoSHVCkKbW5IOO+4unak8M8cyn+b0iX07xkBn4hUJRfKA7ezUG8EX9ru5VinteqMOJOPknCuzmUS2Xj/WJdcq3BukBxuyiIRoUOXsCZzilR/DOyNqpjjI3iNb4los5//4aoKPCmLInFnQ3Y42VaimH1298ckEr4tRxsoipsEAANPXZ3p48gGwOf1hp56bTFImvATNwxMViPpqyKcyVaA7tXCBnEk/GEwb6MiroyHbS0VvBz9cZOpJv+8yQnyLndGdibk+hPbGp5iVAIsm28FEF+4FvlYlpBwq9OYuhOCREJvH9CxDMhbOXgwKPno9GyN kohsuke@atlas' > /home/test/.ssh/authorized_keys && \ + echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDagNSCDst/8z5oH9S5QWr+QNdx+haImY0FD3IQvKdD+eWI9zUbBgtoo/yYEbLvpTWiKsgT3Hw1F8mZ+/bd2Uv3lPyoG+TSzrHL4gSal6d1RWVjCOzSosciXVm4gRUvJjKXzaz8dOg+ii9yIrbeONNK0nlDUCAKy5YXSEl0avcPdUDyR3cStL6870SyanxAzktDw0n8xMq4F/alF3PZ002bcZJrmDeNVAwkP+uO2Tf8pN37SU+nApotZmlmZR32xYHnx+/OiQ7gOAVYmgNRMg0Kwh6Q73FcY3ZWCeNHwLnr95LoEAdj3On8Qr62VhGThuQNVCqBc6SeYjArfjijpcW9 jenkins-ci@localhost' >> /home/test/.ssh/authorized_keys && \ + chown -R test:test /home/test && \ + chmod 0600 /home/test/.ssh/authorized_keys && \ + echo "test:test" | chpasswd + +# https://stackoverflow.com/a/38553499/12916 +RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \ + dpkg-reconfigure --frontend=noninteractive locales && \ + update-locale LANG=en_US.UTF-8 +ENV LANG=en_US.UTF-8 + +# run SSHD in the foreground with error messages to stderr +ENTRYPOINT ["/usr/sbin/sshd", "-D", "-e"] + +# originally JavaContainer/Dockerfile as of https://github.com/jenkinsci/docker-fixtures/pull/138 + +RUN apt-get update && \ + apt-get install --no-install-recommends -y \ + software-properties-common \ + openjdk-21-jdk-headless \ + curl \ + ant \ + maven + +# additional setup for SshAgentContainer + +COPY *.pub /tmp/ RUN cat /tmp/*.pub >> /home/test/.ssh/authorized_keys diff --git a/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/SshAgentContainer/unsafe b/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/SshAgentContainer/unsafe new file mode 100644 index 0000000000..d7d7b319a9 --- /dev/null +++ b/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/SshAgentContainer/unsafe @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEA86cZk1vZh/OwzJDEqga0nnKEh1QpCm1uSDjvuLp2pPDPHMp/ +m9Il9O8ZAZ+IVCUXygO3s1BvBF/a7uVYp7XqjDiTj5Jwrs5lEtl4/1iXXKtwbpAc +bsoiEaFDl7Amc4pUfwzsjaqY4yN4jW+JaLOf/+GqCjwpiyJxZ0N2ONlWoph9dvfH +JBK+LUcbKIqbBAADT12d6ePIBsDn9Yaeem0xSJrwEzcMTFYj6asinMlWgO7VwgZx +JPxhMG+jIq6Mh20tFbwc/XGTqSb/vMkJ8i53RnYm5PoT2xqeYlQCLJtvBRBfuBb5 +WJaQcKvTmLoTgkRCbx/QsQzIWzl4MCj56PRsjQIDAQABAoIBAAGTiy7Q4U9n3DT2 +ms8ey/xacVEO0lUm8Be3hpWDX1Eh3bUp+jlf2q8C/P5tscwZkVXVQFMAqjc1B42U +Hka3fpT5qLq9D82RuEWu8oF0aUZINaoBdK2i0SWcDXvlv9nvgyxvQPiJqgOOLzF7 +D0CGKPrW0urOCNbFmkY4wYMMpOrYXnwb6bc1p7snbzeRigaoGvSgvH7fx2Steg1o +j50C4BKVtXPKQdmckG2SFn0T+U1iCsRG+KNcENX2vX8gyrXImAH093WTjKsmM9et +ddWB+molSnXR/MNrf6BB2mpvXLNyR2/RgBd2jwSQnpDkpms4Br5nek3YYN1dBRL4 +6bofHWECgYEA+7n5OIEbvpMtGxJwOovj0KZMzPkHyQH/DZzo48rS+39goNk/0KLF +c3L3sHbT3Lr4qA/6JOCjlzw7o2AbOrRL4ke1uqcCVQMdDqZdvNezMvTzqEbQGdHD +aFnEcUV2tvEwP11q37ianBRPH5stOnEwQNuv6AJo5LKwi4mTS7qEW9cCgYEA98oJ +h+vMKpXGdJzkSDMzYBrC2tYgqjby6+zGKz8BZ58YecsL+oi2GXBaDTfK+16CKeFM +8+qQN9Kl1ZNOlk64XJXjt77h0FcFuGe+6rUpM1aEizrf9sWPVZO+QQfhnjsiAhtQ +YX783ydy9rMn1FDPMtNNq4GMhGsFCaL4RupOjjsCgYAnk9XbTHFQRVOSLhP3IIdx +BrSMhZrzv5yaR1FWf00svZozr/SYmP7yZ+EJnaUxzzPJOLnbknYmERJPXYzqbe6A +ZUXtUtTLCPJIm1+hkUhbeqfUjU2qwZA3l+WK6aEAomszizyCcEPexlKqZXt29NTh +XakKkVZsnqujRL4j6e9lgQKBgQDvhD8EQJyAyXgkvoc3dy6BBj019WdrwWO9Q4km +wmdkN3gcOnYgvUdwfZa+UiEGLAub2eldmW3AWADu2s5LIlq5PDX7Jir3DTc9UiNM +ksL5mfbS8p0M11i+uupbx/eB0N0FtktTgsGCH4rUBsdIRriSA4h/cOFYGm6rKvnc +6p32gwKBgHZYmXzuBWZlWEmPiXbTaI4egJugur5FrT6BJfiLsN2MHBJi9k1IpKEP +SaT+v0IXJ8jP4gSiu4/gyJQpkn7yiMNhwYWlQt+1zyIkHjUsEG82Z8Mqpjx2EJgG +MxDybQux1uk0hyCmMS757WkbTyi0pTWz7PgTIdfmYqhZVV8KRSUi +-----END RSA PRIVATE KEY----- diff --git a/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/SshAgentContainer/unsafe.pub b/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/SshAgentContainer/unsafe.pub new file mode 100644 index 0000000000..2c75d3c1e7 --- /dev/null +++ b/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/SshAgentContainer/unsafe.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDzpxmTW9mH87DMkMSqBrSecoSHVCkKbW5IOO+4unak8M8cyn+b0iX07xkBn4hUJRfKA7ezUG8EX9ru5VinteqMOJOPknCuzmUS2Xj/WJdcq3BukBxuyiIRoUOXsCZzilR/DOyNqpjjI3iNb4los5//4aoKPCmLInFnQ3Y42VaimH1298ckEr4tRxsoipsEAANPXZ3p48gGwOf1hp56bTFImvATNwxMViPpqyKcyVaA7tXCBnEk/GEwb6MiroyHbS0VvBz9cZOpJv+8yQnyLndGdibk+hPbGp5iVAIsm28FEF+4FvlYlpBwq9OYuhOCREJvH9CxDMhbOXgwKPno9GyN kohsuke@atlas diff --git a/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/SshAgentContainer/unsafe_enc_key b/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/SshAgentContainer/unsafe_enc_key new file mode 100644 index 0000000000..1bc883e3d3 --- /dev/null +++ b/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/SshAgentContainer/unsafe_enc_key @@ -0,0 +1,30 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: AES-128-CBC,6C6AE91D9BBAF093BB945784175F8EBA + +lG8UxQ+QvDItjZWpbwLMK+tU5XDnc+LL31q+NLfKxvVwPM1/pyYAEsG2K7kW8HAe +r1DPDSmaXscDqU8VunUVd8S3ImrG8HzL4lOP5LpWMbRMRYuuLqJQes38BScqG0dK +fGvdTy5cAlHFMzqtg1Gw0P2tBORz1wF1WmeGjTaEgH+Lb6mCyI2a4eaCdLDdVIAi +KuP9ylE8qHMDgHkb25XvIKCuFGiu4+e60e9KWfI2542goaRdXe7pCXg7V21WYwce ++TroepBjSftbM2CL75+NAPOZt89l1mT7ZaxnDiQWOvmS5nYX3j/7213XaoGLyfU7 +EBevPImxFxkvklt1PHDqT8viyNu/sVZq1sjXBRI69Z3xqFEVQS6cstaJ10XEt5O0 +ppHWAbGI98lzOX7MdwF75fnaiOFKqSGFVW1YqnbgDobIWGtSVCYQIErB8hvOo+2j +5JFuDe2qsw1KRo2lPeLTv3UItpM171PqcOH2gP9h8ds3ZkgYozco2NadacNRtuLK +rvRscCmWojUf2s/mbBEgO8tZusrK+jAz5BN8nRb8d6u6Fqep/3h6W7hN181LRwbV +RbLb/IcwW/uMgNRWsSeoayx5Fcj5ztor5KAGZXa6nZFfkMoj4GXMdDNWNinvo/5B +KDbeWu2TO7s5FlSHrqQT63Ne9X8PL7+jXweB9ceXGHueSKpVSzMdvDEvDJoCpXAk +d2fin2pzwxUFxclbi6F+v3R9DN+Q88iOWYZjeOjNu8hjJJe3xGY93xXS1ep/0AZh +hly1+vxN44RXwFSENpkKCi7Z2URfISmO+J+YUQR6vXjlE0mbjLiW/z53veZmRa2b +iY+qPaJsMq+PRQsuERxL7lFSfQRx/EIa0hUupdmQTIUZOJVT+YX+f/IiDsApQkzI +81orGiCAEsCIk0ysog8CePLpf0VlFyP7J0U7PmV1ulqiC6smejQSqmthW2EyDQBc +PNOcm1pUOJl2avJykw5MgpgHW+AYX9YkHPYc3V9ms9wCM1fTa8Hup0SmHlsdmh+V +VeXb+disn+b1RoN7C7uL7j82buBN+D8LtH9XozJfd8y/2vUAIxuB8dY71bpHtFmu +yngIbMYzXA3+eLn1eZNry8xxRbaGZtHtSTmCBBHDbO5Q1LJ8tDna3ciPVtG2B9zZ +jIq7tlpYUk3NawQXnDkTdFf8eU5oD8qJMRGcIQErBZwFsPG0owUQgKoPHUQXLGs9 +sHFrC9LTsJQFn7Yhnzp+8uQMpUBz6nHNE8AxYjJMXWMszhwAvOaKCQvocDrOBGxo +mo71QzDOjeAt12IEdbRmvmefh+l4lNP21YzcsXdMKoe6N5B0MMVf3brnz/XSgFUP +5K5GoVQj+V6tCJSOEV2QSwXuGQSqsaCiYbWB+jiQ1v/DMVGjRWSqyRwvj3SIiZTR +PsdN3tYHtnmBVshoH9Wk6LI+UH3XREgahBeRvHxeBC7xSpk+ST+PiWSW0bihIpd+ +dsc6r02rEHn25T6+viQ8fYbUmrE9UFiNP59llsnvJMxNwpGSX2PwxCDvdneU3Zp4 +J7Q6iG3TzvjOq9Br4TvLdovmNa0qQrSAGPRmRpAjHvtMU47afjBVy9tzhVRXHFRv +-----END RSA PRIVATE KEY----- diff --git a/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/SshAgentContainer/unsafe_enc_key.pub b/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/SshAgentContainer/unsafe_enc_key.pub new file mode 100644 index 0000000000..319760917c --- /dev/null +++ b/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/SshAgentContainer/unsafe_enc_key.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDagNSCDst/8z5oH9S5QWr+QNdx+haImY0FD3IQvKdD+eWI9zUbBgtoo/yYEbLvpTWiKsgT3Hw1F8mZ+/bd2Uv3lPyoG+TSzrHL4gSal6d1RWVjCOzSosciXVm4gRUvJjKXzaz8dOg+ii9yIrbeONNK0nlDUCAKy5YXSEl0avcPdUDyR3cStL6870SyanxAzktDw0n8xMq4F/alF3PZ002bcZJrmDeNVAwkP+uO2Tf8pN37SU+nApotZmlmZR32xYHnx+/OiQ7gOAVYmgNRMg0Kwh6Q73FcY3ZWCeNHwLnr95LoEAdj3On8Qr62VhGThuQNVCqBc6SeYjArfjijpcW9 jenkins-ci@localhost diff --git a/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/SshAgentContainer/unsafe_enc_key_passphrase.txt b/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/SshAgentContainer/unsafe_enc_key_passphrase.txt new file mode 100644 index 0000000000..f8a1591a88 --- /dev/null +++ b/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/SshAgentContainer/unsafe_enc_key_passphrase.txt @@ -0,0 +1 @@ +jenkins-ci \ No newline at end of file diff --git a/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/XvncSlaveContainer/Dockerfile b/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/XvncSlaveContainer/Dockerfile index 7b45ce33a5..a043a7528d 100644 --- a/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/XvncSlaveContainer/Dockerfile +++ b/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/XvncSlaveContainer/Dockerfile @@ -1,12 +1,55 @@ -# curl -s https://raw.githubusercontent.com/jenkinsci/docker-fixtures/master/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/JavaContainer/Dockerfile | sha1sum | cut -c 1-12 -FROM jenkins/java:978f1af53461 +# originally SshdContainer/Dockerfile + +# +# Runs sshd and allow the 'test' user to login +# + +FROM ubuntu:noble + +# install SSHD +RUN apt-get update -y && \ + apt-get install -y \ + openssh-server \ + locales +RUN mkdir -p /var/run/sshd + +# create a test user +RUN useradd test -d /home/test && \ + mkdir -p /home/test/.ssh && \ + echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDzpxmTW9mH87DMkMSqBrSecoSHVCkKbW5IOO+4unak8M8cyn+b0iX07xkBn4hUJRfKA7ezUG8EX9ru5VinteqMOJOPknCuzmUS2Xj/WJdcq3BukBxuyiIRoUOXsCZzilR/DOyNqpjjI3iNb4los5//4aoKPCmLInFnQ3Y42VaimH1298ckEr4tRxsoipsEAANPXZ3p48gGwOf1hp56bTFImvATNwxMViPpqyKcyVaA7tXCBnEk/GEwb6MiroyHbS0VvBz9cZOpJv+8yQnyLndGdibk+hPbGp5iVAIsm28FEF+4FvlYlpBwq9OYuhOCREJvH9CxDMhbOXgwKPno9GyN kohsuke@atlas' > /home/test/.ssh/authorized_keys && \ + echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDagNSCDst/8z5oH9S5QWr+QNdx+haImY0FD3IQvKdD+eWI9zUbBgtoo/yYEbLvpTWiKsgT3Hw1F8mZ+/bd2Uv3lPyoG+TSzrHL4gSal6d1RWVjCOzSosciXVm4gRUvJjKXzaz8dOg+ii9yIrbeONNK0nlDUCAKy5YXSEl0avcPdUDyR3cStL6870SyanxAzktDw0n8xMq4F/alF3PZ002bcZJrmDeNVAwkP+uO2Tf8pN37SU+nApotZmlmZR32xYHnx+/OiQ7gOAVYmgNRMg0Kwh6Q73FcY3ZWCeNHwLnr95LoEAdj3On8Qr62VhGThuQNVCqBc6SeYjArfjijpcW9 jenkins-ci@localhost' >> /home/test/.ssh/authorized_keys && \ + chown -R test:test /home/test && \ + chmod 0600 /home/test/.ssh/authorized_keys && \ + echo "test:test" | chpasswd + +# https://stackoverflow.com/a/38553499/12916 +RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \ + dpkg-reconfigure --frontend=noninteractive locales && \ + update-locale LANG=en_US.UTF-8 +ENV LANG=en_US.UTF-8 + +# run SSHD in the foreground with error messages to stderr +ENTRYPOINT ["/usr/sbin/sshd", "-D", "-e"] + +# originally JavaContainer/Dockerfile as of https://github.com/jenkinsci/docker-fixtures/pull/138 + +RUN apt-get update && \ + apt-get install --no-install-recommends -y \ + software-properties-common \ + openjdk-21-jdk-headless \ + curl \ + ant \ + maven + +# additional setup for XvncSlaveContainer + RUN apt-get update && apt-get install -y tigervnc-standalone-server imagemagick # So it is owned by root and has the permissions vncserver seems to require: RUN mkdir /tmp/.X11-unix && chmod 1777 /tmp/.X11-unix/ # TODO seems this can be picked up from the host, which is unwanted: -ENV XAUTHORITY /home/test/.Xauthority +ENV XAUTHORITY=/home/test/.Xauthority USER test RUN mkdir /home/test/.vnc && (echo jenkins; echo jenkins) | vncpasswd /home/test/.vnc/passwd diff --git a/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/XvncSlaveContainer/unsafe b/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/XvncSlaveContainer/unsafe new file mode 100644 index 0000000000..d7d7b319a9 --- /dev/null +++ b/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/XvncSlaveContainer/unsafe @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEA86cZk1vZh/OwzJDEqga0nnKEh1QpCm1uSDjvuLp2pPDPHMp/ +m9Il9O8ZAZ+IVCUXygO3s1BvBF/a7uVYp7XqjDiTj5Jwrs5lEtl4/1iXXKtwbpAc +bsoiEaFDl7Amc4pUfwzsjaqY4yN4jW+JaLOf/+GqCjwpiyJxZ0N2ONlWoph9dvfH +JBK+LUcbKIqbBAADT12d6ePIBsDn9Yaeem0xSJrwEzcMTFYj6asinMlWgO7VwgZx +JPxhMG+jIq6Mh20tFbwc/XGTqSb/vMkJ8i53RnYm5PoT2xqeYlQCLJtvBRBfuBb5 +WJaQcKvTmLoTgkRCbx/QsQzIWzl4MCj56PRsjQIDAQABAoIBAAGTiy7Q4U9n3DT2 +ms8ey/xacVEO0lUm8Be3hpWDX1Eh3bUp+jlf2q8C/P5tscwZkVXVQFMAqjc1B42U +Hka3fpT5qLq9D82RuEWu8oF0aUZINaoBdK2i0SWcDXvlv9nvgyxvQPiJqgOOLzF7 +D0CGKPrW0urOCNbFmkY4wYMMpOrYXnwb6bc1p7snbzeRigaoGvSgvH7fx2Steg1o +j50C4BKVtXPKQdmckG2SFn0T+U1iCsRG+KNcENX2vX8gyrXImAH093WTjKsmM9et +ddWB+molSnXR/MNrf6BB2mpvXLNyR2/RgBd2jwSQnpDkpms4Br5nek3YYN1dBRL4 +6bofHWECgYEA+7n5OIEbvpMtGxJwOovj0KZMzPkHyQH/DZzo48rS+39goNk/0KLF +c3L3sHbT3Lr4qA/6JOCjlzw7o2AbOrRL4ke1uqcCVQMdDqZdvNezMvTzqEbQGdHD +aFnEcUV2tvEwP11q37ianBRPH5stOnEwQNuv6AJo5LKwi4mTS7qEW9cCgYEA98oJ +h+vMKpXGdJzkSDMzYBrC2tYgqjby6+zGKz8BZ58YecsL+oi2GXBaDTfK+16CKeFM +8+qQN9Kl1ZNOlk64XJXjt77h0FcFuGe+6rUpM1aEizrf9sWPVZO+QQfhnjsiAhtQ +YX783ydy9rMn1FDPMtNNq4GMhGsFCaL4RupOjjsCgYAnk9XbTHFQRVOSLhP3IIdx +BrSMhZrzv5yaR1FWf00svZozr/SYmP7yZ+EJnaUxzzPJOLnbknYmERJPXYzqbe6A +ZUXtUtTLCPJIm1+hkUhbeqfUjU2qwZA3l+WK6aEAomszizyCcEPexlKqZXt29NTh +XakKkVZsnqujRL4j6e9lgQKBgQDvhD8EQJyAyXgkvoc3dy6BBj019WdrwWO9Q4km +wmdkN3gcOnYgvUdwfZa+UiEGLAub2eldmW3AWADu2s5LIlq5PDX7Jir3DTc9UiNM +ksL5mfbS8p0M11i+uupbx/eB0N0FtktTgsGCH4rUBsdIRriSA4h/cOFYGm6rKvnc +6p32gwKBgHZYmXzuBWZlWEmPiXbTaI4egJugur5FrT6BJfiLsN2MHBJi9k1IpKEP +SaT+v0IXJ8jP4gSiu4/gyJQpkn7yiMNhwYWlQt+1zyIkHjUsEG82Z8Mqpjx2EJgG +MxDybQux1uk0hyCmMS757WkbTyi0pTWz7PgTIdfmYqhZVV8KRSUi +-----END RSA PRIVATE KEY----- diff --git a/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/XvncSlaveContainer/unsafe.pub b/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/XvncSlaveContainer/unsafe.pub new file mode 100644 index 0000000000..2c75d3c1e7 --- /dev/null +++ b/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/XvncSlaveContainer/unsafe.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDzpxmTW9mH87DMkMSqBrSecoSHVCkKbW5IOO+4unak8M8cyn+b0iX07xkBn4hUJRfKA7ezUG8EX9ru5VinteqMOJOPknCuzmUS2Xj/WJdcq3BukBxuyiIRoUOXsCZzilR/DOyNqpjjI3iNb4los5//4aoKPCmLInFnQ3Y42VaimH1298ckEr4tRxsoipsEAANPXZ3p48gGwOf1hp56bTFImvATNwxMViPpqyKcyVaA7tXCBnEk/GEwb6MiroyHbS0VvBz9cZOpJv+8yQnyLndGdibk+hPbGp5iVAIsm28FEF+4FvlYlpBwq9OYuhOCREJvH9CxDMhbOXgwKPno9GyN kohsuke@atlas diff --git a/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/XvncSlaveContainer/unsafe_enc_key b/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/XvncSlaveContainer/unsafe_enc_key new file mode 100644 index 0000000000..1bc883e3d3 --- /dev/null +++ b/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/XvncSlaveContainer/unsafe_enc_key @@ -0,0 +1,30 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: AES-128-CBC,6C6AE91D9BBAF093BB945784175F8EBA + +lG8UxQ+QvDItjZWpbwLMK+tU5XDnc+LL31q+NLfKxvVwPM1/pyYAEsG2K7kW8HAe +r1DPDSmaXscDqU8VunUVd8S3ImrG8HzL4lOP5LpWMbRMRYuuLqJQes38BScqG0dK +fGvdTy5cAlHFMzqtg1Gw0P2tBORz1wF1WmeGjTaEgH+Lb6mCyI2a4eaCdLDdVIAi +KuP9ylE8qHMDgHkb25XvIKCuFGiu4+e60e9KWfI2542goaRdXe7pCXg7V21WYwce ++TroepBjSftbM2CL75+NAPOZt89l1mT7ZaxnDiQWOvmS5nYX3j/7213XaoGLyfU7 +EBevPImxFxkvklt1PHDqT8viyNu/sVZq1sjXBRI69Z3xqFEVQS6cstaJ10XEt5O0 +ppHWAbGI98lzOX7MdwF75fnaiOFKqSGFVW1YqnbgDobIWGtSVCYQIErB8hvOo+2j +5JFuDe2qsw1KRo2lPeLTv3UItpM171PqcOH2gP9h8ds3ZkgYozco2NadacNRtuLK +rvRscCmWojUf2s/mbBEgO8tZusrK+jAz5BN8nRb8d6u6Fqep/3h6W7hN181LRwbV +RbLb/IcwW/uMgNRWsSeoayx5Fcj5ztor5KAGZXa6nZFfkMoj4GXMdDNWNinvo/5B +KDbeWu2TO7s5FlSHrqQT63Ne9X8PL7+jXweB9ceXGHueSKpVSzMdvDEvDJoCpXAk +d2fin2pzwxUFxclbi6F+v3R9DN+Q88iOWYZjeOjNu8hjJJe3xGY93xXS1ep/0AZh +hly1+vxN44RXwFSENpkKCi7Z2URfISmO+J+YUQR6vXjlE0mbjLiW/z53veZmRa2b +iY+qPaJsMq+PRQsuERxL7lFSfQRx/EIa0hUupdmQTIUZOJVT+YX+f/IiDsApQkzI +81orGiCAEsCIk0ysog8CePLpf0VlFyP7J0U7PmV1ulqiC6smejQSqmthW2EyDQBc +PNOcm1pUOJl2avJykw5MgpgHW+AYX9YkHPYc3V9ms9wCM1fTa8Hup0SmHlsdmh+V +VeXb+disn+b1RoN7C7uL7j82buBN+D8LtH9XozJfd8y/2vUAIxuB8dY71bpHtFmu +yngIbMYzXA3+eLn1eZNry8xxRbaGZtHtSTmCBBHDbO5Q1LJ8tDna3ciPVtG2B9zZ +jIq7tlpYUk3NawQXnDkTdFf8eU5oD8qJMRGcIQErBZwFsPG0owUQgKoPHUQXLGs9 +sHFrC9LTsJQFn7Yhnzp+8uQMpUBz6nHNE8AxYjJMXWMszhwAvOaKCQvocDrOBGxo +mo71QzDOjeAt12IEdbRmvmefh+l4lNP21YzcsXdMKoe6N5B0MMVf3brnz/XSgFUP +5K5GoVQj+V6tCJSOEV2QSwXuGQSqsaCiYbWB+jiQ1v/DMVGjRWSqyRwvj3SIiZTR +PsdN3tYHtnmBVshoH9Wk6LI+UH3XREgahBeRvHxeBC7xSpk+ST+PiWSW0bihIpd+ +dsc6r02rEHn25T6+viQ8fYbUmrE9UFiNP59llsnvJMxNwpGSX2PwxCDvdneU3Zp4 +J7Q6iG3TzvjOq9Br4TvLdovmNa0qQrSAGPRmRpAjHvtMU47afjBVy9tzhVRXHFRv +-----END RSA PRIVATE KEY----- diff --git a/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/XvncSlaveContainer/unsafe_enc_key.pub b/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/XvncSlaveContainer/unsafe_enc_key.pub new file mode 100644 index 0000000000..319760917c --- /dev/null +++ b/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/XvncSlaveContainer/unsafe_enc_key.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDagNSCDst/8z5oH9S5QWr+QNdx+haImY0FD3IQvKdD+eWI9zUbBgtoo/yYEbLvpTWiKsgT3Hw1F8mZ+/bd2Uv3lPyoG+TSzrHL4gSal6d1RWVjCOzSosciXVm4gRUvJjKXzaz8dOg+ii9yIrbeONNK0nlDUCAKy5YXSEl0avcPdUDyR3cStL6870SyanxAzktDw0n8xMq4F/alF3PZ002bcZJrmDeNVAwkP+uO2Tf8pN37SU+nApotZmlmZR32xYHnx+/OiQ7gOAVYmgNRMg0Kwh6Q73FcY3ZWCeNHwLnr95LoEAdj3On8Qr62VhGThuQNVCqBc6SeYjArfjijpcW9 jenkins-ci@localhost diff --git a/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/XvncSlaveContainer/unsafe_enc_key_passphrase.txt b/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/XvncSlaveContainer/unsafe_enc_key_passphrase.txt new file mode 100644 index 0000000000..f8a1591a88 --- /dev/null +++ b/src/main/resources/org/jenkinsci/test/acceptance/docker/fixtures/XvncSlaveContainer/unsafe_enc_key_passphrase.txt @@ -0,0 +1 @@ +jenkins-ci \ No newline at end of file diff --git a/src/test/java/plugins/AntPluginTest.java b/src/test/java/plugins/AntPluginTest.java index 0440944209..917045ff86 100644 --- a/src/test/java/plugins/AntPluginTest.java +++ b/src/test/java/plugins/AntPluginTest.java @@ -5,11 +5,9 @@ import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertTrue; -import com.google.inject.Inject; import java.util.regex.Pattern; import org.apache.commons.lang3.StringUtils; import org.jenkinsci.test.acceptance.Matchers; -import org.jenkinsci.test.acceptance.docker.DockerContainerHolder; import org.jenkinsci.test.acceptance.docker.fixtures.SshAgentContainer; import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; import org.jenkinsci.test.acceptance.junit.WithPlugins; @@ -20,6 +18,7 @@ import org.jenkinsci.test.acceptance.po.FreeStyleJob; import org.jenkinsci.test.acceptance.po.ToolInstallation; import org.jenkinsci.test.acceptance.po.WorkflowJob; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.openqa.selenium.By; @@ -41,19 +40,26 @@ public class AntPluginTest extends AbstractJUnitTest { FreeStyleJob job; private AntBuildStep step; - @Inject - private DockerContainerHolder docker; - private SshAgentContainer sshd; + private DumbSlave agent; @Before public void setUp() { job = jenkins.jobs.create(FreeStyleJob.class); - sshd = docker.get(); + } + + @After + public void tearDown() { + if (sshd != null) { + sshd.stop(); + } } private void useCustomAgent() { + sshd = new SshAgentContainer(); + sshd.start(); + String remote_fs = "/tmp"; agent = jenkins.slaves.create(DumbSlave.class); agent.setExecutors(1); diff --git a/src/test/java/plugins/OicAuthPluginTest.java b/src/test/java/plugins/OicAuthPluginTest.java index 69dde377a5..224f4e3927 100644 --- a/src/test/java/plugins/OicAuthPluginTest.java +++ b/src/test/java/plugins/OicAuthPluginTest.java @@ -23,8 +23,8 @@ import org.jenkinsci.test.acceptance.po.WhoAmI; import org.jenkinsci.test.acceptance.utils.keycloack.KeycloakUtils; import org.json.JSONObject; +import org.junit.After; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; import org.keycloak.admin.client.Keycloak; import org.keycloak.admin.client.resource.GroupResource; @@ -47,8 +47,7 @@ public class OicAuthPluginTest extends AbstractJUnitTest { private static final String KEYCLOAK_IMAGE = "keycloak/keycloak:26.4.7@sha256:9409c59bdfb65dbffa20b11e6f18b8abb9281d480c7ca402f51ed3d5977e6007"; - @Rule - public KeycloakContainer keycloak = new KeycloakContainer(KEYCLOAK_IMAGE); + private KeycloakContainer keycloak; @Inject public KeycloakUtils keycloakUtils; @@ -58,10 +57,19 @@ public class OicAuthPluginTest extends AbstractJUnitTest { @Before public void setUpKeycloak() throws Exception { + keycloak = new KeycloakContainer(KEYCLOAK_IMAGE); + keycloak.start(); configureOIDCProvider(); configureRealm(); } + @After + public void tearDownKeycloak() { + if (keycloak != null) { + keycloak.stop(); + } + } + private void configureOIDCProvider() throws Exception { try (Keycloak keycloakAdmin = keycloak.getKeycloakAdminClient()) { // Create Realm diff --git a/src/test/java/plugins/SshSlavesPluginTest.java b/src/test/java/plugins/SshSlavesPluginTest.java index aa7ed5f69d..8ea21ba17a 100644 --- a/src/test/java/plugins/SshSlavesPluginTest.java +++ b/src/test/java/plugins/SshSlavesPluginTest.java @@ -29,10 +29,9 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import com.google.inject.Inject; +import java.io.IOException; import java.time.Duration; import java.util.concurrent.Callable; -import org.jenkinsci.test.acceptance.docker.DockerContainerHolder; import org.jenkinsci.test.acceptance.docker.fixtures.SshAgentContainer; import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; import org.jenkinsci.test.acceptance.junit.DockerTest; @@ -47,6 +46,7 @@ import org.jenkinsci.test.acceptance.po.Control; import org.jenkinsci.test.acceptance.po.DumbSlave; import org.jenkinsci.test.acceptance.po.FreeStyleJob; +import org.junit.After; import org.junit.Test; import org.junit.experimental.categories.Category; import org.jvnet.hudson.test.Issue; @@ -59,20 +59,25 @@ public class SshSlavesPluginTest extends AbstractJUnitTest { public static final String REMOTE_FS = "/tmp"; - @Inject - private DockerContainerHolder docker; - private SshAgentContainer sshd; + private DumbSlave slave; private void setUp() { - sshd = docker.get(); - + sshd = new SshAgentContainer(); + sshd.start(); slave = jenkins.slaves.create(DumbSlave.class); slave.setExecutors(1); slave.remoteFS.set(REMOTE_FS); } + @After + public void tearDown() { + if (sshd != null) { + sshd.stop(); + } + } + @Test @Since("1.560") public void newAgent() { @@ -171,7 +176,7 @@ public void connectWithPassword() { } @Test - public void connectWithKey() { + public void connectWithKey() throws IOException { setUp(); configureDefaultSSHSlaveLauncher().keyCredentials("test", sshd.getPrivateKeyString(), null); slave.save(); @@ -181,7 +186,7 @@ public void connectWithKey() { @Issue("JENKINS-46754") @Test - public void connectWithEd25519EncKey() { + public void connectWithEd25519EncKey() throws IOException { setUp(); configureDefaultSSHSlaveLauncher() .keyCredentials( @@ -193,7 +198,7 @@ public void connectWithEd25519EncKey() { @Test public void unableToConnectWrongPort() { setUp(); - configureSSHSlaveLauncher(sshd.ipBound(22), 1234).pwdCredentials("test", "test"); + configureSSHSlaveLauncher(sshd.getHost(), 1234).pwdCredentials("test", "test"); slave.save(); // Wait for connection attempt to fail @@ -215,15 +220,15 @@ public void customJavaPath() { setUp(); SshSlaveLauncher launcher = configureDefaultSSHSlaveLauncher().pwdCredentials("test", "test"); - String javaPath = "/usr/lib/jvm/java-17-openjdk-amd64/bin/java"; + String javaPath = "/usr/lib/jvm/java-21-openjdk-amd64/bin/java"; if (System.getProperty("os.arch").equals("aarch64")) { - javaPath = "/usr/lib/jvm/java-17-openjdk-arm64/bin/java"; + javaPath = "/usr/lib/jvm/java-21-openjdk-arm64/bin/java"; } launcher.setJavaPath(javaPath); slave.save(); verify(); - verifyLog("java-17-openjdk"); + verifyLog("java-21-openjdk"); } @Test @@ -285,7 +290,7 @@ private void verifyLog(String message) { } private SshSlaveLauncher configureDefaultSSHSlaveLauncher() { - return configureSSHSlaveLauncher(sshd.ipBound(22), sshd.port(22)); + return configureSSHSlaveLauncher(sshd.getHost(), sshd.getMappedPort(22)); } private SshSlaveLauncher configureSSHSlaveLauncher(String host, int port) { diff --git a/src/test/java/plugins/XvncPluginTest.java b/src/test/java/plugins/XvncPluginTest.java index cc0f2de575..b407db8e84 100644 --- a/src/test/java/plugins/XvncPluginTest.java +++ b/src/test/java/plugins/XvncPluginTest.java @@ -3,8 +3,6 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; -import com.google.inject.Inject; -import org.jenkinsci.test.acceptance.docker.DockerContainerHolder; import org.jenkinsci.test.acceptance.docker.fixtures.XvncSlaveContainer; import org.jenkinsci.test.acceptance.junit.AbstractJUnitTest; import org.jenkinsci.test.acceptance.junit.DockerTest; @@ -16,6 +14,7 @@ import org.jenkinsci.test.acceptance.po.FreeStyleJob; import org.jenkinsci.test.acceptance.po.Slave; import org.jenkinsci.test.acceptance.po.WorkflowJob; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.experimental.categories.Category; @@ -26,16 +25,25 @@ @WithDocker public class XvncPluginTest extends AbstractJUnitTest { - @Inject - DockerContainerHolder containerHolder; + private XvncSlaveContainer container; @Before public void setUp() { - Slave slave = containerHolder.get().connect(jenkins); + container = new XvncSlaveContainer(); + + container.start(); + Slave slave = container.connect(jenkins); slave.setLabels("xvnc"); slave.save(); } + @After + public void tearDown() { + if (container != null) { + container.stop(); + } + } + private FreeStyleJob createJob() { FreeStyleJob job = jenkins.jobs.create(FreeStyleJob.class); job.configure();