130 lines
3.6 KiB
Bash
Executable File
130 lines
3.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -eo pipefail
|
|
|
|
echo "---> Java buildpack"
|
|
|
|
# 1. GET ARGS
|
|
layers_dir="$1"
|
|
env_dir="$2/env"
|
|
plan_path="$3"
|
|
|
|
# 2. LOAD USER-PROVIDED BUILD-TIME ENVIRONMENT VARIABLES
|
|
if compgen -G "${env_dir}/*" > /dev/null; then
|
|
for var in ${env_dir}/*; do
|
|
declare "$(basename ${var})=$(<${var})"
|
|
done
|
|
fi
|
|
|
|
# 3. INSTALL JAVA
|
|
jdk_url="https://cdn.azul.com/zulu/bin/zulu8.40.0.25-ca-jdk8.0.222-linux_x64.tar.gz"
|
|
jdk_version="1.8.0_222"
|
|
|
|
if [[ -r /etc/alpine-release ]]; then
|
|
jdk_url="https://cdn.azul.com/zulu/bin/zulu8.40.0.25-ca-jdk8.0.222-linux_musl_x64.tar.gz"
|
|
jdk_version="1.8.0_222"
|
|
fi
|
|
|
|
maven_url="https://apache.org/dist/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz"
|
|
maven_version="3.5.4"
|
|
|
|
echo "---> Installing JDK"
|
|
|
|
# If it doesn't exist locally, create a JDK cache layer
|
|
# This makes JDK available to subsequent buildpacks as well
|
|
jdk_layer_dir=${layers_dir}/jdk
|
|
if [[ -f ${jdk_layer_dir}.toml ]]; then
|
|
cached_jdk_url=$(cat "${jdk_layer_dir}.toml" | yj -t | jq -r .metadata.url 2>/dev/null || echo 'JDK TOML parsing failed')
|
|
fi
|
|
|
|
if [[ ${jdk_url} != ${cached_jdk_url} ]] ; then
|
|
echo " JDK cache not found, creating new layer"
|
|
rm -rf "$layers_dir"/jdk
|
|
mkdir -p "$layers_dir"/jdk/env
|
|
wget -q -O - "$jdk_url" | tar pxz -C "${jdk_layer_dir}" --strip-components=1
|
|
|
|
cat > "${jdk_layer_dir}.toml" << EOF
|
|
launch = true
|
|
build = true
|
|
cache = true
|
|
|
|
[metadata]
|
|
version = "${jdk_version}"
|
|
url = "${jdk_url}"
|
|
EOF
|
|
|
|
echo "$jdk_layer_dir" > "$jdk_layer_dir"/env/JAVA_HOME
|
|
if [[ -z ${LD_LIBRARY_PATH} ]]; then
|
|
echo "${JAVA_HOME}/jre/lib/amd64/server" > ${jdk_layer_dir}/env/LD_LIBRARY_PATH
|
|
else
|
|
echo "${JAVA_HOME}/jre/lib/amd64/server:${LD_LIBRARY_PATH}" > ${jdk_layer_dir}/env/LD_LIBRARY_PATH
|
|
fi
|
|
|
|
mkdir -p ${jdk_layer_dir}/exec.d
|
|
cat > "${jdk_layer_dir}/exec.d/jdk.sh" << EOF
|
|
echo JAVA_HOME=${jdk_layer_dir} > \$1
|
|
if [[ -z \$LD_LIBRARY_PATH ]]; then
|
|
echo LD_LIBRARY_PATH="\$JAVA_HOME/jre/lib/amd64/server" >> \$1
|
|
else
|
|
echo LD_LIBRARY_PATH="\$JAVA_HOME/jre/lib/amd64/server:${LD_LIBRARY_PATH}" >> \$1
|
|
fi
|
|
EOF
|
|
fi
|
|
export JAVA_HOME=${jdk_layer_dir}
|
|
|
|
# Set env variables to make jdk accessible
|
|
for var in "$layers_dir"/jdk/env/*; do
|
|
declare "$(basename "$var")=$(<"$var")"
|
|
done
|
|
export PATH=${jdk_layer_dir}/bin:$PATH
|
|
|
|
# 4. MAKE MAVEN M2 CACHE LAYER
|
|
m2_layer_dir="${layers_dir}/maven_m2"
|
|
if [[ ! -d ${m2_layer_dir} ]]; then
|
|
mkdir -p ${m2_layer_dir}
|
|
echo "cache = true" > ${m2_layer_dir}.toml
|
|
fi
|
|
ln -s ${m2_layer_dir} $HOME/.m2
|
|
|
|
# 5. RUN BUILD
|
|
MAVEN_OPTS="${MAVEN_OPTS:-"-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap"}"
|
|
|
|
if [[ -x mvnw ]]; then
|
|
echo "---> Running Maven Wrapper"
|
|
./mvnw clean install -B -DskipTests
|
|
else
|
|
maven_layer_dir=${layers_dir}/maven
|
|
if [[ -f ${layers_dir}/maven.toml ]]; then
|
|
cached_maven_url=$(cat "${maven_layer_dir}.toml" | yj -t | jq -r .metadata.url 2>/dev/null || echo 'Maven TOML parsing failed')
|
|
fi
|
|
if [[ ${maven_url} != ${cached_maven_url} ]] ; then
|
|
echo "---> Installing Maven"
|
|
echo " Using JAVA_HOME ${JAVA_HOME}"
|
|
rm -rf "${maven_layer_dir}"
|
|
mkdir -p "${maven_layer_dir}"
|
|
wget -q -O - "${maven_url}" | tar pxz -C "${maven_layer_dir}" --strip-components=1
|
|
cat > "${maven_layer_dir}.toml" << EOF
|
|
launch = true
|
|
build = true
|
|
cache = true
|
|
|
|
[metadata]
|
|
version = "${maven_version}"
|
|
url = "${maven_url}"
|
|
EOF
|
|
fi
|
|
export PATH="${PATH}:${layers_dir}/maven/bin"
|
|
|
|
echo "---> Running Maven"
|
|
mvn clean install -B -DskipTests
|
|
fi
|
|
|
|
# 6. SET DEFAULT START COMMAND
|
|
target_dir="target"
|
|
for jar_file in $(find "$target_dir" -maxdepth 1 -name "*.jar" -type f); do
|
|
cat >> "${layers_dir}/launch.toml" <<EOL
|
|
[[processes]]
|
|
type = "web"
|
|
command = "java -jar ${jar_file}"
|
|
EOL
|
|
break;
|
|
done |