From cb77651e82702bbd3c21ba9f3137cba8e7004e87 Mon Sep 17 00:00:00 2001 From: Elvis Souza Date: Mon, 24 Jun 2024 22:43:51 -0300 Subject: [PATCH] Fixing amd64 static docker image and min glibc to 2.15 (#494) * [Gradle Release Plugin] - new version commit: '3.21.2-snapshot'. * Fixing amd64 static docker image * setup image test * fixing tmp dir * fixing tmp dir * setup debian 10 slim again for amd64 * creating hidden command to create tmp dir * creating tmp dir at static docker image * release notes * update source list * downgrading image builder * simplify * fixing unmet dep * fixing unmet dep * fixing unmet dep * configuring aarch builder with debian stretch 9 * reconfigure cd * change create-tmp-dir impl * cd * fixing test - port conflicting happening * cd --- .github/workflows/actions-deploy.yml | 1 - Dockerfile.amd64-static | 2 +- Dockerfile.builder.linux-aarch64 | 17 +++++++++++++- Dockerfile.builder.linux-amd64 | 17 +++++++++++++- RELEASE-NOTES.md | 4 ++++ gradle.properties | 2 +- src/main/docker/builder/sources.list | 2 ++ .../java/com/mageddo/dnsproxyserver/App.java | 22 ++++++++++++++++++- .../config/dataprovider/vo/ConfigFlag.java | 7 ++++++ .../java/com/mageddo/net/SocketUtils.java | 16 ++++++++++++++ .../mageddo/dnsproxyserver/AppCompTest.java | 16 ++++++++++++++ .../java/com/mageddo/net/SocketUtilsTest.java | 19 ++++++++++++++++ src/test/java/testing/ContextSupplier.java | 4 ++++ src/test/resources/flags-test/001.json | 3 ++- 14 files changed, 125 insertions(+), 7 deletions(-) create mode 100644 src/main/docker/builder/sources.list create mode 100644 src/main/java/com/mageddo/net/SocketUtils.java create mode 100644 src/test/java/com/mageddo/net/SocketUtilsTest.java diff --git a/.github/workflows/actions-deploy.yml b/.github/workflows/actions-deploy.yml index f2e6d1898..5d0c3f5db 100644 --- a/.github/workflows/actions-deploy.yml +++ b/.github/workflows/actions-deploy.yml @@ -5,7 +5,6 @@ on: branches: - master - permissions: contents: write diff --git a/Dockerfile.amd64-static b/Dockerfile.amd64-static index c0254f60a..b42bfdb1b 100644 --- a/Dockerfile.amd64-static +++ b/Dockerfile.amd64-static @@ -5,4 +5,4 @@ LABEL dps.container=true ENV DPS_CONTAINER=1 VOLUME ["/var/run/docker.sock", "/var/run/docker.sock"] ENTRYPOINT ["/app/dns-proxy-server"] -CMD ["-D", "java.io.tmpdir=/app"] +CMD ["--create-tmp-dir"] diff --git a/Dockerfile.builder.linux-aarch64 b/Dockerfile.builder.linux-aarch64 index 094fd62b3..830c329b6 100644 --- a/Dockerfile.builder.linux-aarch64 +++ b/Dockerfile.builder.linux-aarch64 @@ -1,4 +1,19 @@ -FROM ghcr.io/graalvm/graalvm-community:22.0.1@sha256:fa702fdbfcf865a2a20bc48d933f877f75e9c1ff4d91bf68ad23e5b8dd39c2d5 +FROM arm64v8/debian:9-slim + +COPY ./src/main/docker/builder/sources.list /etc/apt/sources.list + +RUN apt-get update -y &&\ + apt-get install --force-yes -y zlib1g-dev=1:1.2.8.dfsg-5 zlib1g=1:1.2.8.dfsg-5 &&\ + apt-get install --force-yes -y build-essential libz-dev curl + +ENV GRAALVM_URL='https://github.com/graalvm/graalvm-ce-builds/releases/download/jdk-21.0.2/graalvm-community-jdk-21.0.2_linux-aarch64_bin.tar.gz' +RUN mkdir /graalvm &&\ + curl -L $GRAALVM_URL > /tmp/graalvm.tgz &&\ + tar --strip 1 -zxvf /tmp/graalvm.tgz -C /graalvm + +ENV JAVA_HOME=/graalvm +ENV PATH="${PATH}:$JAVA_HOME/bin" +RUN uname -a && whoami && $JAVA_HOME/bin/java -version WORKDIR /app/build COPY ./build/artifacts/native-image-source/ /app/build diff --git a/Dockerfile.builder.linux-amd64 b/Dockerfile.builder.linux-amd64 index dee8087b3..9fff0fb05 100644 --- a/Dockerfile.builder.linux-amd64 +++ b/Dockerfile.builder.linux-amd64 @@ -1,4 +1,19 @@ -FROM ghcr.io/graalvm/graalvm-community:21.0.2-ol9-20240116 AS BUILDER +FROM debian:9-slim + +COPY ./src/main/docker/builder/sources.list /etc/apt/sources.list + +RUN apt-get update -y &&\ + apt-get install --force-yes -y zlib1g-dev=1:1.2.8.dfsg-5 zlib1g=1:1.2.8.dfsg-5 &&\ + apt-get install --force-yes -y build-essential libz-dev curl + +ENV GRAALVM_URL='https://github.com/graalvm/graalvm-ce-builds/releases/download/jdk-21.0.2/graalvm-community-jdk-21.0.2_linux-x64_bin.tar.gz' +RUN mkdir /graalvm &&\ + curl -L $GRAALVM_URL > /tmp/graalvm.tgz &&\ + tar --strip 1 -zxvf /tmp/graalvm.tgz -C /graalvm + +ENV JAVA_HOME=/graalvm +ENV PATH="${PATH}:$JAVA_HOME/bin" +RUN uname -a && whoami && $JAVA_HOME/bin/java -version COPY ./ /app WORKDIR /app diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 8e380b05e..1bef7891a 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -1,3 +1,7 @@ +## 3.21.2 +* #285, #494: Fixing amd64 static docker image. +* #435: Make DPS dynamic linked binary compatible with libgc 2.15 again + ## 3.21.1 * #435: Upgrading docker run images due glibc * #285: Linux AMD64 static binary diff --git a/gradle.properties b/gradle.properties index 7ec0293f6..6bb828924 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -version=3.21.1-snapshot +version=3.21.2-snapshot diff --git a/src/main/docker/builder/sources.list b/src/main/docker/builder/sources.list new file mode 100644 index 000000000..fb0c78111 --- /dev/null +++ b/src/main/docker/builder/sources.list @@ -0,0 +1,2 @@ +deb http://archive.debian.org/debian/ stretch main contrib non-free +deb-src http://archive.debian.org/debian/ stretch main contrib non-free diff --git a/src/main/java/com/mageddo/dnsproxyserver/App.java b/src/main/java/com/mageddo/dnsproxyserver/App.java index ec85254a7..054adec50 100644 --- a/src/main/java/com/mageddo/dnsproxyserver/App.java +++ b/src/main/java/com/mageddo/dnsproxyserver/App.java @@ -6,11 +6,16 @@ import com.mageddo.dnsproxyserver.config.dataprovider.ConfigDAOCmdArgs; import com.mageddo.dnsproxyserver.config.dataprovider.vo.ConfigFlag; import com.mageddo.dnsproxyserver.di.Context; +import lombok.SneakyThrows; + +import java.nio.file.Files; +import java.nio.file.Paths; public class App { private final String[] args; private Config config; + private ConfigFlag flags; public App(String[] args) { this.args = args; @@ -22,6 +27,10 @@ public static void main(String[] args) { void start() { + this.flags = ConfigFlag.parse(this.args); + + this.checkHiddenCommands(); + this.checkExitCommands(); this.config = this.findConfig(args); @@ -33,6 +42,12 @@ void start() { // todo install as service } + void checkHiddenCommands() { + if (this.flags.isCreateTmpDir()) { + this.createTmpDirIfNotExists(); + } + } + Config findConfig(String[] args) { ConfigDAOCmdArgs.setArgs(args); return Configs.getInstance(); @@ -51,7 +66,6 @@ void startContext() { } void checkExitCommands() { - final var flags = ConfigFlag.parse(this.args); if (flags.isHelp() || flags.isVersion()) { exitGracefully(); } @@ -60,4 +74,10 @@ void checkExitCommands() { void exitGracefully() { System.exit(0); } + + @SneakyThrows + void createTmpDirIfNotExists() { + final var tmpDir = Paths.get(System.getProperty("java.io.tmpdir")); + Files.createDirectories(tmpDir); + } } diff --git a/src/main/java/com/mageddo/dnsproxyserver/config/dataprovider/vo/ConfigFlag.java b/src/main/java/com/mageddo/dnsproxyserver/config/dataprovider/vo/ConfigFlag.java index 6d4f90a93..03e8ec972 100644 --- a/src/main/java/com/mageddo/dnsproxyserver/config/dataprovider/vo/ConfigFlag.java +++ b/src/main/java/com/mageddo/dnsproxyserver/config/dataprovider/vo/ConfigFlag.java @@ -184,6 +184,13 @@ this way you will probably not have resolution issues by acl (implies dps-networ ) private Boolean dockerSolverHostMachineFallbackActive; + @Option( + hidden = true, + names = {"-create-tmp-dir", "--create-tmp-dir"}, defaultValue = "false", + description = "Create the dir set as tmp in the jvm if it doesn't exists yet." + ) + private boolean createTmpDir; + @JsonIgnore private String[] args; diff --git a/src/main/java/com/mageddo/net/SocketUtils.java b/src/main/java/com/mageddo/net/SocketUtils.java new file mode 100644 index 000000000..8c7606e76 --- /dev/null +++ b/src/main/java/com/mageddo/net/SocketUtils.java @@ -0,0 +1,16 @@ +package com.mageddo.net; + +import lombok.SneakyThrows; + +import java.net.ServerSocket; + +public class SocketUtils { + + @SneakyThrows + public static int findRandomFreePort() { + final var server = new ServerSocket(0); + try (server) { + return server.getLocalPort(); + } + } +} diff --git a/src/test/java/com/mageddo/dnsproxyserver/AppCompTest.java b/src/test/java/com/mageddo/dnsproxyserver/AppCompTest.java index 348e8ab32..c0cca39bd 100644 --- a/src/test/java/com/mageddo/dnsproxyserver/AppCompTest.java +++ b/src/test/java/com/mageddo/dnsproxyserver/AppCompTest.java @@ -51,6 +51,22 @@ void mustExitWhenVersionCmd() { verify(this.app, never()).setupLogs(); } + @Test + void mustCreateTmpDirIfNotExists() { + // arrange + final var args = new String[]{"--create-tmp-dir"}; + this.app = spy(new App(args)); + + // act + this.app.start(); + + // assert + verify(this.app).createTmpDirIfNotExists(); + verify(this.app, never()).exitGracefully(); + + } + + RuntimeException mockExitMethod() { final var expectedException = new RuntimeException("must exit"); doThrow(expectedException) diff --git a/src/test/java/com/mageddo/net/SocketUtilsTest.java b/src/test/java/com/mageddo/net/SocketUtilsTest.java new file mode 100644 index 000000000..ce4aa51d9 --- /dev/null +++ b/src/test/java/com/mageddo/net/SocketUtilsTest.java @@ -0,0 +1,19 @@ +package com.mageddo.net; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class SocketUtilsTest { + + @Test + void mustFindRandomFreePort(){ + // arrange + + // act + final var port = SocketUtils.findRandomFreePort(); + + // assert + assertTrue(port > 0); + } +} diff --git a/src/test/java/testing/ContextSupplier.java b/src/test/java/testing/ContextSupplier.java index 315c76404..b6f8d93af 100644 --- a/src/test/java/testing/ContextSupplier.java +++ b/src/test/java/testing/ContextSupplier.java @@ -1,14 +1,18 @@ package testing; import com.mageddo.dnsproxyserver.config.application.Configs; +import com.mageddo.dnsproxyserver.config.dataprovider.ConfigDAOCmdArgs; import com.mageddo.dnsproxyserver.di.Context; +import com.mageddo.net.SocketUtils; import java.util.function.Supplier; public class ContextSupplier implements Supplier { @Override public Context get() { + final var port = SocketUtils.findRandomFreePort(); Configs.clear(); + ConfigDAOCmdArgs.setArgs(new String[]{"--web-server-port=" + port}); Configs.getInstance(); return Context.create(); } diff --git a/src/test/resources/flags-test/001.json b/src/test/resources/flags-test/001.json index ab3680946..e0cdb2902 100644 --- a/src/test/resources/flags-test/001.json +++ b/src/test/resources/flags-test/001.json @@ -18,5 +18,6 @@ "dpsNetwork" : false, "dpsNetworkAutoConnect" : false, "help" : false, - "resolvConfOverrideNameServers" : true + "resolvConfOverrideNameServers" : true, + "createTmpDir" : false }