Skip to content

Commit 5130e42

Browse files
committed
feat prepare_jdks.sh: smart prepare_jdks::switch_to_jdk
1 parent b9645b1 commit 5130e42

File tree

2 files changed

+165
-113
lines changed

2 files changed

+165
-113
lines changed

lib/prepare_jdks.sh

Lines changed: 155 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,17 @@ source "$__source_guard_E2AA8C4F_215B_4CDA_9816_429C7A2CD465/common_utils.sh"
1616
################################################################################
1717
# api functions:
1818
#
19+
# - prepare_jdks::switch_to_jdk
20+
#
1921
# - prepare_jdks::prepare_jdks
20-
# - prepare_jdks::switch_java_home_to_jdk
2122
#
2223
# - prepare_jdks::install_jdk_by_sdkman
2324
# - prepare_jdks::load_sdkman
2425
# - prepare_jdks::install_sdkman
2526
################################################################################
2627

28+
# install sdkman.
29+
#
2730
# shellcheck disable=SC2120
2831
prepare_jdks::install_sdkman() {
2932
(($# == 0)) || cu::die "${FUNCNAME[0]} requires no arguments! But provided $#: $*"
@@ -47,7 +50,9 @@ prepare_jdks::install_sdkman() {
4750
}
4851

4952
# load sdkman.
53+
#
5054
# install sdkman if not installed yet.
55+
#
5156
# shellcheck disable=SC2120
5257
prepare_jdks::load_sdkman() {
5358
(($# == 0)) || cu::die "${FUNCNAME[0]} requires no arguments! But provided $#: $*"
@@ -61,12 +66,13 @@ prepare_jdks::load_sdkman() {
6166
fi
6267
}
6368

64-
prepare_jdks::_sdkman_ls_java_content() {
65-
[ -n "${_PREPARE_JDKS_SDKMAN_LS_JAVA_CONTENT:-}" ] && echo "$_PREPARE_JDKS_SDKMAN_LS_JAVA_CONTENT"
69+
prepare_jdks::_get_sdkman_ls_java_content() {
70+
[ -n "${_PREPARE_JDKS_SDKMAN_LS_JAVA_CONTENT:-}" ] && {
71+
echo "$_PREPARE_JDKS_SDKMAN_LS_JAVA_CONTENT"
72+
return
73+
}
6674

67-
_PREPARE_JDKS_SDKMAN_LS_JAVA_CONTENT=$(
68-
cu::loose_run sdk ls java | sed -n '/^ Vendor/,/^===========/p'
69-
)
75+
_PREPARE_JDKS_SDKMAN_LS_JAVA_CONTENT="$(cu::loose_run sdk ls java | sed -n '/^ Vendor/,/^===========/p')"
7076
echo "$_PREPARE_JDKS_SDKMAN_LS_JAVA_CONTENT"
7177
}
7278

@@ -77,49 +83,82 @@ prepare_jdks::ls_java() {
7783
prepare_jdks::load_sdkman
7884

7985
cu::blue_echo "sdk ls java:"
80-
prepare_jdks::_sdkman_ls_java_content
86+
prepare_jdks::_get_sdkman_ls_java_content
8187
}
8288

83-
prepare_jdks::_set_available_jdk_versions_of_sdkman() {
84-
prepare_jdks::load_sdkman
89+
# shellcheck disable=SC2120
90+
prepare_jdks::get_available_java_versions_of_sdkman() {
91+
(($# == 0)) || cu::die "${FUNCNAME[0]} requires no arguments! But provided $#: $*"
8592

86-
# Prefer mapfile or read -a to split command output (or quote to avoid splitting).
87-
# https://github.com/koalaman/shellcheck/wiki/SC2207
88-
#
89-
# outputs multiple lines, each of which should be an element
90-
PREPARE_JDKS_AVAILABLE_JDK_VERSIONS_OF_SDKMAN=()
91-
local line
92-
while IFS='' read -r line; do
93-
PREPARE_JDKS_AVAILABLE_JDK_VERSIONS_OF_SDKMAN+=("$line")
94-
done < <(
95-
prepare_jdks::_sdkman_ls_java_content |
96-
awk -F'[ \\t]*\\|[ \\t]*' '/\|/ {print $NF}' |
97-
sort -V
98-
)
93+
[ -n "${_PREPARE_JDKS_AVAILABLE_JAVA_VERSIONS_OF_SDKMAN:-}" ] && {
94+
echo "$_PREPARE_JDKS_AVAILABLE_JAVA_VERSIONS_OF_SDKMAN"
95+
return
96+
}
9997

100-
PREPARE_JDKS_AVAILABLE_REMOTE_JDK_VERSIONS_OF_SDKMAN=()
101-
while IFS='' read -r line; do
102-
PREPARE_JDKS_AVAILABLE_REMOTE_JDK_VERSIONS_OF_SDKMAN+=("$line")
103-
done < <(
104-
prepare_jdks::_sdkman_ls_java_content |
105-
awk -F'[ \\t]*\\|[ \\t]*' '/\|/ && $5 !~ /^local/ {print $NF}' |
106-
sort -V
107-
)
98+
prepare_jdks::load_sdkman >&2
99+
100+
_PREPARE_JDKS_AVAILABLE_JAVA_VERSIONS_OF_SDKMAN="$(
101+
prepare_jdks::_get_sdkman_ls_java_content |
102+
awk -F'[ \\t]*\\|[ \\t]*' 'NR > 2 && /\|/ {print $NF}' |
103+
sort -Vr
104+
)"
105+
106+
echo "$_PREPARE_JDKS_AVAILABLE_JAVA_VERSIONS_OF_SDKMAN"
107+
}
108+
109+
# shellcheck disable=SC2120
110+
prepare_jdks::get_available_local_java_versions_of_sdkman() {
111+
(($# == 0)) || cu::die "${FUNCNAME[0]} requires no arguments! But provided $#: $*"
112+
113+
[ -n "${_PREPARE_JDKS_AVAILABLE_LOCAL_JAVA_VERSIONS_OF_SDKMAN:-}" ] && {
114+
echo "$_PREPARE_JDKS_AVAILABLE_LOCAL_JAVA_VERSIONS_OF_SDKMAN"
115+
return
116+
}
117+
118+
prepare_jdks::load_sdkman >&2
119+
120+
_PREPARE_JDKS_AVAILABLE_LOCAL_JAVA_VERSIONS_OF_SDKMAN="$(
121+
printf '%s\n' "$SDKMAN_CANDIDATES_DIR/java"/*/ |
122+
awk -F/ '$(NF-1) !~ /^current$/ {print $(NF-1)}' |
123+
sort -Vr
124+
)"
125+
126+
echo "$_PREPARE_JDKS_AVAILABLE_LOCAL_JAVA_VERSIONS_OF_SDKMAN"
127+
}
128+
129+
# shellcheck disable=SC2120
130+
prepare_jdks::get_available_remote_java_versions_of_sdkman() {
131+
(($# == 0)) || cu::die "${FUNCNAME[0]} requires no arguments! But provided $#: $*"
132+
133+
[ -n "${_PREPARE_JDKS_AVAILABLE_REMOTE_JAVA_VERSIONS_OF_SDKMAN:-}" ] && {
134+
echo "$_PREPARE_JDKS_AVAILABLE_REMOTE_JAVA_VERSIONS_OF_SDKMAN"
135+
return
136+
}
137+
138+
prepare_jdks::load_sdkman >&2
139+
140+
_PREPARE_JDKS_AVAILABLE_REMOTE_JAVA_VERSIONS_OF_SDKMAN="$(
141+
prepare_jdks::_get_sdkman_ls_java_content |
142+
awk -F'[ \\t]*\\|[ \\t]*' 'NR > 2 && /\|/ && $5 !~ /^local / {print $NF}' |
143+
sort -Vr
144+
)"
145+
146+
echo "$_PREPARE_JDKS_AVAILABLE_REMOTE_JAVA_VERSIONS_OF_SDKMAN"
108147
}
109148

110149
prepare_jdks::_get_jdk_path_from_jdk_name_of_sdkman() {
111150
local jdk_name_of_sdkman="$1"
112-
echo "$SDKMAN_CANDIDATES_DIR/java/$jdk_name_of_sdkman"
151+
local jdk_home_path="$SDKMAN_CANDIDATES_DIR/java/$jdk_name_of_sdkman"
152+
echo "$jdk_home_path"
113153
}
114154

115-
# install the jdk by sdkman if not installed yet.
155+
# install the jdk by sdkman.
116156
prepare_jdks::install_jdk_by_sdkman() {
117157
(($# == 1)) || cu::die "${FUNCNAME[0]} requires exact 1 argument! But provided $#: $*"
118158

119159
prepare_jdks::load_sdkman
120160

121-
local jdk_name_of_sdkman="$1"
122-
local jdk_home_path
161+
local jdk_name_of_sdkman="$1" jdk_home_path
123162
jdk_home_path="$(
124163
prepare_jdks::_get_jdk_path_from_jdk_name_of_sdkman "$jdk_name_of_sdkman"
125164
)"
@@ -131,98 +170,110 @@ prepare_jdks::install_jdk_by_sdkman() {
131170
fi
132171
}
133172

134-
prepare_jdks::_prepare_one_jdk() {
135-
local jdk_name_of_sdkman="$1"
136-
local jdk_major_version="${jdk_name_of_sdkman//.*/}"
137-
138-
# java_home_var_name like JDK7_HOME, JDK11_HOME
139-
local java_home_var_name="JDK${jdk_major_version}_HOME"
140-
141-
if [ -z "${!java_home_var_name:-}" ]; then
142-
# 1. prepare jdk home global var
143-
#
144-
# Dynamic variable names in Bash
145-
# https://stackoverflow.com/a/55331060/922688
146-
#
147-
# read value of dynamic variable by:
148-
# "${!var_which_value_is_var_name}"
149-
# assign value to of dynamic variable by:
150-
# printf -v "$var_which_value_is_var_name" %s value
151-
local jdk_home_path
152-
jdk_home_path="$(prepare_jdks::_get_jdk_path_from_jdk_name_of_sdkman "$jdk_name_of_sdkman")"
153-
154-
printf -v "$java_home_var_name" %s "${jdk_home_path}"
155-
156-
# 2. install jdk by sdkman
157-
prepare_jdks::install_jdk_by_sdkman "$jdk_name_of_sdkman"
158-
else
159-
cu::yellow_echo "$java_home_var_name is already prepared: ${!java_home_var_name}"
160-
cu::yellow_echo " so skip install $jdk_name_of_sdkman by sdkman"
173+
# shellcheck disable=SC2120
174+
prepare_jdks::_get_latest_java_version() {
175+
(($# == 1)) || cu::die "${FUNCNAME[0]} requires exact 1 argument! But provided $#: $*"
176+
177+
local version_pattern="$1" input result
178+
input=$(cat)
179+
180+
# 1. first find non-ea and non-fx versions
181+
result="$(echo "$input" | grep -vE '\.ea\.|\.fx-' | cu::get_latest_version "$version_pattern")"
182+
if [ -n "$result" ]; then
183+
echo "$result"
184+
return 0
161185
fi
162186

163-
JDK_HOME_VAR_NAMES+=("$java_home_var_name")
187+
# 2. then find versions
188+
echo "$input" | cu::get_latest_version "$version_pattern"
164189
}
165190

166-
# prepare jdks:
167-
#
168-
# usage:
169-
# prepare_jdks::prepare_jdks <jdk_name_of_sdkman>...
170-
#
171-
# example:
172-
# prepare_jdks::prepare_jdks 11.0.14-ms
173-
# prepare_jdks::prepare_jdks 11.0.14-ms 17.0.2-zulu
174-
#
175-
# do the below works:
176-
# 1. prepare jdk home global var, like
177-
# JDK7_HOME=/path/to/jdk7/home
178-
# JDK11_HOME=/path/to/jdk11/home
179-
# 2. prepare jdk home global array var `JDK_HOME_VAR_NAMES`, like
180-
# JDK_HOME_VAR_NAMES=($JDK7_HOME $JDK11_HOME)
181-
# 3. install jdk by sdkman
182-
prepare_jdks::prepare_jdks() {
183-
(($# > 0)) || cu::die "${FUNCNAME[0]} requires arguments! But no provided"
184-
185-
JDK_HOME_VAR_NAMES=()
191+
prepare_jdks::_validate_java_home() {
192+
local -r switch_target="$1"
186193

187-
local jdk_name_of_sdkman
188-
for jdk_name_of_sdkman in "$@"; do
189-
prepare_jdks::_prepare_one_jdk "$jdk_name_of_sdkman"
190-
done
194+
[ -e "$JAVA_HOME" ] || cu::die "jdk $switch_target NOT existed: $JAVA_HOME"
195+
[ -d "$JAVA_HOME" ] || cu::die "jdk $switch_target is NOT directory: $JAVA_HOME"
191196

192-
cu::blue_echo "prepared jdks:"
193-
local java_home_var_name
194-
for java_home_var_name in "${JDK_HOME_VAR_NAMES[@]}"; do
195-
cu::blue_echo "$java_home_var_name: ${!java_home_var_name}"
196-
done
197+
local java_cmd="$JAVA_HOME/bin/java"
198+
[ -f "$java_cmd" ] || cu::die "\$JAVA_HOME/bin/java ($java_cmd) of $switch_target is NOT found!"
199+
[ -x "$java_cmd" ] || cu::die "\$JAVA_HOME/bin/java ($java_cmd) of $switch_target is NOT executable!"
197200
}
198201

199202
# usage:
200-
# prepare_jdks::switch_java_home_to_jdk 11
201-
# prepare_jdks::switch_java_home_to_jdk /path/to/java_home
202-
prepare_jdks::switch_java_home_to_jdk() {
203+
# prepare_jdks::switch_to_jdk 11
204+
# prepare_jdks::switch_to_jdk /path/to/java_home
205+
prepare_jdks::switch_to_jdk() {
203206
[ $# == 1 ] || cu::die "${FUNCNAME[0]} requires exact 1 argument! But provided $#: $*"
204207

205208
local -r switch_target="$1"
206209
[ -n "$switch_target" ] || cu::die "jdk $switch_target is blank"
207210

211+
# 1. first check env var JDK11_HOME
212+
#
213+
# set by java version, e.g.
214+
# prepare_jdks::switch_to_jdk 11
208215
if cu::is_number_string "$switch_target"; then
209-
# set by java version, e.g.
210-
# prepare_jdks::switch_java_home_to_jdk 11
211216
local java_home_var_name="JDK${switch_target}_HOME"
212-
export JAVA_HOME="${!java_home_var_name:-}"
217+
if [ -d "${!java_home_var_name:-}" ]; then
218+
export JAVA_HOME="${!java_home_var_name:-}"
219+
cu::yellow_echo "${FUNCNAME[0]} $*: use \$$java_home_var_name($JAVA_HOME)"
220+
221+
prepare_jdks::_validate_java_home "$switch_target"
222+
return
223+
fi
224+
fi
213225

214-
[ -n "$JAVA_HOME" ] || cu::die "JAVA_HOME of java version $switch_target($java_home_var_name) is unset or blank: $JAVA_HOME"
215-
else
226+
# 2. set by path of java installation
227+
if [ -d "$switch_target" ]; then
216228
# set by java home path
217229
export JAVA_HOME="$switch_target"
230+
cu::yellow_echo "${FUNCNAME[0]} $*: use switch target $JAVA_HOME as java home directory"
231+
232+
prepare_jdks::_validate_java_home "$switch_target"
233+
return
218234
fi
219235

220-
[ -e "$JAVA_HOME" ] || cu::die "jdk $switch_target NOT existed: $JAVA_HOME"
221-
[ -d "$JAVA_HOME" ] || cu::die "jdk $switch_target is NOT directory: $JAVA_HOME"
236+
# 3. set by java version pattern of sdkman
237+
local -r version_pattern="$switch_target"
238+
local version
239+
# 3.1 check *local* java versions of sdkman
240+
version=$(
241+
prepare_jdks::get_available_local_java_versions_of_sdkman |
242+
prepare_jdks::_get_latest_java_version "$version_pattern"
243+
)
244+
# 3.2 check *remote* java versions of sdkman
245+
if [ -z "${version}" ]; then
246+
version=$(
247+
prepare_jdks::get_available_remote_java_versions_of_sdkman |
248+
prepare_jdks::_get_latest_java_version "$version_pattern"
249+
)
250+
fi
222251

223-
local java_cmd="$JAVA_HOME/bin/java"
224-
[ -f "$java_cmd" ] || cu::die "\$JAVA_HOME/bin/java ($java_cmd) is NOT found!"
225-
[ -x "$java_cmd" ] || cu::die "\$JAVA_HOME/bin/java ($java_cmd) is NOT executable!"
252+
[ -n "$version" ] || cu::die "fail to switch $switch_target"
253+
254+
prepare_jdks::install_jdk_by_sdkman "$version"
255+
JAVA_HOME="$(prepare_jdks::_get_jdk_path_from_jdk_name_of_sdkman "$version")"
256+
export JAVA_HOME
257+
prepare_jdks::_validate_java_home "$switch_target"
258+
}
259+
260+
# prepare jdks:
261+
#
262+
# usage:
263+
# prepare_jdks::prepare_jdks <switch_target>...
264+
#
265+
# example:
266+
# prepare_jdks::prepare_jdks 8 11 17
267+
# prepare_jdks::prepare_jdks 11.0.14-ms 17.0.2-zulu
268+
prepare_jdks::prepare_jdks() {
269+
(($# > 0)) || cu::die "${FUNCNAME[0]} requires arguments! But no provided"
270+
271+
cu::blue_echo "prepare jdks(${*}) by switch_to_jdk"
272+
local switch_target
273+
for switch_target; do
274+
prepare_jdks::switch_to_jdk "$switch_target"
275+
done
276+
echo
226277
}
227278

228279
################################################################################

templates/integration_test_template.sh

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@ source FIXME/lib/common_utils.sh
99
# prepare
1010
################################################################################
1111

12+
readonly default_build_jdk_version=11
13+
1214
# shellcheck disable=SC2034
13-
PREPARE_JDKS_INSTALL_BY_SDKMAN=(
14-
8.322.06.1-amzn
15-
11.0.14-ms
16-
17.0.2.8.1-amzn
15+
readonly PREPARE_JDKS_INSTALL_BY_SDKMAN=(
16+
8
17+
"$default_build_jdk_version"
18+
17
1719
)
1820

1921
source FIXME/lib/prepare_jdks.sh
@@ -30,21 +32,20 @@ cd "$PROJECT_ROOT_DIR"
3032
########################################
3133
# default jdk 11, do build and test
3234
########################################
33-
default_build_jdk_version=11
3435

35-
prepare_jdks::switch_java_home_to_jdk "$default_build_jdk_version"
36+
prepare_jdks::switch_to_jdk "$default_build_jdk_version"
3637

3738
cu::head_line_echo "build and test with Java: $JAVA_HOME"
3839
jvb::mvn_cmd clean install
3940

4041
########################################
4142
# test multi-version java
4243
########################################
43-
for jhome_var_name in "${JDK_HOME_VAR_NAMES[@]}"; do
44+
for jdk in "${PREPARE_JDKS_INSTALL_BY_SDKMAN[@]}"; do
4445
# already tested by above `mvn install`
45-
[ "JDK${default_build_jdk_version}_HOME" = "$jhome_var_name" ] && continue
46+
[ "$default_build_jdk_version" = "$jdk" ] && continue
4647

47-
prepare_jdks::switch_java_home_to_jdk "${!jhome_var_name}"
48+
prepare_jdks::switch_to_jdk "$jdk"
4849

4950
cu::head_line_echo "test with Java: $JAVA_HOME"
5051
# just test without build

0 commit comments

Comments
 (0)