Ctrl K
ComunidadGuías…

builder/build/cnb/lang_java.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package cnb

import (
	"path"
	"path/filepath"
	"strings"

	"github.com/goodrain/rainbond/builder/build"
	"github.com/goodrain/rainbond/builder/parser/code"
	multi "github.com/goodrain/rainbond/builder/parser/code/multisvc"
	corev1 "k8s.io/api/core/v1"
)

type javaConfig struct{}

func (j *javaConfig) BuildAnnotations(re *build.Request, annotations map[string]string) {
	applyDependencyMirrorAnnotation(annotations)
	setAnnotationValue(annotations, "cnb-bp-jvm-version", firstNonEmptyEnv(re.BuildEnvs, "BP_JVM_VERSION", "BUILD_RUNTIMES", "RUNTIMES"))
	setAnnotationValue(annotations, "cnb-bp-jvm-type", firstNonEmptyEnv(re.BuildEnvs, "BP_JVM_TYPE"))

	goals := firstNonEmptyEnv(re.BuildEnvs, "BP_MAVEN_BUILD_ARGUMENTS", "BUILD_MAVEN_CUSTOM_GOALS")
	opts := firstNonEmptyEnv(re.BuildEnvs, "BP_MAVEN_ADDITIONAL_BUILD_ARGUMENTS", "BUILD_MAVEN_CUSTOM_OPTS")
	setAnnotationValue(annotations, "cnb-bp-maven-build-arguments", goals)
	setAnnotationValue(annotations, "cnb-bp-maven-additional-build-arguments", opts)
	setAnnotationValue(annotations, "cnb-bp-maven-version", firstNonEmptyEnv(re.BuildEnvs, "BP_MAVEN_VERSION", "BUILD_RUNTIMES_MAVEN"))
	builtModule, builtArtifact := resolveMavenBuiltTarget(re)
	setAnnotationValue(annotations, "cnb-bp-maven-built-module", builtModule)
	setAnnotationValue(annotations, "cnb-bp-maven-built-artifact", builtArtifact)
	if re.Lang == code.JavaMaven || re.Lang == code.JaveWar {
		setAnnotationValue(annotations, "cnb-maven-opts", resolveJavaMavenOpts(re))
	}

	if re.Lang == code.Gradle {
		setAnnotationValue(annotations, "cnb-bp-gradle-build-arguments", firstNonEmptyEnv(re.BuildEnvs, "BP_GRADLE_BUILD_ARGUMENTS", "BUILD_GRADLE_BUILD_ARGUMENTS"))
		setAnnotationValue(annotations, "cnb-bp-gradle-additional-build-arguments", firstNonEmptyEnv(re.BuildEnvs, "BP_GRADLE_ADDITIONAL_BUILD_ARGUMENTS", "BUILD_GRADLE_ADDITIONAL_BUILD_ARGUMENTS"))
		setAnnotationValue(annotations, "cnb-bp-gradle-built-module", firstNonEmptyEnv(re.BuildEnvs, "BP_GRADLE_BUILT_MODULE", "BUILD_GRADLE_BUILT_MODULE"))
		setAnnotationValue(annotations, "cnb-bp-gradle-built-artifact", firstNonEmptyEnv(re.BuildEnvs, "BP_GRADLE_BUILT_ARTIFACT", "BUILD_GRADLE_BUILT_ARTIFACT"))
		setAnnotationValue(annotations, "cnb-gradle-opts", resolveJavaGradleOpts(re))
	}

	server := firstNonEmptyEnv(re.BuildEnvs, "BP_JAVA_APP_SERVER", "BUILD_RUNTIMES_SERVER")
	if server == "" && re.Lang == code.JaveWar {
		server = "tomcat"
	}
	setAnnotationValue(annotations, "cnb-bp-java-app-server", server)
}

