From 5d4d94789fd603eefa4a26ff5bb88d24a7672856 Mon Sep 17 00:00:00 2001 From: Claudia Rogoz Date: Thu, 12 Dec 2024 10:46:57 +0100 Subject: [PATCH 01/12] include glibc or musl in jdk installation dir --- .../gradle/jdks/GradleJdksConfigurator.java | 6 +++--- .../com/palantir/gradle/jdks/setup/common/Os.java | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/gradle-jdks-excavator-configurations/src/main/java/com/palantir/gradle/jdks/GradleJdksConfigurator.java b/gradle-jdks-excavator-configurations/src/main/java/com/palantir/gradle/jdks/GradleJdksConfigurator.java index bc2ec4bd..cc29bf57 100644 --- a/gradle-jdks-excavator-configurations/src/main/java/com/palantir/gradle/jdks/GradleJdksConfigurator.java +++ b/gradle-jdks-excavator-configurations/src/main/java/com/palantir/gradle/jdks/GradleJdksConfigurator.java @@ -72,7 +72,7 @@ private static void writeJdkInstallationConfiguration( GradleJdksConfigsUtils.writeConfigurationFile( jdkOsArchDir.resolve("download-url"), resolveDownloadUrl(baseUrl, jdkDistributionName, jdkRelease)); GradleJdksConfigsUtils.writeConfigurationFile( - jdkOsArchDir.resolve("local-path"), resolveLocalPath(jdkDistributionName, jdkRelease)); + jdkOsArchDir.resolve("local-path"), resolveLocalPath(os, jdkDistributionName, jdkRelease)); } catch (Exception e) { throw new RuntimeException( String.format("Failed to crate jdk configuration files in dir %s", jdkOsArchDir), e); @@ -93,8 +93,8 @@ private static void writeInstallationScripts(Path targetDir) { GradleJdksConfigsUtils.copyResourceToPath(scriptsDir, "gradle-jdks-setup.jar"); } - private static String resolveLocalPath(JdkDistributionName jdkDistributionName, JdkRelease jdkRelease) { - return String.format("%s-%s", jdkDistributionName, jdkRelease.version()); + private static String resolveLocalPath(Os os, JdkDistributionName jdkDistributionName, JdkRelease jdkRelease) { + return String.format("%s-%s-%s", jdkDistributionName, jdkRelease.version(), Os.glibcOrMuslDistribution(os)); } private static String resolveDownloadUrl( diff --git a/gradle-jdks-setup-common/src/main/java/com/palantir/gradle/jdks/setup/common/Os.java b/gradle-jdks-setup-common/src/main/java/com/palantir/gradle/jdks/setup/common/Os.java index 8b498e5c..b3790c98 100644 --- a/gradle-jdks-setup-common/src/main/java/com/palantir/gradle/jdks/setup/common/Os.java +++ b/gradle-jdks-setup-common/src/main/java/com/palantir/gradle/jdks/setup/common/Os.java @@ -36,6 +36,20 @@ public final String uiName() { return UiNames.uiName(this); } + + public static Optional glibcOrMuslDistribution(Os os) { + switch (os) { + case LINUX_MUSL: + return Optional.of("musl"); + case LINUX_GLIBC: + return Optional.of("glibc"); + case MACOS: + case WINDOWS: + return Optional.empty(); + } + throw new IllegalStateException("Unsupported OS: " + os); + } + public static Optional fromString(String osUiName) { return UiNames.fromString(values(), osUiName); } From f87d635ffcd242096715bd4301dcb15bda87993f Mon Sep 17 00:00:00 2001 From: Claudia Rogoz Date: Thu, 12 Dec 2024 11:25:25 +0100 Subject: [PATCH 02/12] . --- .../gradle/jdks/GradleJdksConfigurator.java | 8 +++++++- .../gradle/jdks/GradleJdksConfiguratorTest.java | 14 +++++++++++++- .../com/palantir/gradle/jdks/setup/common/Os.java | 7 +++---- .../jdks/setup/GradleJdkInstallationSetup.java | 8 ++++++++ 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/gradle-jdks-excavator-configurations/src/main/java/com/palantir/gradle/jdks/GradleJdksConfigurator.java b/gradle-jdks-excavator-configurations/src/main/java/com/palantir/gradle/jdks/GradleJdksConfigurator.java index cc29bf57..481d3677 100644 --- a/gradle-jdks-excavator-configurations/src/main/java/com/palantir/gradle/jdks/GradleJdksConfigurator.java +++ b/gradle-jdks-excavator-configurations/src/main/java/com/palantir/gradle/jdks/GradleJdksConfigurator.java @@ -93,8 +93,14 @@ private static void writeInstallationScripts(Path targetDir) { GradleJdksConfigsUtils.copyResourceToPath(scriptsDir, "gradle-jdks-setup.jar"); } + // TODO(crogoz): Remove glibcOrMusl from the localPath name. This is a workaround for the excavator workflow. + // Excavator caches the location of gradle-jdks directory, however it doesn't take into consideration if the job + // is running on a musl/glibc image. Without this, we might be using the jdk used for a different c implementation. private static String resolveLocalPath(Os os, JdkDistributionName jdkDistributionName, JdkRelease jdkRelease) { - return String.format("%s-%s-%s", jdkDistributionName, jdkRelease.version(), Os.glibcOrMuslDistribution(os)); + return os.glibcOrMuslDistribution() + .map(cDistribution -> + String.format("%s-%s-%s", jdkDistributionName, jdkRelease.version(), cDistribution)) + .orElseGet(() -> String.format("%s-%s", jdkDistributionName, jdkRelease.version())); } private static String resolveDownloadUrl( diff --git a/gradle-jdks-excavator-configurations/src/test/java/com/palantir/gradle/jdks/GradleJdksConfiguratorTest.java b/gradle-jdks-excavator-configurations/src/test/java/com/palantir/gradle/jdks/GradleJdksConfiguratorTest.java index 9aeb10ef..949bac75 100644 --- a/gradle-jdks-excavator-configurations/src/test/java/com/palantir/gradle/jdks/GradleJdksConfiguratorTest.java +++ b/gradle-jdks-excavator-configurations/src/test/java/com/palantir/gradle/jdks/GradleJdksConfiguratorTest.java @@ -76,7 +76,19 @@ void can_install_generated_gradle_jdk_files() throws IOException { .resolve(CurrentOs.get().uiName()) .resolve(CurrentArch.get().uiName()) .resolve("local-path")); - assertThat(localPath).isEqualTo(String.format("amazon-corretto-%s\n", JDK_VERSION)); + + switch (CurrentOs.get()) { + case LINUX_MUSL: + assertThat(localPath).isEqualTo(String.format("amazon-corretto-%s-musl\n", JDK_VERSION)); + break; + case LINUX_GLIBC: + assertThat(localPath).isEqualTo(String.format("amazon-corretto-%s-glibc\n", JDK_VERSION)); + break; + case WINDOWS: + case MACOS: + assertThat(localPath).isEqualTo(String.format("amazon-corretto-%s\n", JDK_VERSION)); + break; + } Path installationScript = latestGradleJdksDir.resolve("scripts").resolve("install-jdks.sh"); ProcessBuilder processBuilder = new ProcessBuilder() .command( diff --git a/gradle-jdks-setup-common/src/main/java/com/palantir/gradle/jdks/setup/common/Os.java b/gradle-jdks-setup-common/src/main/java/com/palantir/gradle/jdks/setup/common/Os.java index b3790c98..e1f15f2c 100644 --- a/gradle-jdks-setup-common/src/main/java/com/palantir/gradle/jdks/setup/common/Os.java +++ b/gradle-jdks-setup-common/src/main/java/com/palantir/gradle/jdks/setup/common/Os.java @@ -36,9 +36,8 @@ public final String uiName() { return UiNames.uiName(this); } - - public static Optional glibcOrMuslDistribution(Os os) { - switch (os) { + public Optional glibcOrMuslDistribution() { + switch (this) { case LINUX_MUSL: return Optional.of("musl"); case LINUX_GLIBC: @@ -47,7 +46,7 @@ public static Optional glibcOrMuslDistribution(Os os) { case WINDOWS: return Optional.empty(); } - throw new IllegalStateException("Unsupported OS: " + os); + throw new IllegalStateException("Unsupported OS: " + this); } public static Optional fromString(String osUiName) { diff --git a/gradle-jdks-setup/src/main/java/com/palantir/gradle/jdks/setup/GradleJdkInstallationSetup.java b/gradle-jdks-setup/src/main/java/com/palantir/gradle/jdks/setup/GradleJdkInstallationSetup.java index 762255f7..e28e1ec0 100644 --- a/gradle-jdks-setup/src/main/java/com/palantir/gradle/jdks/setup/GradleJdkInstallationSetup.java +++ b/gradle-jdks-setup/src/main/java/com/palantir/gradle/jdks/setup/GradleJdkInstallationSetup.java @@ -21,6 +21,7 @@ import java.nio.channels.FileChannel; import java.nio.charset.StandardCharsets; import java.nio.file.AtomicMoveNotSupportedException; +import java.nio.file.DirectoryNotEmptyException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; @@ -147,6 +148,13 @@ private static boolean copy(ILogger logger, Path destinationJdkInstallationDirec StandardCopyOption.ATOMIC_MOVE); } catch (AtomicMoveNotSupportedException ignored) { Files.move(tempCopyDir, destinationJdkInstallationDirectory, StandardCopyOption.REPLACE_EXISTING); + } catch (DirectoryNotEmptyException ignored) { + FileUtils.delete(destinationJdkInstallationDirectory); + Files.move( + tempCopyDir, + destinationJdkInstallationDirectory, + StandardCopyOption.REPLACE_EXISTING, + StandardCopyOption.ATOMIC_MOVE); } finally { FileUtils.delete(tempCopyDir); } From 1cbf1f8ada9d4eb9b4bee8a08ebf0d61faa63571 Mon Sep 17 00:00:00 2001 From: Claudia Rogoz Date: Thu, 12 Dec 2024 11:35:19 +0100 Subject: [PATCH 03/12] test --- ...leJdkInstallationSetupIntegrationTest.java | 31 +++++++++++++------ .../resources/template.Dockerfile | 3 +- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/gradle-jdks-setup/src/integrationTest/java/com/palantir/gradle/jdks/setup/GradleJdkInstallationSetupIntegrationTest.java b/gradle-jdks-setup/src/integrationTest/java/com/palantir/gradle/jdks/setup/GradleJdkInstallationSetupIntegrationTest.java index 0c5aadab..d0243b4e 100644 --- a/gradle-jdks-setup/src/integrationTest/java/com/palantir/gradle/jdks/setup/GradleJdkInstallationSetupIntegrationTest.java +++ b/gradle-jdks-setup/src/integrationTest/java/com/palantir/gradle/jdks/setup/GradleJdkInstallationSetupIntegrationTest.java @@ -53,26 +53,22 @@ public class GradleJdkInstallationSetupIntegrationTest { @Test public void can_setup_jdks_centos() throws IOException, InterruptedException { - setupGradleDirectoryStructure(Os.LINUX_GLIBC); - dockerBuildAndRunTestingScript("centos:7", "/bin/bash", DO_NOT_INSTALL_CURL, false); + dockerBuildAndRunTestingScript(Os.LINUX_GLIBC, "centos:7", "/bin/bash", DO_NOT_INSTALL_CURL, false); } @Test public void can_setup_jdks_ubuntu() throws IOException, InterruptedException { - setupGradleDirectoryStructure(Os.LINUX_GLIBC); - dockerBuildAndRunTestingScript("ubuntu:20.04", "/bin/bash", INSTALL_CURL, false); + dockerBuildAndRunTestingScript(Os.LINUX_GLIBC, "ubuntu:20.04", "/bin/bash", INSTALL_CURL, false); } @Test public void can_reinstall_jdks_ubuntu() throws IOException, InterruptedException { - setupGradleDirectoryStructure(Os.LINUX_GLIBC); - dockerBuildAndRunTestingScript("ubuntu:20.04", "/bin/bash", INSTALL_CURL, true); + dockerBuildAndRunTestingScript(Os.LINUX_GLIBC, "ubuntu:20.04", "/bin/bash", INSTALL_CURL, true); } @Test public void can_setup_jdks_alpine() throws IOException, InterruptedException { - setupGradleDirectoryStructure(Os.LINUX_MUSL); - dockerBuildAndRunTestingScript("alpine:3.16.0", "/bin/sh", DO_NOT_INSTALL_CURL, false); + dockerBuildAndRunTestingScript(Os.LINUX_GLIBC, "alpine:3.16.0", "/bin/sh", DO_NOT_INSTALL_CURL, false); } private Path setupGradleDirectoryStructure(Os os) throws IOException { @@ -158,8 +154,10 @@ private static void writeFileContent(Path path, String content) throws IOExcepti Files.writeString(path, content + "\n"); } - private void dockerBuildAndRunTestingScript(String baseImage, String shell, boolean installCurl, boolean addJdkDir) + private void dockerBuildAndRunTestingScript( + Os os, String baseImage, String shell, boolean installCurl, boolean addJdkDir) throws IOException, InterruptedException { + setupGradleDirectoryStructure(os); Path dockerFile = Path.of("src/integrationTest/resources/template.Dockerfile"); String dockerImage = String.format("jdk-test-%s", baseImage); runCommandWithZeroExitCode(List.of( @@ -179,13 +177,26 @@ private void dockerBuildAndRunTestingScript(String baseImage, String shell, bool dockerFile.toAbsolutePath().toString(), workingDir.toAbsolutePath().toString())); + String cDistribution = getGlibcDistribution(os); assertThat(runCommandWithZeroExitCode( List.of("docker", "run", "--rm", dockerImage, shell, "/testing-script.sh"))) .contains("openjdk version \"11.0.21\"") - .contains("JAVA_HOME is set to: /root/.gradle/gradle-jdks/amazon-corretto-11.0.21.9.1") + .contains(String.format( + "JAVA_HOME is set to: /root/.gradle/gradle-jdks/amazon-corretto-11.0.21.9.1-%s", cDistribution)) .doesNotContain("Unexpected output"); } + private static String getGlibcDistribution(Os os) { + switch (os) { + case LINUX_GLIBC: + return "glibc"; + case LINUX_MUSL: + return "musl"; + default: + throw new RuntimeException("Unexpected os" + os); + } + } + private static String runCommandWithZeroExitCode(List commandArguments) throws InterruptedException, IOException { return runCommandWithZeroExitCode(commandArguments, Map.of()); diff --git a/gradle-jdks-setup/src/integrationTest/resources/template.Dockerfile b/gradle-jdks-setup/src/integrationTest/resources/template.Dockerfile index 69b840bb..fc67aa28 100644 --- a/gradle-jdks-setup/src/integrationTest/resources/template.Dockerfile +++ b/gradle-jdks-setup/src/integrationTest/resources/template.Dockerfile @@ -10,7 +10,8 @@ RUN if [ "$INSTALL_CURL" = "true" ] ; then \ apt-get install -y curl; \ fi RUN if [ "$ADD_JDK_DIR" = "true" ] ; then \ - mkdir -p "/root/.gradle/gradle-jdks/amazon-corretto-11.0.21.9.1"; \ + mkdir -p "/root/.gradle/gradle-jdks/amazon-corretto-11.0.21.9.1/bin"; \ + touch "/root/.gradle/gradle-jdks/amazon-corretto-11.0.21.9.1/bin/java" \ fi COPY . / RUN mkdir -p /logsOutput &&\ From 15d56029f815f99708a4746b1c32e68ec6e099d7 Mon Sep 17 00:00:00 2001 From: Claudia Rogoz Date: Thu, 12 Dec 2024 11:49:44 +0100 Subject: [PATCH 04/12] dockerfi;e --- .../src/integrationTest/resources/template.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle-jdks-setup/src/integrationTest/resources/template.Dockerfile b/gradle-jdks-setup/src/integrationTest/resources/template.Dockerfile index fc67aa28..9d51c525 100644 --- a/gradle-jdks-setup/src/integrationTest/resources/template.Dockerfile +++ b/gradle-jdks-setup/src/integrationTest/resources/template.Dockerfile @@ -11,7 +11,7 @@ RUN if [ "$INSTALL_CURL" = "true" ] ; then \ fi RUN if [ "$ADD_JDK_DIR" = "true" ] ; then \ mkdir -p "/root/.gradle/gradle-jdks/amazon-corretto-11.0.21.9.1/bin"; \ - touch "/root/.gradle/gradle-jdks/amazon-corretto-11.0.21.9.1/bin/java" \ + touch "/root/.gradle/gradle-jdks/amazon-corretto-11.0.21.9.1/bin/java"; \ fi COPY . / RUN mkdir -p /logsOutput &&\ From 2828bd6512e5af256c4189ecd7523b47de90517e Mon Sep 17 00:00:00 2001 From: svc-changelog Date: Thu, 12 Dec 2024 10:56:41 +0000 Subject: [PATCH 05/12] Add generated changelog entries --- changelog/@unreleased/pr-482.v2.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 changelog/@unreleased/pr-482.v2.yml diff --git a/changelog/@unreleased/pr-482.v2.yml b/changelog/@unreleased/pr-482.v2.yml new file mode 100644 index 00000000..01a000af --- /dev/null +++ b/changelog/@unreleased/pr-482.v2.yml @@ -0,0 +1,6 @@ +type: fix +fix: + description: Gradle JDK installation directory contains glibc/musl name for linux + distributions + links: + - https://github.com/palantir/gradle-jdks/pull/482 From c201a07480ec7a2b5728d94c15ed212d76fb4bce Mon Sep 17 00:00:00 2001 From: Claudia Rogoz Date: Thu, 12 Dec 2024 12:10:12 +0100 Subject: [PATCH 06/12] . --- .../src/integrationTest/resources/template.Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/gradle-jdks-setup/src/integrationTest/resources/template.Dockerfile b/gradle-jdks-setup/src/integrationTest/resources/template.Dockerfile index 9d51c525..d892a7a5 100644 --- a/gradle-jdks-setup/src/integrationTest/resources/template.Dockerfile +++ b/gradle-jdks-setup/src/integrationTest/resources/template.Dockerfile @@ -12,6 +12,7 @@ RUN if [ "$INSTALL_CURL" = "true" ] ; then \ RUN if [ "$ADD_JDK_DIR" = "true" ] ; then \ mkdir -p "/root/.gradle/gradle-jdks/amazon-corretto-11.0.21.9.1/bin"; \ touch "/root/.gradle/gradle-jdks/amazon-corretto-11.0.21.9.1/bin/java"; \ + chmod 777 "/root/.gradle/gradle-jdks/amazon-corretto-11.0.21.9.1/bin/java"; \ fi COPY . / RUN mkdir -p /logsOutput &&\ From 752828a9f6e738554d318bc9201f4c0b212d6e00 Mon Sep 17 00:00:00 2001 From: Claudia Rogoz Date: Thu, 12 Dec 2024 12:18:29 +0100 Subject: [PATCH 07/12] . --- ...leJdkInstallationSetupIntegrationTest.java | 31 ++++++------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/gradle-jdks-setup/src/integrationTest/java/com/palantir/gradle/jdks/setup/GradleJdkInstallationSetupIntegrationTest.java b/gradle-jdks-setup/src/integrationTest/java/com/palantir/gradle/jdks/setup/GradleJdkInstallationSetupIntegrationTest.java index d0243b4e..0c5aadab 100644 --- a/gradle-jdks-setup/src/integrationTest/java/com/palantir/gradle/jdks/setup/GradleJdkInstallationSetupIntegrationTest.java +++ b/gradle-jdks-setup/src/integrationTest/java/com/palantir/gradle/jdks/setup/GradleJdkInstallationSetupIntegrationTest.java @@ -53,22 +53,26 @@ public class GradleJdkInstallationSetupIntegrationTest { @Test public void can_setup_jdks_centos() throws IOException, InterruptedException { - dockerBuildAndRunTestingScript(Os.LINUX_GLIBC, "centos:7", "/bin/bash", DO_NOT_INSTALL_CURL, false); + setupGradleDirectoryStructure(Os.LINUX_GLIBC); + dockerBuildAndRunTestingScript("centos:7", "/bin/bash", DO_NOT_INSTALL_CURL, false); } @Test public void can_setup_jdks_ubuntu() throws IOException, InterruptedException { - dockerBuildAndRunTestingScript(Os.LINUX_GLIBC, "ubuntu:20.04", "/bin/bash", INSTALL_CURL, false); + setupGradleDirectoryStructure(Os.LINUX_GLIBC); + dockerBuildAndRunTestingScript("ubuntu:20.04", "/bin/bash", INSTALL_CURL, false); } @Test public void can_reinstall_jdks_ubuntu() throws IOException, InterruptedException { - dockerBuildAndRunTestingScript(Os.LINUX_GLIBC, "ubuntu:20.04", "/bin/bash", INSTALL_CURL, true); + setupGradleDirectoryStructure(Os.LINUX_GLIBC); + dockerBuildAndRunTestingScript("ubuntu:20.04", "/bin/bash", INSTALL_CURL, true); } @Test public void can_setup_jdks_alpine() throws IOException, InterruptedException { - dockerBuildAndRunTestingScript(Os.LINUX_GLIBC, "alpine:3.16.0", "/bin/sh", DO_NOT_INSTALL_CURL, false); + setupGradleDirectoryStructure(Os.LINUX_MUSL); + dockerBuildAndRunTestingScript("alpine:3.16.0", "/bin/sh", DO_NOT_INSTALL_CURL, false); } private Path setupGradleDirectoryStructure(Os os) throws IOException { @@ -154,10 +158,8 @@ private static void writeFileContent(Path path, String content) throws IOExcepti Files.writeString(path, content + "\n"); } - private void dockerBuildAndRunTestingScript( - Os os, String baseImage, String shell, boolean installCurl, boolean addJdkDir) + private void dockerBuildAndRunTestingScript(String baseImage, String shell, boolean installCurl, boolean addJdkDir) throws IOException, InterruptedException { - setupGradleDirectoryStructure(os); Path dockerFile = Path.of("src/integrationTest/resources/template.Dockerfile"); String dockerImage = String.format("jdk-test-%s", baseImage); runCommandWithZeroExitCode(List.of( @@ -177,26 +179,13 @@ private void dockerBuildAndRunTestingScript( dockerFile.toAbsolutePath().toString(), workingDir.toAbsolutePath().toString())); - String cDistribution = getGlibcDistribution(os); assertThat(runCommandWithZeroExitCode( List.of("docker", "run", "--rm", dockerImage, shell, "/testing-script.sh"))) .contains("openjdk version \"11.0.21\"") - .contains(String.format( - "JAVA_HOME is set to: /root/.gradle/gradle-jdks/amazon-corretto-11.0.21.9.1-%s", cDistribution)) + .contains("JAVA_HOME is set to: /root/.gradle/gradle-jdks/amazon-corretto-11.0.21.9.1") .doesNotContain("Unexpected output"); } - private static String getGlibcDistribution(Os os) { - switch (os) { - case LINUX_GLIBC: - return "glibc"; - case LINUX_MUSL: - return "musl"; - default: - throw new RuntimeException("Unexpected os" + os); - } - } - private static String runCommandWithZeroExitCode(List commandArguments) throws InterruptedException, IOException { return runCommandWithZeroExitCode(commandArguments, Map.of()); From f06a4a505b96eaaf202c18322082c2a44d3e991c Mon Sep 17 00:00:00 2001 From: Claudia Rogoz Date: Thu, 12 Dec 2024 12:29:34 +0100 Subject: [PATCH 08/12] separate PR --- .../src/integrationTest/resources/template.Dockerfile | 4 +--- .../integrationTest/resources/testing-script.template.sh | 2 +- .../gradle/jdks/setup/GradleJdkInstallationSetup.java | 8 -------- .../src/main/resources/gradle-jdks-functions.sh | 2 +- 4 files changed, 3 insertions(+), 13 deletions(-) diff --git a/gradle-jdks-setup/src/integrationTest/resources/template.Dockerfile b/gradle-jdks-setup/src/integrationTest/resources/template.Dockerfile index d892a7a5..69b840bb 100644 --- a/gradle-jdks-setup/src/integrationTest/resources/template.Dockerfile +++ b/gradle-jdks-setup/src/integrationTest/resources/template.Dockerfile @@ -10,9 +10,7 @@ RUN if [ "$INSTALL_CURL" = "true" ] ; then \ apt-get install -y curl; \ fi RUN if [ "$ADD_JDK_DIR" = "true" ] ; then \ - mkdir -p "/root/.gradle/gradle-jdks/amazon-corretto-11.0.21.9.1/bin"; \ - touch "/root/.gradle/gradle-jdks/amazon-corretto-11.0.21.9.1/bin/java"; \ - chmod 777 "/root/.gradle/gradle-jdks/amazon-corretto-11.0.21.9.1/bin/java"; \ + mkdir -p "/root/.gradle/gradle-jdks/amazon-corretto-11.0.21.9.1"; \ fi COPY . / RUN mkdir -p /logsOutput &&\ diff --git a/gradle-jdks-setup/src/integrationTest/resources/testing-script.template.sh b/gradle-jdks-setup/src/integrationTest/resources/testing-script.template.sh index 03acdaa3..668cf47c 100755 --- a/gradle-jdks-setup/src/integrationTest/resources/testing-script.template.sh +++ b/gradle-jdks-setup/src/integrationTest/resources/testing-script.template.sh @@ -2,7 +2,7 @@ set -e -/root/.gradle/gradle-jdks/amazon-corretto-11.0.21.9.1/bin/java -version +echo "Running jdk" `/root/.gradle/gradle-jdks/amazon-corretto-11.0.21.9.1/bin/java -version` # Running again the gradle-jdk-setup to check the JAVA_HOME. if [ -s /logsOutput/stdout ]; then diff --git a/gradle-jdks-setup/src/main/java/com/palantir/gradle/jdks/setup/GradleJdkInstallationSetup.java b/gradle-jdks-setup/src/main/java/com/palantir/gradle/jdks/setup/GradleJdkInstallationSetup.java index e28e1ec0..762255f7 100644 --- a/gradle-jdks-setup/src/main/java/com/palantir/gradle/jdks/setup/GradleJdkInstallationSetup.java +++ b/gradle-jdks-setup/src/main/java/com/palantir/gradle/jdks/setup/GradleJdkInstallationSetup.java @@ -21,7 +21,6 @@ import java.nio.channels.FileChannel; import java.nio.charset.StandardCharsets; import java.nio.file.AtomicMoveNotSupportedException; -import java.nio.file.DirectoryNotEmptyException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; @@ -148,13 +147,6 @@ private static boolean copy(ILogger logger, Path destinationJdkInstallationDirec StandardCopyOption.ATOMIC_MOVE); } catch (AtomicMoveNotSupportedException ignored) { Files.move(tempCopyDir, destinationJdkInstallationDirectory, StandardCopyOption.REPLACE_EXISTING); - } catch (DirectoryNotEmptyException ignored) { - FileUtils.delete(destinationJdkInstallationDirectory); - Files.move( - tempCopyDir, - destinationJdkInstallationDirectory, - StandardCopyOption.REPLACE_EXISTING, - StandardCopyOption.ATOMIC_MOVE); } finally { FileUtils.delete(tempCopyDir); } diff --git a/gradle-jdks-setup/src/main/resources/gradle-jdks-functions.sh b/gradle-jdks-setup/src/main/resources/gradle-jdks-functions.sh index 3ed798ee..ef913456 100644 --- a/gradle-jdks-setup/src/main/resources/gradle-jdks-functions.sh +++ b/gradle-jdks-setup/src/main/resources/gradle-jdks-functions.sh @@ -145,7 +145,7 @@ install_and_setup_jdks() { tar -xzf "$distribution_name" ;; *) - curl -C - "$distribution_url" | tar -xzf - + curl -k -C - "$distribution_url" | tar -xzf - ;; esac elif command -v wget > /dev/null 2>&1; then From 8de8eecc5e086527d6f18171509b932fa96bb6d1 Mon Sep 17 00:00:00 2001 From: Claudia Rogoz Date: Thu, 12 Dec 2024 14:42:34 +0100 Subject: [PATCH 09/12] fixes --- build.gradle | 4 +++- .../main/resources/gradle-jdks-functions.sh | 2 +- .../gradle/jdks/GradleJdksConfigs.java | 10 ++++++++++ .../jdks/JdkDistributionConfigurator.java | 5 ++++- gradle/gradle-jdks-setup.jar | Bin 112070 -> 113255 bytes 5 files changed, 18 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 0898eda0..ddd25188 100644 --- a/build.gradle +++ b/build.gradle @@ -2,12 +2,13 @@ buildscript { repositories { mavenCentral() { metadataSources { mavenPom(); ignoreGradleMetadataRedirection() } } gradlePluginPortal() { metadataSources { mavenPom(); ignoreGradleMetadataRedirection() } } + mavenLocal() } dependencies { classpath 'com.palantir.gradle.failure-reports:gradle-failure-reports:1.13.0' classpath 'com.palantir.jakartapackagealignment:jakarta-package-alignment:0.6.0' - classpath 'com.palantir.gradle.jdks:gradle-jdks:0.58.0' + classpath 'com.palantir.gradle.jdks:gradle-jdks:0.58.0-14-gf06a4a5.dirty' classpath 'com.palantir.gradle.jdkslatest:gradle-jdks-latest:0.16.0' classpath 'com.palantir.gradle.plugintesting:gradle-plugin-testing:0.5.0' classpath 'org.unbroken-dome.gradle-plugins:gradle-testsets-plugin:4.1.0' @@ -43,6 +44,7 @@ allprojects { repositories { mavenCentral() { metadataSources { mavenPom(); ignoreGradleMetadataRedirection() } } gradlePluginPortal() { metadataSources { mavenPom(); ignoreGradleMetadataRedirection() } } + mavenLocal() } group 'com.palantir.gradle.jdks' diff --git a/gradle-jdks-setup/src/main/resources/gradle-jdks-functions.sh b/gradle-jdks-setup/src/main/resources/gradle-jdks-functions.sh index ef913456..3ed798ee 100644 --- a/gradle-jdks-setup/src/main/resources/gradle-jdks-functions.sh +++ b/gradle-jdks-setup/src/main/resources/gradle-jdks-functions.sh @@ -145,7 +145,7 @@ install_and_setup_jdks() { tar -xzf "$distribution_name" ;; *) - curl -k -C - "$distribution_url" | tar -xzf - + curl -C - "$distribution_url" | tar -xzf - ;; esac elif command -v wget > /dev/null 2>&1; then diff --git a/gradle-jdks/src/main/java/com/palantir/gradle/jdks/GradleJdksConfigs.java b/gradle-jdks/src/main/java/com/palantir/gradle/jdks/GradleJdksConfigs.java index e2f2808d..2d77fa20 100644 --- a/gradle-jdks/src/main/java/com/palantir/gradle/jdks/GradleJdksConfigs.java +++ b/gradle-jdks/src/main/java/com/palantir/gradle/jdks/GradleJdksConfigs.java @@ -52,6 +52,12 @@ public abstract class GradleJdksConfigs extends DefaultTask { @Input public abstract MapProperty getCaCerts(); + /** + * Semantic version that should be bumped if we need to force the regeneration of the jdk configuration files. + */ + @Input + public abstract Property getSemanticVersion(); + abstract Directory gradleDirectory(); protected abstract void applyGradleJdkFileAction( @@ -65,6 +71,10 @@ protected abstract void applyGradleJdkFileAction( protected abstract void maybePrepareForAction(List targetPaths); + public GradleJdksConfigs() { + getSemanticVersion().convention(1); + } + @TaskAction public final void action() { Path gradleJdksDir = gradleDirectory().dir("jdks").getAsFile().toPath(); diff --git a/gradle-jdks/src/main/java/com/palantir/gradle/jdks/JdkDistributionConfigurator.java b/gradle-jdks/src/main/java/com/palantir/gradle/jdks/JdkDistributionConfigurator.java index 89f5c801..e0541428 100644 --- a/gradle-jdks/src/main/java/com/palantir/gradle/jdks/JdkDistributionConfigurator.java +++ b/gradle-jdks/src/main/java/com/palantir/gradle/jdks/JdkDistributionConfigurator.java @@ -99,7 +99,10 @@ private static Stream getJdkDistributionConfig( .get(), jdkPath.filename(), jdkPath.extension())); - jdkDistribution.getLocalPath().set(String.format("%s-%s", jdkDistributionName, jdkVersion.get())); + String localPathName = os.glibcOrMuslDistribution() + .map(cDistribution -> String.format("%s-%s-%s", jdkDistributionName, jdkVersion.get(), cDistribution)) + .orElseGet(() -> String.format("%s-%s", jdkDistributionName, jdkVersion.get())); + jdkDistribution.getLocalPath().set(localPathName); return Stream.of(jdkDistribution); } diff --git a/gradle/gradle-jdks-setup.jar b/gradle/gradle-jdks-setup.jar index 0cd1840ece6866015f4c1ca20264d44786ea0163..ef84f071e6bfb545b6a65355eee9e3055c0d03d5 100644 GIT binary patch delta 3715 zcmY*bc_5Tq8=v#qg)Ajxi@LUnF({M_i7^OeDTEsv z@HE@N_1ct%#g)Ide5pG!$d4nG%QbNIcZI=AY z$8H;T${q9GGO*;|FGS{F_eSBtWz*+|JH)D#LJrS%rKNqVDZd}Fq|Y-ct{!sd+Y{tqD~4|Nz1Q&!DoD&X0bnlS{>jiJAEelf`W8IOcI zB^1w5kGEM?hnbyht^WGd=X31sVp91hKCg&}YVZCW<|WQHcsQ?D9`WhScx5D}QtX{N zOrZH&JV8##1>1MDk(eGfa(b3eUw*Yb{3X7-j=#27H8COHW_6Hl@=ulyH4#5ud^9kp z+aa&Tq0(TtUw7#@hRH`q1OR{fW>(!@N9_QwhE#xjwMlS58dPSd>T%G4k&fnypK#h7#j8l&dk5jt4B-0$C z7DsTY_g2kI+;8KYSG}Xo`VQr@z1lBeXT`<63Www8$Kh}$IQrxHnG7Bru2%?$(}W&d zff92P@WEOJ;HM=yh3%GbUbVC_gc@U2@37|ss}}l=)ufH^4IdtMkJV`&uJ}F?!P?n+uZ9%a7kO|tJvFTLN7@skp@U0{69XS` zMSWG~+}iSu+-1ZU&D9c(0;eCr8hgX09oiRenOAsSFV_*H^<4CnRIngC8Brl_ixU&M zm?=HIPpNga;ORCc{l?(&fE6pmQU@!f=*=UZ+-a#_h*uBdt?XXq-0HGCXAnO~=8s#c zQf?s7n_TNixsqIO?OY|XBW1PF#!`npLE`a)PR#;_ntKl^jS7)Fp{1>LZw*a{DQ`)M z3GJD4&{Q@_r&-!wI&_%d-YGX)XSdhPXityZg9eS~EdP!dPikhfq^wx5Er28hm8)@9ww zQ>71Nr)E8x$oSHQvhCl>ZEigB`IA#Y6YUp^Gx&1OuBc`mz%3H-JD&;G(asb;pj+wf%RI}lw=X%% zr+e5eS@l%RsCakPN6OkLr-QtXk@;~(&wag%gIvt<&$2x|y^Cq7g9In#xn1?nrydE@ z3Kioud6ehOO$0xv>z^0l$^DTzl`SDB{ys#9?r`+GIcqkdHKc)9Io5k6&HdGs=D_~~ zPD)>(8ZN?hv^0#OC|t@NDtOyB;Rr@vNS+>UdT< zkDgVZaG;NRe9J9UX5?Jw3pYheUk}%YAIY8B{iZIrz80B(lloxUY3yy76wp<+ztEqU zGHR^W_F1*md!tWs$l#0Naizt8eN&xcUU$bS#mN`XRT`$6(>_J zvQbR>!?e<`3*#q8%{Dt1c(-(X+m+}UBEz3gjJRswLFLsAC4Z&mZ$H=Jl6NQsm<25Z_ZCNxxry;V-!j0@Hy z%~aSr{uLC^9T3?{(@LafX~l8bos;M=xkAhIWu)Ki*F$V$ZvIcyrQu^i(&sRLd12FE z;`ViG<9KR1#6sf~;jvTO>!4F3(-fHy8~Y?rA#WYb)D;jDJrHijWi~J#_{2?dVP+$l zxOaRqL1wN09iCJ7&)?SwNXlOyAiNks7RcPU;mxA#RM13sK8>(_+hD{txHxzFN{3ii zQ9-+%{EV%!sL$GmCl!W+V=q0+ZhuLRHw#-@6(Tv(_tPYF=c~Y|bopP8W(&86i2HsV zHGCg3CD>Blt7T$R_uv#Y-p5Iy{w2}jt#-W^sIsUH7}2PS-7O6 zSrXOWL-iN-yVLbjCVucxgRg#i81Kl)p_Z@_BkTCee*W;*j~c4kn z#wyGB$niMsZr`EtO0!9>h{u<+mXc#g55q&ZEh(HkL#R4K0CVob|NaHQ;Rx_N0~jFd zwILk>N!kC*dUX2#{bkWRG~pxzsA6NEh&1S8z#Vbl0__vPR%D(6FDHO4NVhe7j;#VV z&?6Dxprx5Hyw?RD!WRTm3G4=pr z>jUZ601*yAppDc~F`xsjt^r+y8jJxd(i4WQ+E6hWbvhc(G|5$Aj)q9Ul{ZmesmZ9X z1R7j-9qndcGB8FA=@{@rWFoOu6INVDw+)@gwn5<(KtlFMvt8^z$4Q4-6Zv};lQC@V zWaKJ1l7iN+61R*+ASD%OgHhO@3bbH;D$qkjt}W~MplBM3vsufS7oJE%qaMjeu?|+W zI`X{$(?NVXdcd2C|Cafg+wxa(DydFKEBRK!_P{9Og`ZM@B-6F%_uLp|%UW63cLVMJ zwVL0xE%%qTqOj{PGGiD0DhR3fgWeUPVUbZGJ6X+mXA26Az^-dD2OdaX%W8>bQ70?gE z(I1)g0WId`_rg$$g_g0Y|MxO{(VLKkzJ~rGw$;cdG4?fuWm#w#)(A=(a;}k7HcAAI zvg5jDqpv_h72X2utBsFj1pB+RlgVM++bV_0pDjn!r(AS)fcN8Gunv!owv z2Nt=ggOHz)o(uLPvkTaYhyE4rMwL=6M!O= zGeon*#vqg|12S9}NdM3)pj#Q5YPUONl%Z1$cw?(Nlqv@Vu3f$yGusNZP3Ox2k*m<} zH)f_B=yRPzIxk84n5V}-oVs|VVj${_cp)!`D zUx=n#xoDDHQz;2wd=0*LAL*)d{@BlY-sfG@UTY7G^EbWW=bTX&cH1)MRKd%`6Cy~C zXzE9~cDu-LlKh(TxzoEYn~}T5`LbKiifoQ^;^uh4+>I`l&UJS5M*;)M>YU(9ZNvME z#VjUOx`Oj}2M>>Tt!^ECmd^K3Jd>ka)6Kdz5b-f$AmiEf>8W1PXeqr{g1z#5zLRcE z87D&cI?5ZsF)q|z_?=hcb-%GHfru&1ql~Y+qsU_^Ua5VP+DG-8N4#1BN?JOT#Jjpw z+k=JT?AwO+Hs9G*>0kRKrtL{e_Tnp9VQG6NpL?CGG(Az0FxmTwBwX zh3vbZFb1WBK9C0{4!;%BY3=H_&MRN3a!KU95_XT>=9WG!DH%;;Kg-7U1crS3 z{yq1j0^a<7|AJP>I}-4=#I(%#AYll>DLOfE`D`6wcVS2yNLHI=dKBV zcijyQg&MEPV@{tWf^Ih(ZhI)DkybfWW|z7o$St;(=GdI? z;-7eESod_rmpm_qP07R^#V^Bm?80qB$&Rx|%*c+R3|6}Q7SGY5H|Z&Erv0OLE>x%X z>L2<2wU@P2^T=blk@hg33CoVDE#B2etlDH>?e4%Z)~yt&@ry=h`la=Ilc!W`ABDI# zRjT<^^haqNFpx5w%sS+>UP_<-vibyle@{}v{WC73#(J`=10qUZMMj)|MH{4VUmPO! zDD_vJHqi52m71hI#TKcZw>8B}{-&49Q`1#jEtKocIa7+IhSahYquww)c0~sm+z5`AJ#|~eUpuTx zeBfG4Y`S-(Rm;*mfg!0CFP4v+ZdqWFt55&0Ps_CQl%wEuUF_$J$-)br#KRJ`KW6>W zJngl$y?$ZEWbAtvmO}f4;XC`BBWISmFBg$$jhm|JI9@-wbcJjfd!6_@wW~Cq2!#(Sdg!_%e|k zkW8fer=)(Bq&_O}6#aL-d3ZFTx>3P5_qa(j$zKr5BfxPW^qG9fHn$c920D5JPw z3M;}_3SXhH5?QuY96Zk9__R&4Hp$vTgZt;OM%|6#U}+k%APVR_teuz3=UmD;_!Dmk|Tn=C=z5dkTD^$ zn~Ps&AR3v;5P*{zIDYuvS#k}b7Bq`R$hw1Kpvu8PUWbd*{ta>t6f)5&XvoCn6oyf9 zQuFXHz$w51%~?30Q#jX0Gz+aEK1Oh{Qx+0{_bjAObVSV(hA0;rSV$GvSy(9dC+1Z_ z<~-Jv#$v2N2AmXx*z-8bKgYk>Vlzcgk#mbKJWZW~LpE+t8_C5S3h&CrSQq3k;1ZP! zFjj&67cgH@NJ^9%LpQ~b6=SRgCONn_>=KMsAu|VO;K=6U&pBv4kx(~_#mHqh_#rwM zUu0dQNK&~`3<`5_iw@qLo6?HwWZ*+hFwa9q1f!9Q^YU=$1@|!41BX0(gZX&w4XX!a z&r>6y<)TH9l#iQuqyrNcR4{S)L=ii?xFuK=AYEek2^Xgo;KrprqcFLwhX(Ttab{L8 zxHh{_5EzBXkWlUUX3yuoOc*G{&RD&(B2s-&Vy3H=Lv!EqZpbb~+Q2Hp-OwGN)bP0o zm(w)J#oLQ9-u{{_pHhYE#dvYvj?Q8}P`ij@RkcHle#4Hxm&8GMA85~L1J zB}j+3G)Wn|Py;BGAPwe!kO(X;#Rcq{rg&`#E5*Au!UKV9qyhn@NDy9>V!yk1zcce- zSO5uwZ!zxCCN?f>cpi1OgQ(#LoiaRGYiRiRYBoMj6+v^`Z6int+|e`yu#pm!m*FI@ zion{-NGatq9@X=gkPvK;z$xJcpc6q7KOG(C;7lwfe_(}SgoEA8U-%R2UXF*TK>jDz zbQz*?M+ZU`en?Gu@lVPc1tbHf@E(G11(HMFkX?=p;aUY+ON1!?q!m&{k~7-Yl|Oh5 zQ~5z@LabMtB~}xc=oH>g9Mz=SrwD?&NE*5>4B@XU$ea*00-Y+P04L3`ADc?-=cVxsv%>=Y0zyper>YWPur~Wn(_p$1 z_Y~YIW*bqzgL=}TrV5i{duC+stMPY!MKxMQ>|@MfnALa||ML6J*b~`@W{mAMcmayT zXAF8YPIg}nj@?y* Date: Thu, 12 Dec 2024 14:47:17 +0100 Subject: [PATCH 10/12] fix --- build.gradle | 4 +--- .../com/palantir/gradle/jdks/GradleJdksConfigs.java | 10 ---------- 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/build.gradle b/build.gradle index ddd25188..0898eda0 100644 --- a/build.gradle +++ b/build.gradle @@ -2,13 +2,12 @@ buildscript { repositories { mavenCentral() { metadataSources { mavenPom(); ignoreGradleMetadataRedirection() } } gradlePluginPortal() { metadataSources { mavenPom(); ignoreGradleMetadataRedirection() } } - mavenLocal() } dependencies { classpath 'com.palantir.gradle.failure-reports:gradle-failure-reports:1.13.0' classpath 'com.palantir.jakartapackagealignment:jakarta-package-alignment:0.6.0' - classpath 'com.palantir.gradle.jdks:gradle-jdks:0.58.0-14-gf06a4a5.dirty' + classpath 'com.palantir.gradle.jdks:gradle-jdks:0.58.0' classpath 'com.palantir.gradle.jdkslatest:gradle-jdks-latest:0.16.0' classpath 'com.palantir.gradle.plugintesting:gradle-plugin-testing:0.5.0' classpath 'org.unbroken-dome.gradle-plugins:gradle-testsets-plugin:4.1.0' @@ -44,7 +43,6 @@ allprojects { repositories { mavenCentral() { metadataSources { mavenPom(); ignoreGradleMetadataRedirection() } } gradlePluginPortal() { metadataSources { mavenPom(); ignoreGradleMetadataRedirection() } } - mavenLocal() } group 'com.palantir.gradle.jdks' diff --git a/gradle-jdks/src/main/java/com/palantir/gradle/jdks/GradleJdksConfigs.java b/gradle-jdks/src/main/java/com/palantir/gradle/jdks/GradleJdksConfigs.java index 2d77fa20..e2f2808d 100644 --- a/gradle-jdks/src/main/java/com/palantir/gradle/jdks/GradleJdksConfigs.java +++ b/gradle-jdks/src/main/java/com/palantir/gradle/jdks/GradleJdksConfigs.java @@ -52,12 +52,6 @@ public abstract class GradleJdksConfigs extends DefaultTask { @Input public abstract MapProperty getCaCerts(); - /** - * Semantic version that should be bumped if we need to force the regeneration of the jdk configuration files. - */ - @Input - public abstract Property getSemanticVersion(); - abstract Directory gradleDirectory(); protected abstract void applyGradleJdkFileAction( @@ -71,10 +65,6 @@ protected abstract void applyGradleJdkFileAction( protected abstract void maybePrepareForAction(List targetPaths); - public GradleJdksConfigs() { - getSemanticVersion().convention(1); - } - @TaskAction public final void action() { Path gradleJdksDir = gradleDirectory().dir("jdks").getAsFile().toPath(); From 0cb2c10a67b76fbf3044906186677a01eaabc923 Mon Sep 17 00:00:00 2001 From: Claudia Rogoz Date: Thu, 12 Dec 2024 14:47:53 +0100 Subject: [PATCH 11/12] . --- .../src/integrationTest/resources/testing-script.template.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle-jdks-setup/src/integrationTest/resources/testing-script.template.sh b/gradle-jdks-setup/src/integrationTest/resources/testing-script.template.sh index 668cf47c..03acdaa3 100755 --- a/gradle-jdks-setup/src/integrationTest/resources/testing-script.template.sh +++ b/gradle-jdks-setup/src/integrationTest/resources/testing-script.template.sh @@ -2,7 +2,7 @@ set -e -echo "Running jdk" `/root/.gradle/gradle-jdks/amazon-corretto-11.0.21.9.1/bin/java -version` +/root/.gradle/gradle-jdks/amazon-corretto-11.0.21.9.1/bin/java -version # Running again the gradle-jdk-setup to check the JAVA_HOME. if [ -s /logsOutput/stdout ]; then From 3d875aae203e8201ad0a99b32ce57a2047d441c7 Mon Sep 17 00:00:00 2001 From: Claudia Rogoz Date: Thu, 12 Dec 2024 16:06:50 +0100 Subject: [PATCH 12/12] old jar --- gradle/gradle-jdks-setup.jar | Bin 113255 -> 112070 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gradle/gradle-jdks-setup.jar b/gradle/gradle-jdks-setup.jar index ef84f071e6bfb545b6a65355eee9e3055c0d03d5..0cd1840ece6866015f4c1ca20264d44786ea0163 100644 GIT binary patch delta 2616 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