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();