Skip to content

Commit

Permalink
Kubernetes: Correct artifact path location
Browse files Browse the repository at this point in the history
Adding dependencies like `quarkus-openshift` and `quarkus-kubernetes-config` might lead into running the kubernetes processor when the JAR file is not correct yet. 

With these changes, we'll get always the correct artifact.
Fix #28108
  • Loading branch information
Sgitario committed Sep 27, 2022
1 parent 5cf63af commit 922948b
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package io.quarkus.kubernetes.deployment;

import static io.quarkus.deployment.pkg.steps.JarResultBuildStep.DEFAULT_FAST_JAR_DIRECTORY_NAME;
import static io.quarkus.deployment.pkg.steps.JarResultBuildStep.QUARKUS_RUN_JAR;
import static io.quarkus.kubernetes.deployment.Constants.KUBERNETES;
import static io.quarkus.kubernetes.spi.KubernetesDeploymentTargetBuildItem.mergeList;

Expand Down Expand Up @@ -42,7 +44,9 @@
import io.quarkus.deployment.builditem.GeneratedFileSystemResourceBuildItem;
import io.quarkus.deployment.builditem.LaunchModeBuildItem;
import io.quarkus.deployment.pkg.PackageConfig;
import io.quarkus.deployment.pkg.builditem.LegacyJarRequiredBuildItem;
import io.quarkus.deployment.pkg.builditem.OutputTargetBuildItem;
import io.quarkus.deployment.pkg.builditem.UberJarRequiredBuildItem;
import io.quarkus.deployment.util.FileUtil;
import io.quarkus.kubernetes.spi.ConfigurationSupplierBuildItem;
import io.quarkus.kubernetes.spi.ConfiguratorBuildItem;
Expand Down Expand Up @@ -93,6 +97,8 @@ public void preventContainerPush(ContainerImageConfig containerImageConfig,
@BuildStep(onlyIfNot = IsTest.class)
public void build(ApplicationInfoBuildItem applicationInfo,
OutputTargetBuildItem outputTarget,
List<UberJarRequiredBuildItem> uberJarRequired,
List<LegacyJarRequiredBuildItem> legacyJarRequired,
PackageConfig packageConfig,
KubernetesConfig kubernetesConfig,
OpenshiftConfig openshiftConfig,
Expand Down Expand Up @@ -125,8 +131,7 @@ public void build(ApplicationInfoBuildItem applicationInfo,
.map(DeploymentTargetEntry::getName)
.collect(Collectors.toSet());

Path artifactPath = outputTarget.getOutputDirectory()
.resolve(String.format(OUTPUT_ARTIFACT_FORMAT, outputTarget.getBaseName(), packageConfig.getRunnerSuffix()));
Path artifactPath = getRunner(outputTarget, packageConfig, uberJarRequired, legacyJarRequired);

try {
// by passing false to SimpleFileWriter, we ensure that no files are actually written during this phase
Expand Down Expand Up @@ -240,4 +245,33 @@ public void build(ApplicationInfoBuildItem applicationInfo,
}

}

/**
* This method is based on the logic in {@link io.quarkus.deployment.pkg.steps.JarResultBuildStep#buildRunnerJar}.
* Note that we cannot consume the {@link io.quarkus.deployment.pkg.builditem.JarBuildItem} because it causes build cycle
* exceptions since we need to support adding generated resources into the JAR file (see
* https://github.com/quarkusio/quarkus/pull/20113).
*/
private Path getRunner(OutputTargetBuildItem outputTarget,
PackageConfig packageConfig,
List<UberJarRequiredBuildItem> uberJarRequired,
List<LegacyJarRequiredBuildItem> legacyJarRequired) {
if (!legacyJarRequired.isEmpty() || packageConfig.type.equalsIgnoreCase(PackageConfig.LEGACY)
|| !uberJarRequired.isEmpty() || packageConfig.type.equalsIgnoreCase(PackageConfig.UBER_JAR)) {
// the jar is a legacy jar or uber jar, the next logic applies:
return outputTarget.getOutputDirectory()
.resolve(outputTarget.getBaseName() + packageConfig.getRunnerSuffix() + ".jar");
}

// otherwise, it's a thin jar:
Path buildDir;

if (packageConfig.outputDirectory.isPresent()) {
buildDir = outputTarget.getOutputDirectory();
} else {
buildDir = outputTarget.getOutputDirectory().resolve(DEFAULT_FAST_JAR_DIRECTORY_NAME);
}

return buildDir.resolve(QUARKUS_RUN_JAR);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package io.quarkus.it.kubernetes;

import static org.assertj.core.api.Assertions.assertThat;

import java.io.IOException;
import java.nio.file.Path;
import java.util.List;

import org.assertj.core.api.AbstractObjectAssert;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.fabric8.kubernetes.api.model.EnvVar;
import io.fabric8.kubernetes.api.model.HasMetadata;
import io.fabric8.kubernetes.api.model.PodSpec;
import io.quarkus.builder.Version;
import io.quarkus.maven.dependency.Dependency;
import io.quarkus.test.ProdBuildResults;
import io.quarkus.test.ProdModeTestResults;
import io.quarkus.test.QuarkusProdModeTest;

public class OpenshiftWithKubernetesConfigTest {

private static final String NAME = "openshift-with-kubernetes-config";

@RegisterExtension
static final QuarkusProdModeTest config = new QuarkusProdModeTest()
.withApplicationRoot((jar) -> jar.addClasses(GreetingResource.class))
.setApplicationName(NAME)
.setApplicationVersion("0.1-SNAPSHOT")
.setForcedDependencies(List.of(Dependency.of("io.quarkus", "quarkus-openshift", Version.getVersion()),
Dependency.of("io.quarkus", "quarkus-kubernetes-config", Version.getVersion())));

@ProdBuildResults
private ProdModeTestResults prodModeTestResults;

@Test
public void assertGeneratedResources() throws IOException {
Path kubernetesDir = prodModeTestResults.getBuildDir().resolve("kubernetes");

assertThat(kubernetesDir)
.isDirectoryContaining(p -> p.getFileName().endsWith("openshift.json"))
.isDirectoryContaining(p -> p.getFileName().endsWith("openshift.yml"));
List<HasMetadata> openshiftList = DeserializationUtil.deserializeAsList(
kubernetesDir.resolve("openshift.yml"));

assertThat(openshiftList).filteredOn(h -> "DeploymentConfig".equals(h.getKind())).singleElement().satisfies(h -> {
assertThat(h.getMetadata()).satisfies(m -> {
assertThat(m.getName()).isEqualTo(NAME);
assertThat(m.getLabels().get("app.openshift.io/runtime")).isEqualTo("quarkus");
});

AbstractObjectAssert<?, ?> specAssert = assertThat(h).extracting("spec");
specAssert.extracting("template").extracting("spec").isInstanceOfSatisfying(PodSpec.class,
podSpec -> {
assertThat(podSpec.getContainers()).singleElement().satisfies(container -> {
List<EnvVar> envVars = container.getEnv();
assertThat(envVars).anySatisfy(envVar -> {
assertThat(envVar.getName()).isEqualTo("JAVA_APP_JAR");
assertThat(envVar.getValue()).isEqualTo("/deployments/quarkus-run.jar");
});
});
});
});
}
}

0 comments on commit 922948b

Please sign in to comment.