From 8a28f6ebb36a8d44e25333ee4ecb2c8fd3eea99f Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Sat, 9 May 2020 18:26:23 +0900 Subject: [PATCH] Use two JDKs on travis-ci (+8 squashed commits) --- .travis.yml | 24 +--- install-jdk.sh | 320 ++++++++++++++++++++++++++++++++++++++++++ travis-toolchains.xml | 14 ++ 3 files changed, 341 insertions(+), 17 deletions(-) create mode 100755 install-jdk.sh create mode 100644 travis-toolchains.xml diff --git a/.travis.yml b/.travis.yml index 40cd4738..595defa6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,14 +4,6 @@ language: java dist: - trusty -before_script: - - if [[ "x$JDK" == *'x9'* ]]; then export MAVEN_SKIP_RC=true; fi - -script: - - export JDK8_HOME=$(jdk_switcher home oraclejdk8) - - export JDK11_HOME=/usr/lib/jvm/java-11-oracle - - test -d "${JDK11_HOME}" || export JDK11_HOME=$(jdk_switcher home oraclejdk8) - before_cache: # No sense in caching current build artifacts - rm -rf $HOME/.m2/repository/com/zaxxer @@ -20,18 +12,16 @@ cache: directories: - $HOME/.m2/repository -matrix: - fast_finish: true - include: - - jdk: oraclejdk8 - - jdk: oraclejdk11 - env: - - JDK=11 - install: /bin/true +jdk: oraclejdk8 + script: - - mvn package -Dmaven.javadoc.skip=true -V -B + - export JAVA8_HOME=$JAVA_HOME +# - jdk_switcher use openjdk11 + - export JAVA_HOME=$HOME/openjdk11 + - $TRAVIS_BUILD_DIR/install-jdk.sh --feature 11 --target $JAVA_HOME + - mvn package --global-toolchains ./travis-toolchains.xml -Dmaven.javadoc.skip=true -V -B after_success: - bash <(curl -s https://codecov.io/bash) diff --git a/install-jdk.sh b/install-jdk.sh new file mode 100755 index 00000000..e48e04a8 --- /dev/null +++ b/install-jdk.sh @@ -0,0 +1,320 @@ +#!/usr/bin/env bash + +# +# Install JDK for Linux and Mac OS +# +# This script determines the most recent early-access build number, +# downloads the JDK archive to the user home directory and extracts +# it there. +# +# Exported environment variables (when sourcing this script) +# +# JAVA_HOME is set to the extracted JDK directory +# PATH is prepended with ${JAVA_HOME}/bin +# +# (C) 2020 Christian Stein +# +# https://github.com/sormuras/bach/blob/master/install-jdk.sh +# + +set -o errexit +#set -o nounset # https://github.com/travis-ci/travis-ci/issues/5434 +#set -o xtrace + +function initialize() { + readonly script_name="$(basename "${BASH_SOURCE[0]}")" + readonly script_version='2020-03-17' + + dry=false + silent=false + verbose=false + emit_java_home=false + + feature='ea' + license='GPL' # Force GPLv2+CE + os='?' + url='?' + workspace="${HOME}" + target='?' + cacerts=false +} + +function usage() { +cat << EOF +Usage: ${script_name} [OPTION]... +Download and extract latest-and-greatest JDK from https://jdk.java.net + +Version: ${script_version} +Options: + -h|--help Displays this help + -d|--dry-run Activates dry-run mode + -s|--silent Displays no output + -e|--emit-java-home Print value of "JAVA_HOME" to stdout (ignores silent mode) + -v|--verbose Displays verbose output + + -f|--feature 11|12|...|ea JDK feature release number, defaults to "ea" + -o|--os linux-x64|osx-x64 Operating system identifier + -u|--url "https://..." Use custom JDK archive (provided as .tar.gz file) + -w|--workspace PATH Working directory defaults to \${HOME} [${HOME}] + -t|--target PATH Target directory, defaults to first component of the tarball + -c|--cacerts Link system CA certificates (currently only Debian/Ubuntu is supported) +EOF +} + +function script_exit() { + if [[ $# -eq 1 ]]; then + printf '%s\n' "$1" + exit 0 + fi + + if [[ $# -eq 2 && $2 =~ ^[0-9]+$ ]]; then + printf '%b\n' "$1" + exit "$2" + fi + + script_exit 'Invalid arguments passed to script_exit()!' 2 +} + +function say() { + if [[ ${silent} != true ]]; then + echo "$@" + fi +} + +function verbose() { + if [[ ${verbose} == true ]]; then + echo "$@" + fi +} + +function parse_options() { + local option + while [[ $# -gt 0 ]]; do + option="$1" + shift + case ${option} in + -h|-H|--help) + usage + exit 0 + ;; + -v|-V|--verbose) + verbose=true + ;; + -s|-S|--silent) + silent=true + verbose "Silent mode activated" + ;; + -d|-D|--dry-run) + dry=true + verbose "Dry-run mode activated" + ;; + -e|-E|--emit-java-home) + emit_java_home=true + verbose "Emitting JAVA_HOME" + ;; + -f|-F|--feature) + feature="$1" + verbose "feature=${feature}" + shift + ;; + -l|-L|--license) + # license="$1" + say "Ignoring license option: $1 -- using GPLv2+CE by default" + verbose "license=${license}" + shift + ;; + -o|-O|--os) + os="$1" + verbose "os=${os}" + shift + ;; + -u|-U|--url) + url="$1" + verbose "url=${url}" + shift + ;; + -w|-W|--workspace) + workspace="$1" + verbose "workspace=${workspace}" + shift + ;; + -t|-T|--target) + target="$1" + verbose "target=${target}" + shift + ;; + -c|-C|--cacerts) + cacerts=true + verbose "Linking system CA certificates" + ;; + *) + script_exit "Invalid argument was provided: ${option}" 2 + ;; + esac + done +} + +function determine_latest_jdk() { + local number + local curl_result + local url + + number=15 + verbose "Determine latest JDK feature release number, starting with ${number}" + while [[ ${number} != 99 ]] + do + url="https://jdk.java.net/${number}" + curl_result=$(curl -o /dev/null --silent --head --write-out %{http_code} ${url}) + if [[ ${curl_result} -ge 400 ]]; then + break + fi + verbose " Found ${url} [${curl_result}]" + latest_jdk=${number} + number=$[$number +1] + done + + verbose "Latest JDK feature release number is: ${latest_jdk}" +} + +function perform_sanity_checks() { + if [[ ${feature} == '?' ]] || [[ ${feature} == 'ea' ]]; then + feature=${latest_jdk} + fi + if [[ ${feature} -lt 9 ]] || [[ ${feature} -gt ${latest_jdk} ]]; then + script_exit "Expected feature release number in range of 9 to ${latest_jdk}, but got: ${feature}" 3 + fi + if [[ -d "$target" ]]; then + script_exit "Target directory must not exist, but it does: $(du -hs '${target}')" 3 + fi +} + +function determine_url() { + local JAVA_NET="https://jdk.java.net/${feature}" + local DOWNLOAD='https://download.java.net/java' + + # An official GA build or an archived feature? Use predefined URL + case "${feature}" in + 9) url="${DOWNLOAD}/GA/jdk9/9.0.4/binaries/openjdk-9.0.4_${os}_bin.tar.gz"; return;; + 10) url="${DOWNLOAD}/GA/jdk10/10.0.2/19aef61b38124481863b1413dce1855f/13/openjdk-10.0.2_${os}_bin.tar.gz"; return;; + 11) url="${DOWNLOAD}/GA/jdk11/9/GPL/openjdk-11.0.2_${os}_bin.tar.gz"; return;; + 12) url="${DOWNLOAD}/GA/jdk12.0.2/e482c34c86bd4bf8b56c0b35558996b9/10/GPL/openjdk-12.0.2_${os}_bin.tar.gz"; return;; + 13) url="${DOWNLOAD}/GA/jdk13.0.2/d4173c853231432d94f001e99d882ca7/8/GPL/openjdk-13.0.2_${os}_bin.tar.gz"; return;; + 14) url="${DOWNLOAD}/GA/jdk14/076bab302c7b4508975440c56f6cc26a/36/GPL/openjdk-14_${os}_bin.tar.gz"; return;; + # 15) is still available from its EA/RC location determined below + esac + + # EA or RC build? Grab URL from HTML source of jdk.java.net/${feature} + local candidates=$(wget --quiet --output-document - ${JAVA_NET} | grep -Eo 'href[[:space:]]*=[[:space:]]*"[^\"]+"' | grep -Eo '(http|https)://[^"]+') + url=$(echo "${candidates}" | grep -Eo "${DOWNLOAD}/.+/jdk${feature}/.*${license}/.*jdk-${feature}.+${os}_bin(.tar.gz|.zip)$" || true) + + if [[ -z ${url} ]]; then + script_exit "Couldn't determine a download url for ${feature}-${license} on ${os}" 1 + fi +} + +function prepare_variables() { + if [[ ${os} == '?' ]]; then + if [[ "$OSTYPE" == "darwin"* ]]; then + os='osx-x64' + else + os='linux-x64' + fi + fi + if [[ ${url} == '?' ]]; then + determine_latest_jdk + perform_sanity_checks + determine_url + else + feature='' + license='' + os='' + fi + status=$(curl -o /dev/null --silent --head --write-out %{http_code} ${url}) +} + +function print_variables() { +cat << EOF +Variables: + feature = ${feature} + os = ${os} + url = ${url} + status = ${status} +EOF +} + +function download_and_extract_and_set_target() { + local quiet='--quiet'; if [[ ${verbose} == true ]]; then quiet=''; fi + local local="--directory-prefix ${workspace} --output-document=jdk.tar.gz" + local remote='--timestamping --continue' + local wget_options="${quiet} ${local} ${remote}" + local tar_options="--file jdk.tar.gz" + + say "Downloading JDK from ${url}..." + verbose "Using wget options: ${wget_options}" + wget ${wget_options} ${url} + + if [[ ${os} == 'windows-x64' ]]; then + script_exit "Extracting archives on Windows isn't supported, yet" 4 + fi + + verbose "Using tar options: ${tar_options}" + if [[ ${target} == '?' ]]; then + tar --extract ${tar_options} -C "${workspace}" + if [[ "$OSTYPE" != "darwin"* ]]; then + target="${workspace}"/$(tar --list ${tar_options} | grep 'bin/javac' | tr '/' '\n' | tail -3 | head -1) + else + target="${workspace}"/$(tar --list ${tar_options} | head -2 | tail -1 | cut -f 2 -d '/' -)/Contents/Home + fi + verbose "Set target to: ${target}" + else + echo "Using custom target: ${target}" + if [[ "$OSTYPE" != "darwin"* ]]; then + mkdir --parents "${target}" + tar --extract ${tar_options} -C "${target}" --strip-components=1 + else + mkdir -p "${target}" + tar --extract ${tar_options} -C "${target}" --strip-components=4 + fi + fi + + if [[ ${verbose} == true ]]; then + echo "Content of target directory:" + ls "${target}" + echo "Content of release file:" + [[ ! -f "${target}/release" ]] || cat "${target}/release" + fi + + # Link to system certificates + # https://openjdk.java.net/jeps/319 + # https://bugs.openjdk.java.net/browse/JDK-8196141 + if [[ ${cacerts} == true ]]; then + local directory="${target}/lib/security/cacerts" + if [[ -f "${directory}" ]]; then + mv "${directory}" "${directory}.jdk" + ln -s /etc/ssl/certs/java/cacerts "${directory}" + else + verbose "Directory ${directory} doesn't exist, didn't link system CA certificates." + fi + fi +} + +function main() { + initialize + parse_options "$@" + + say "$script_name $script_version" + prepare_variables + + if [[ ${silent} == false ]]; then print_variables; fi + if [[ ${dry} == true ]]; then exit 0; fi + + download_and_extract_and_set_target + + export JAVA_HOME=$(cd "${target}"; pwd) + export PATH=${JAVA_HOME}/bin:$PATH + + if [[ ${silent} == false ]]; then java -Xmx100m -version; fi + if [[ ${emit_java_home} == true ]]; then echo "${JAVA_HOME}"; fi +} + +main "$@" diff --git a/travis-toolchains.xml b/travis-toolchains.xml new file mode 100644 index 00000000..d4d47ed7 --- /dev/null +++ b/travis-toolchains.xml @@ -0,0 +1,14 @@ + + + + paths + + java + + + + /usr/lib/jvm/java-8-oracle/bin + + + +