From f469d53cffeb95aea759730b1f79cebacc1a14f0 Mon Sep 17 00:00:00 2001 From: Andriy Redko Date: Tue, 26 Oct 2021 08:47:59 -0400 Subject: [PATCH] [BUG] SymbolicLinkPreservingUntarTransform fails on Windows (#1433) Signed-off-by: Andriy Redko --- ...nternalDistributionArchiveSetupPlugin.java | 36 ++++++++++++++++--- distribution/docker/build.gradle | 6 ++-- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/buildSrc/src/main/java/org/opensearch/gradle/internal/InternalDistributionArchiveSetupPlugin.java b/buildSrc/src/main/java/org/opensearch/gradle/internal/InternalDistributionArchiveSetupPlugin.java index 6153d5f6fe4..e0acdd11a6f 100644 --- a/buildSrc/src/main/java/org/opensearch/gradle/internal/InternalDistributionArchiveSetupPlugin.java +++ b/buildSrc/src/main/java/org/opensearch/gradle/internal/InternalDistributionArchiveSetupPlugin.java @@ -34,18 +34,22 @@ package org.opensearch.gradle.internal; import org.opensearch.gradle.EmptyDirTask; import org.opensearch.gradle.tar.SymbolicLinkPreservingTar; +import org.gradle.api.Action; import org.gradle.api.NamedDomainObjectContainer; import org.gradle.api.Plugin; import org.gradle.api.Project; +import org.gradle.api.Task; import org.gradle.api.artifacts.type.ArtifactTypeDefinition; import org.gradle.api.plugins.BasePlugin; +import org.gradle.api.logging.Logger; +import org.gradle.api.logging.Logging; import org.gradle.api.tasks.AbstractCopyTask; import org.gradle.api.tasks.Sync; import org.gradle.api.tasks.TaskContainer; import org.gradle.api.tasks.bundling.AbstractArchiveTask; import org.gradle.api.tasks.bundling.Compression; import org.gradle.api.tasks.bundling.Zip; - +import org.gradle.internal.os.OperatingSystem; import java.io.File; import static org.opensearch.gradle.util.Util.capitalize; @@ -66,6 +70,7 @@ import static org.gradle.api.internal.artifacts.ArtifactAttributes.ARTIFACT_FORM * 4. Having per-distribution sub-projects means we can build them in parallel. */ public class InternalDistributionArchiveSetupPlugin implements Plugin { + private static final Logger LOGGER = Logging.getLogger(InternalDistributionArchiveSetupPlugin.class); public static final String DEFAULT_CONFIGURATION_NAME = "default"; public static final String EXTRACTED_CONFIGURATION_NAME = "extracted"; @@ -80,16 +85,39 @@ public class InternalDistributionArchiveSetupPlugin implements Plugin { configureTarDefaults(project); } + private Action configure(String name) { + return (Task task) -> task.onlyIf(s -> { + if (OperatingSystem.current().isWindows()) { + // On Windows, include only Windows distributions and integTestZip + final String nameLowerCased = name.toLowerCase(); + final boolean skip = !(nameLowerCased.contains("windows") || nameLowerCased.contains("integtest")); + + if (skip) { + LOGGER.info("Skipping task " + name + " since it does not match current OS platform"); + } + + return !skip; + } else { + return true; + } + }); + } + private void registerAndConfigureDistributionArchivesExtension(Project project) { container = project.container(DistributionArchive.class, name -> { var subProjectDir = archiveToSubprojectName(name); var copyDistributionTaskName = "build" + capitalize(name.substring(0, name.length() - 3)); TaskContainer tasks = project.getTasks(); var explodedDist = tasks.register(copyDistributionTaskName, Sync.class, sync -> sync.into(subProjectDir + "/build/install/")); + explodedDist.configure(configure(name)); var archiveTaskName = "build" + capitalize(name); - return name.endsWith("Tar") - ? new DistributionArchive(tasks.register(archiveTaskName, SymbolicLinkPreservingTar.class), explodedDist, name) - : new DistributionArchive(tasks.register(archiveTaskName, Zip.class), explodedDist, name); + + var archiveTask = name.endsWith("Tar") + ? tasks.register(archiveTaskName, SymbolicLinkPreservingTar.class) + : tasks.register(archiveTaskName, Zip.class); + archiveTask.configure(configure(name)); + + return new DistributionArchive(archiveTask, explodedDist, name); }); // Each defined distribution archive is linked to a subproject. // A distribution archive definition not matching a sub project will result in build failure. diff --git a/distribution/docker/build.gradle b/distribution/docker/build.gradle index 72d44a17b4e..58840e9e594 100644 --- a/distribution/docker/build.gradle +++ b/distribution/docker/build.gradle @@ -16,6 +16,8 @@ import org.opensearch.gradle.VersionProperties import org.opensearch.gradle.docker.DockerBuildTask import org.opensearch.gradle.info.BuildParams import org.opensearch.gradle.testfixtures.TestFixturesPlugin +import org.gradle.internal.os.OperatingSystem + apply plugin: 'opensearch.standalone-rest-test' apply plugin: 'opensearch.test.fixtures' apply plugin: 'opensearch.internal-distribution-download' @@ -183,7 +185,7 @@ void addBuildDockerImage(Architecture architecture, DockerBase base) { final TaskProvider buildDockerImageTask = tasks.register(taskName("build", architecture, base, "DockerImage"), DockerBuildTask) { - onlyIf { Architecture.current() == architecture } + onlyIf { Architecture.current() == architecture && !OperatingSystem.current().isWindows() } TaskProvider copyContextTask = tasks.named(taskName("copy", architecture, base, "DockerContext")) dependsOn(copyContextTask) dockerContext.fileProvider(copyContextTask.map { it.destinationDir }) @@ -246,7 +248,7 @@ subprojects { Project subProject -> "opensearch:test" dependsOn(parent.path + ":" + buildTaskName) - onlyIf { Architecture.current() == architecture } + onlyIf { Architecture.current() == architecture && !OperatingSystem.current().isWindows()} } artifacts.add('default', file(tarFile)) {