Selaa lähdekoodia

Fix jdk download for linux aarch64 (#68620)

This PR resolves two issues with downloading linux aarch64 distributions:
1. The platform specific download url is fixed in the jdk download plugin
2. The untar transformation is tweaked to handle the special format of
the linux aarch64 distro that differs from osx aarch64 disto

We also updated the downloaded versions of the major azul distros for
osx and linux.
Rene Groeschke 4 vuotta sitten
vanhempi
commit
a4cc2dbdb5

+ 3 - 2
buildSrc/src/integTest/groovy/org/elasticsearch/gradle/JdkDownloadPluginFuncTest.groovy

@@ -83,6 +83,7 @@ class JdkDownloadPluginFuncTest extends AbstractGradleFuncTest {
         "mac"     | "x64"     | VENDOR_OPENJDK      | OPEN_JDK_VERSION    | "Contents/Home/bin/java" | ""
         "mac"     | "x64"     | VENDOR_OPENJDK      | OPENJDK_VERSION_OLD | "Contents/Home/bin/java" | "(old version)"
         "darwin"  | "aarch64" | VENDOR_AZUL         | AZUL_AARCH_VERSION  | "Contents/Home/bin/java" | ""
+        "linux"   | "aarch64" | VENDOR_AZUL         | AZUL_AARCH_VERSION  | "bin/java"               | ""
     }
 
     def "transforms are reused across projects"() {
@@ -204,10 +205,10 @@ class JdkDownloadPluginFuncTest extends AbstractGradleFuncTest {
             final String versionPath = isOld ? "jdk1/99" : "jdk12.0.1/123456789123456789123456789abcde/99";
             final String filename = "openjdk-" + (isOld ? "1" : "12.0.1") + "_" + effectivePlatform + "-x64_bin." + extension(platform);
             return "/java/GA/" + versionPath + "/GPL/" + filename;
-        } else if(vendor.equals(VENDOR_AZUL)) {
+        } else if (vendor.equals(VENDOR_AZUL)) {
             final String module = isMac(platform) ? "macosx" : platform;
             // we only test zulu 15 darwin aarch64 for now
-            return "/zulu/bin/zulu15.28.1013-ca-jdk15.0.1-${module}_aarch64.tar.gz";
+            return "/zulu${module.equals('linux') ? '-embedded' : ''}/bin/zulu15.29.15-ca-jdk15.0.2-${module}_aarch64.tar.gz";
         }
     }
 

BIN
buildSrc/src/integTest/resources/org/elasticsearch/gradle/fake_azuljdk_linux_aarch64.tar.gz


+ 35 - 6
buildSrc/src/main/java/org/elasticsearch/gradle/JdkDownloadPlugin.java

@@ -20,6 +20,9 @@ import org.gradle.api.artifacts.repositories.IvyArtifactRepository;
 import org.gradle.api.artifacts.type.ArtifactTypeDefinition;
 import org.gradle.api.attributes.Attribute;
 import org.gradle.api.internal.artifacts.ArtifactAttributes;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Arrays;
 
 public class JdkDownloadPlugin implements Plugin<Project> {
 
@@ -30,6 +33,7 @@ public class JdkDownloadPlugin implements Plugin<Project> {
     private static final String REPO_NAME_PREFIX = "jdk_repo_";
     private static final String EXTENSION_NAME = "jdks";
     public static final String JDK_TRIMMED_PREFIX = "(jdk-?\\d.*)|(zulu-?\\d.+).jdk";
+    public static final String ZULU_LINUX_AARCH_PATTERN = "zulu.*linux_aarch64";
 
     @Override
     public void apply(Project project) {
@@ -54,7 +58,10 @@ public class JdkDownloadPlugin implements Plugin<Project> {
             transformSpec.getTo()
                 .attribute(ArtifactAttributes.ARTIFACT_FORMAT, ArtifactTypeDefinition.DIRECTORY_TYPE)
                 .attribute(jdkAttribute, true);
-            transformSpec.parameters(parameters -> parameters.setTrimmedPrefixPattern(JDK_TRIMMED_PREFIX));
+            transformSpec.parameters(parameters -> {
+                parameters.setTrimmedPrefixPattern(JDK_TRIMMED_PREFIX);
+                parameters.setKeepStructureFor(Arrays.asList(ZULU_LINUX_AARCH_PATTERN));
+            });
         });
 
         NamedDomainObjectContainer<Jdk> jdksContainer = project.container(Jdk.class, name -> {
@@ -123,17 +130,27 @@ public class JdkDownloadPlugin implements Plugin<Project> {
             }
         } else if (jdk.getVendor().equals(VENDOR_AZUL)) {
             repoUrl = "https://cdn.azul.com";
-
             // The following is an absolute hack until AdoptOpenJdk provides Apple aarch64 builds
+            String zuluPathSuffix = jdk.getPlatform().equals("linux") ? "-embedded" : "";
             switch (jdk.getMajor()) {
                 case "15":
-                    artifactPattern = "zulu/bin/zulu" + jdk.getMajor() + ".28.1013-ca-jdk15.0.1-macosx_[classifier].[ext]";
+                    artifactPattern = "zulu"
+                        + zuluPathSuffix
+                        + "/bin/zulu"
+                        + jdk.getMajor()
+                        + ".29.15-ca-jdk15.0.2-"
+                        + azulPlatform(jdk)
+                        + "_[classifier].[ext]";
                     break;
-
                 case "11":
-                    artifactPattern = "zulu/bin/zulu" + jdk.getMajor() + ".43.1021-ca-jdk11.0.9.1-macosx_[classifier].[ext]";
+                    artifactPattern = "zulu"
+                        + zuluPathSuffix
+                        + "/bin/zulu"
+                        + jdk.getMajor()
+                        + ".45.27-ca-jdk11.0.10-"
+                        + azulPlatform(jdk)
+                        + "_[classifier].[ext]";
                     break;
-
                 default:
                     throw new GradleException("Unknown Azul JDK major version  [" + jdk.getMajor() + "]");
             }
@@ -153,6 +170,18 @@ public class JdkDownloadPlugin implements Plugin<Project> {
         }
     }
 
+    @NotNull
+    private String azulPlatform(Jdk jdk) {
+        switch (jdk.getPlatform()) {
+            case "linux":
+                return "linux";
+            case "darwin":
+                return "macosx";
+            default:
+                throw new GradleException("Unsupported Azul JDK platform requested version  [" + jdk.getPlatform() + "]");
+        }
+    }
+
     @SuppressWarnings("unchecked")
     public static NamedDomainObjectContainer<Jdk> getContainer(Project project) {
         return (NamedDomainObjectContainer<Jdk>) project.getExtensions().getByName(EXTENSION_NAME);

+ 0 - 2
buildSrc/src/main/java/org/elasticsearch/gradle/transform/SymbolicLinkPreservingUntarTransform.java

@@ -29,7 +29,6 @@ public abstract class SymbolicLinkPreservingUntarTransform implements UnpackTran
 
     public void unpack(File tarFile, File targetDir) throws IOException {
         Function<String, Path> pathModifier = pathResolver();
-
         TarArchiveInputStream tar = new TarArchiveInputStream(new GzipCompressorInputStream(new FileInputStream(tarFile)));
         final Path destinationPath = targetDir.toPath();
         TarArchiveEntry entry = tar.getNextTarEntry();
@@ -62,6 +61,5 @@ public abstract class SymbolicLinkPreservingUntarTransform implements UnpackTran
             }
             entry = tar.getNextTarEntry();
         }
-
     }
 }

+ 24 - 2
buildSrc/src/main/java/org/elasticsearch/gradle/transform/UnpackTransform.java

@@ -25,6 +25,7 @@ import java.io.File;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.List;
 import java.util.function.Function;
 
 public interface UnpackTransform extends TransformAction<UnpackTransform.Parameters> {
@@ -35,6 +36,12 @@ public interface UnpackTransform extends TransformAction<UnpackTransform.Paramet
         String getTrimmedPrefixPattern();
 
         void setTrimmedPrefixPattern(String pattern);
+
+        @Input
+        @Optional
+        List<String> getKeepStructureFor();
+
+        void setKeepStructureFor(List<String> pattern);
     }
 
     @PathSensitive(PathSensitivity.NAME_ONLY)
@@ -57,8 +64,10 @@ public interface UnpackTransform extends TransformAction<UnpackTransform.Paramet
     void unpack(File archiveFile, File targetDir) throws IOException;
 
     default Function<String, Path> pathResolver() {
+        List<String> keepPatterns = getParameters().getKeepStructureFor();
+
         String trimmedPrefixPattern = getParameters().getTrimmedPrefixPattern();
-        return trimmedPrefixPattern != null ? (i) -> trimArchiveExtractPath(trimmedPrefixPattern, i) : (i) -> Path.of(i);
+        return trimmedPrefixPattern != null ? (i) -> trimArchiveExtractPath(keepPatterns, trimmedPrefixPattern, i) : (i) -> Path.of(i);
     }
 
     /*
@@ -75,9 +84,22 @@ public interface UnpackTransform extends TransformAction<UnpackTransform.Paramet
      *   ./jdk-12.0.1/Contents
      *
      * so we account for this and search the path components until we find the jdk-12.0.1, and strip the leading components.
+     *
+     * Azul jdk linux arm distribution is packaged differently and missed the in between layer.
+     * For now we just resolve this by having a keep pattern for distributions that root folder name
+     * matches certain pattern giving us a hint on which distro we're dealing with.
      */
-    static Path trimArchiveExtractPath(String ignoredPattern, String relativePath) {
+    static Path trimArchiveExtractPath(List<String> keepPatterns, String ignoredPattern, String relativePath) {
         final Path entryName = Paths.get(relativePath);
+        // Do we want to keep the origin packaging just without the root folder?
+        if (keepPatterns != null && keepPatterns.stream().anyMatch(keepPattern -> entryName.getName(0).toString().matches(keepPattern))) {
+            if (entryName.getNameCount() == 1) {
+                return null;
+            } else {
+                return entryName.subpath(1, entryName.getNameCount());
+            }
+        }
+
         int index = 0;
         for (; index < entryName.getNameCount(); index++) {
             if (entryName.getName(index).toString().matches(ignoredPattern)) {