func (j *javaConfig) BuildEnvVars(re *build.Request) []corev1.EnvVar {
	var envs []corev1.EnvVar
	builtModule, builtArtifact := resolveMavenBuiltTarget(re)
	envs = appendEnvVar(envs, "BP_MAVEN_BUILD_ARGUMENTS", firstNonEmptyEnv(re.BuildEnvs, "BP_MAVEN_BUILD_ARGUMENTS", "BUILD_MAVEN_CUSTOM_GOALS"))
	envs = appendEnvVar(envs, "BP_MAVEN_ADDITIONAL_BUILD_ARGUMENTS", firstNonEmptyEnv(re.BuildEnvs, "BP_MAVEN_ADDITIONAL_BUILD_ARGUMENTS", "BUILD_MAVEN_CUSTOM_OPTS"))
	envs = appendEnvVar(envs, "BP_MAVEN_BUILT_MODULE", builtModule)
	envs = appendEnvVar(envs, "BP_MAVEN_BUILT_ARTIFACT", builtArtifact)
	if re.Lang == code.JavaMaven || re.Lang == code.JaveWar {
		envs = appendEnvVar(envs, "MAVEN_OPTS", resolveJavaMavenOpts(re))
	}
	if re.Lang == code.Gradle {
		envs = appendEnvVar(envs, "GRADLE_OPTS", resolveJavaGradleOpts(re))
	}
	return envs
}

func (j *javaConfig) InjectMirrorConfig(re *build.Request) error {
	return ensureProcfile(re)
}

func (j *javaConfig) CustomOrder(re *build.Request) []orderBuildpack {
	return nil
}

func resolveMavenBuiltTarget(re *build.Request) (string, string) {
	explicitModule := firstNonEmptyEnv(re.BuildEnvs, "BP_MAVEN_BUILT_MODULE", "BUILD_MAVEN_BUILT_MODULE")
	explicitArtifact := firstNonEmptyEnv(re.BuildEnvs, "BP_MAVEN_BUILT_ARTIFACT", "BUILD_MAVEN_BUILT_ARTIFACT")
	if explicitModule == "" && explicitArtifact != "" {
		explicitModule = deriveMavenBuiltModule(explicitArtifact)
	}
	if explicitModule != "" || explicitArtifact != "" {
		return explicitModule, explicitArtifact
	}
	if re.Lang != code.JavaMaven {
		return "", ""
	}
	if !fileExists(filepath.Join(re.SourceDir, "pom.xml")) {
		return "", ""
	}

	services, err := multi.NewMaven().ListModules(re.SourceDir)
	if err != nil || len(services) != 1 {
		return "", ""
	}
	moduleName := strings.TrimSpace(services[0].Name)
	if moduleName == "" || filepath.IsAbs(moduleName) {
		return "", ""
	}

	builtArtifact := ""
	if services[0].Envs != nil && services[0].Envs["BUILD_MAVEN_BUILT_ARTIFACT"] != nil {
		builtArtifact = services[0].Envs["BUILD_MAVEN_BUILT_ARTIFACT"].Value
	}
	return moduleName, strings.TrimSpace(builtArtifact)
}

func deriveMavenBuiltModule(artifact string) string {
	artifact = strings.TrimSpace(strings.ReplaceAll(artifact, "\\", "/"))
	if artifact == "" {
		return ""
	}
	artifact = path.Clean(artifact)
	if artifact == "." || artifact == "/" {
		return ""
	}
	parts := strings.Split(artifact, "/")
	for idx, part := range parts {
		if part != "target" || idx == 0 {
			continue
		}
		module := path.Clean(strings.Join(parts[:idx], "/"))
		if module == "." || module == "/" {
			return ""
		}
		return module
	}
	return ""
}

func resolveJavaMavenOpts(re *build.Request) string {
	return appendJavaUTF8Options(firstNonEmptyEnv(re.BuildEnvs, "MAVEN_OPTS", "BUILD_MAVEN_JAVA_OPTS"))
}

func resolveJavaGradleOpts(re *build.Request) string {
	return appendJavaUTF8Options(firstNonEmptyEnv(re.BuildEnvs, "GRADLE_OPTS", "BUILD_GRADLE_JAVA_OPTS"))
}