Skip to content

Commit 4e98e8f

Browse files
Merge branch 'main' into samruddhikhandale/php-multiple-install
2 parents de63fd6 + 27e6320 commit 4e98e8f

7 files changed

Lines changed: 118 additions & 37 deletions

File tree

src/dotnet/devcontainer-feature.json

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,5 @@
3636
},
3737
"extensions": [
3838
"ms-dotnettools.csharp"
39-
],
40-
"install": {
41-
"app": "",
42-
"file": "install.sh"
43-
}
44-
}
39+
]
40+
}

src/dotnet/install.sh

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ DOTNET_CDN_FEED_URI="https://dotnetcli.azureedge.net"
2626
# Ubuntu 22.04 and on do not ship with libssl1.1, which is required for versions of .NET < 6.0
2727
DOTNET_VERSION_CODENAMES_REQUIRE_OLDER_LIBSSL_1="buster bullseye bionic focal hirsute"
2828

29+
# Comma-separated list of dotnet versions to be installed
30+
# alongside DOTNET_VERSION, but not set as default.
31+
ADDITIONAL_VERSIONS=${ADDITIONAL_VERSIONS:-""}
32+
2933
# Exit on failure.
3034
set -e
3135

@@ -235,6 +239,7 @@ install_using_apt() {
235239
# DOTNET_DOWNLOAD_NAME
236240
get_full_version_details() {
237241
local sdk_or_runtime="$1"
242+
local VERSION="$2"
238243
local architecture
239244
local dotnet_channel_version
240245
local dotnet_releases_url
@@ -249,12 +254,12 @@ get_full_version_details() {
249254
# Set architecture variable to current user's architecture (x64 or ARM64).
250255
architecture="$(get_architecture_name_for_target_os)"
251256

252-
# Set DOTNET_VERSION to empty string to ensure jq includes all .NET versions in reverse sort below
253-
if [ "${DOTNET_VERSION}" = "latest" ]; then
254-
DOTNET_VERSION=""
257+
# Set VERSION to empty string to ensure jq includes all .NET versions in reverse sort below
258+
if [ "${VERSION}" = "latest" ]; then
259+
VERSION=""
255260
fi
256261

257-
dotnet_patchless_version="$(echo "${DOTNET_VERSION}" | cut -d "." --field=1,2)"
262+
dotnet_patchless_version="$(echo "${VERSION}" | cut -d "." --field=1,2)"
258263

259264
set +e
260265
dotnet_channel_version="$(curl -s "${DOTNET_CDN_FEED_URI}/dotnet/release-metadata/releases-index.json" | jq -r --arg channel_version "${dotnet_patchless_version}" '[."releases-index"[]] | sort_by(."channel-version") | reverse | map( select(."channel-version" | startswith($channel_version))) | first | ."channel-version"')"
@@ -274,29 +279,30 @@ get_full_version_details() {
274279
if [ -n "${dotnet_releases_json}" ] && [[ ! "${dotnet_releases_json}" = *"Error"* ]]; then
275280
dotnet_latest_version="$(echo "${dotnet_releases_json}" | jq -r --arg sdk_or_runtime "${sdk_or_runtime}" '."latest-\($sdk_or_runtime)"')"
276281
# If user-specified version has 2 or more dots, use it as is. Otherwise use latest version.
277-
if [ "$(echo "${DOTNET_VERSION}" | grep -o "\." | wc -l)" -lt "2" ]; then
278-
DOTNET_VERSION="${dotnet_latest_version}"
282+
if [ "$(echo "${VERSION}" | grep -o "\." | wc -l)" -lt "2" ]; then
283+
VERSION="${dotnet_latest_version}"
279284
fi
280285

281-
dotnet_download_details="$(echo "${dotnet_releases_json}" | jq -r --arg sdk_or_runtime "${sdk_or_runtime}" --arg dotnet_version "${DOTNET_VERSION}" --arg arch "${architecture}" '.releases[]."\($sdk_or_runtime)" | select(.version==$dotnet_version) | .files[] | select(.name=="dotnet-\($sdk_or_runtime)-linux-\($arch).tar.gz")')"
286+
dotnet_download_details="$(echo "${dotnet_releases_json}" | jq -r --arg sdk_or_runtime "${sdk_or_runtime}" --arg dotnet_version "${VERSION}" --arg arch "${architecture}" '.releases[]."\($sdk_or_runtime)" | select(.version==$dotnet_version) | .files[] | select(.name=="dotnet-\($sdk_or_runtime)-linux-\($arch).tar.gz")')"
282287
if [ -n "${dotnet_download_details}" ]; then
283-
echo "Found .NET binary version ${DOTNET_VERSION}"
288+
echo "Found .NET binary version ${VERSION}"
284289
DOTNET_DOWNLOAD_URL="$(echo "${dotnet_download_details}" | jq -r '.url')"
285290
DOTNET_DOWNLOAD_HASH="$(echo "${dotnet_download_details}" | jq -r '.hash')"
286291
DOTNET_DOWNLOAD_NAME="$(echo "${dotnet_download_details}" | jq -r '.name')"
287292
else
288-
err "Unable to find .NET binary for version ${DOTNET_VERSION}"
293+
err "Unable to find .NET binary for version ${VERSION}"
289294
exit 1
290295
fi
291296
else
292-
err "Unable to find .NET release details for version ${DOTNET_VERSION} at ${dotnet_releases_url}"
297+
err "Unable to find .NET release details for version ${VERSION} at ${dotnet_releases_url}"
293298
exit 1
294299
fi
295300
}
296301

297302
# Install .NET CLI using the .NET releases url
298303
install_using_dotnet_releases_url() {
299304
local sdk_or_runtime="$1"
305+
local VERSION="$2"
300306

301307
# Check listed package dependecies and install them if they are not already installed.
302308
# NOTE: icu-devtools is a small package with similar dependecies to .NET.
@@ -313,11 +319,11 @@ install_using_dotnet_releases_url() {
313319
check_packages libssl3.0
314320
fi
315321

316-
get_full_version_details "${sdk_or_runtime}"
322+
get_full_version_details "${sdk_or_runtime}" "${VERSION}"
317323

318-
DOTNET_INSTALL_PATH="${TARGET_DOTNET_ROOT}/${DOTNET_VERSION}"
324+
DOTNET_INSTALL_PATH="${TARGET_DOTNET_ROOT}/${VERSION}"
319325
if [ -d "${DOTNET_INSTALL_PATH}" ]; then
320-
echo "(!) Dotnet version ${DOTNET_VERSION} already exists."
326+
echo "(!) Dotnet version ${VERSION} already exists."
321327
exit 1
322328
fi
323329
# exports DOTNET_DOWNLOAD_URL, DOTNET_DOWNLOAD_HASH, DOTNET_DOWNLOAD_NAME
@@ -402,6 +408,7 @@ echo "(*) Installing .NET CLI..."
402408
. /etc/os-release
403409
architecture="$(dpkg --print-architecture)"
404410

411+
CHANGE_OWNERSHIP="false"
405412
if [[ "${DOTNET_ARCHIVE_ARCHITECTURES}" = *"${architecture}"* ]] && [[ "${DOTNET_ARCHIVE_VERSION_CODENAMES}" = *"${VERSION_CODENAME}"* ]] && [[ "${INSTALL_USING_APT}" = "true" ]]; then
406413
echo "Detected ${VERSION_CODENAME} on ${architecture}. Attempting to install dotnet from apt"
407414
install_using_apt "${DOTNET_SDK_OR_RUNTIME}"
@@ -411,17 +418,31 @@ else
411418
else
412419
echo "Could not install dotnet from apt. Attempting to install dotnet from releases url"
413420
fi
421+
install_using_dotnet_releases_url "${DOTNET_SDK_OR_RUNTIME}" "${DOTNET_VERSION}"
422+
CHANGE_OWNERSHIP="true"
423+
fi
414424

425+
# Additional dotnet versions to be installed but not be set as default.
426+
if [ ! -z "${ADDITIONAL_VERSIONS}" ]; then
427+
OLDIFS=$IFS
428+
IFS=","
429+
read -a additional_versions <<< "$ADDITIONAL_VERSIONS"
430+
for version in "${additional_versions[@]}"; do
431+
OVERRIDE_DEFAULT_VERSION="false"
432+
install_using_dotnet_releases_url "${DOTNET_SDK_OR_RUNTIME}" "${version}"
433+
done
434+
IFS=$OLDIFS
435+
fi
436+
437+
if [ "${CHANGE_OWNERSHIP}" = "true" ]; then
415438
if ! cat /etc/group | grep -e "^dotnet:" > /dev/null 2>&1; then
416439
groupadd -r dotnet
417440
fi
418441
usermod -a -G dotnet "${USERNAME}"
419442

420-
install_using_dotnet_releases_url "${DOTNET_SDK_OR_RUNTIME}"
421-
422443
chown -R "${USERNAME}:dotnet" "${TARGET_DOTNET_ROOT}"
423444
chmod -R g+r+w "${TARGET_DOTNET_ROOT}"
424445
find "${TARGET_DOTNET_ROOT}" -type d | xargs -n 1 chmod g+s
425446
fi
426447

427-
echo "Done!"
448+
echo "Done!"

src/java/devcontainer-feature.json

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,5 @@
2727
},
2828
"settings": {
2929
"java.import.gradle.java.home": "/usr/local/sdkman/candidates/java/current"
30-
},
31-
"install": {
32-
"app": "",
33-
"file": "install.sh"
3430
}
35-
}
31+
}

src/java/install.sh

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ export SDKMAN_DIR=${SDKMAN_DIR:-"/usr/local/sdkman"}
1515
USERNAME=${USERNAME:-"automatic"}
1616
UPDATE_RC=${UPDATE_RC:-"true"}
1717

18+
# Comma-separated list of java versions to be installed
19+
# alongside JAVA_VERSION, but not set as default.
20+
ADDITIONAL_VERSIONS=${ADDITIONAL_VERSIONS:-""}
21+
1822
set -e
1923

2024
if [ "$(id -u)" -ne 0 ]; then
@@ -75,13 +79,23 @@ check_packages() {
7579
fi
7680
}
7781

82+
# Use Microsoft JDK for everything but JDK 8
83+
jdk_distro="ms"
84+
get_jdk_distro() {
85+
VERSION="$1"
86+
if echo "${VERSION}" | grep -E '^8([\s\.]|$)' > /dev/null 2>&1; then
87+
jdk_distro="tem"
88+
fi
89+
}
90+
7891
# Use SDKMAN to install something using a partial version match
7992
sdk_install() {
8093
local install_type=$1
8194
local requested_version=$2
8295
local prefix=$3
8396
local suffix="${4:-"\\s*"}"
8497
local full_version_check=${5:-".*-[a-z]+"}
98+
local set_as_default=${6:-"true"}
8599
if [ "${requested_version}" = "none" ]; then return; fi
86100
# Blank will install latest stable version SDKMAN has
87101
if [ "${requested_version}" = "lts" ] || [ "${requested_version}" = "default" ]; then
@@ -90,7 +104,7 @@ sdk_install() {
90104
echo "${requested_version}"
91105
else
92106
local regex="${prefix}\\K[0-9]+\\.[0-9]+\\.[0-9]+${suffix}"
93-
local version_list="$(. ${SDKMAN_DIR}/bin/sdkman-init.sh && sdk list ${install_type} 2>&1 | grep -oP "${regex}" | tr -d ' ' | sort -rV)"
107+
local version_list=$(su ${USERNAME} -c ". \${SDKMAN_DIR}/bin/sdkman-init.sh && sdk list ${install_type} 2>&1 | grep -oP \"${regex}\" | tr -d ' ' | sort -rV")
94108
if [ "${requested_version}" = "latest" ] || [ "${requested_version}" = "current" ]; then
95109
requested_version="$(echo "${version_list}" | head -n 1)"
96110
else
@@ -103,6 +117,10 @@ sdk_install() {
103117
exit 1
104118
fi
105119
fi
120+
if [ "${set_as_default}" = "true" ]; then
121+
JAVA_VERSION=${requested_version}
122+
fi
123+
106124
su ${USERNAME} -c "umask 0002 && . ${SDKMAN_DIR}/bin/sdkman-init.sh && sdk install ${install_type} ${requested_version} && sdk flush archives && sdk flush temp"
107125
}
108126

@@ -133,14 +151,20 @@ if [ ! -d "${SDKMAN_DIR}" ]; then
133151
updaterc "export SDKMAN_DIR=${SDKMAN_DIR}\n. \${SDKMAN_DIR}/bin/sdkman-init.sh"
134152
fi
135153

136-
# Use Microsoft JDK for everything but JDK 8
137-
jdk_distro="ms"
138-
if echo "${JAVA_VERSION}" | grep -E '^8([\s\.]|$)' > /dev/null 2>&1; then
139-
jdk_distro="tem"
140-
fi
141-
if [ "${JAVA_VERSION}" = "lts" ]; then
142-
JAVA_VERSION="17"
154+
get_jdk_distro ${JAVA_VERSION}
155+
sdk_install java ${JAVA_VERSION} "\\s*" "(\\.[a-z0-9]+)*-${jdk_distro}\\s*" ".*-[a-z]+$" "true"
156+
157+
# Additional java versions to be installed but not be set as default.
158+
if [ ! -z "${ADDITIONAL_VERSIONS}" ]; then
159+
OLDIFS=$IFS
160+
IFS=","
161+
read -a additional_versions <<< "$ADDITIONAL_VERSIONS"
162+
for version in "${additional_versions[@]}"; do
163+
get_jdk_distro ${version}
164+
sdk_install java ${version} "\\s*" "(\\.[a-z0-9]+)*-${jdk_distro}\\s*" ".*-[a-z]+$" "false"
165+
done
166+
IFS=$OLDIFS
167+
su ${USERNAME} -c ". ${SDKMAN_DIR}/bin/sdkman-init.sh && sdk default java ${JAVA_VERSION}"
143168
fi
144-
sdk_install java ${JAVA_VERSION} "\\s*" "(\\.[a-z0-9]+)*-${jdk_distro}\\s*" ".*-[a-z]+$"
145169

146-
echo "Done!"
170+
echo "Done!"
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#!/bin/bash
2+
3+
set -e
4+
5+
# Optional: Import test library
6+
source dev-container-features-test-lib
7+
8+
check "dotnet version 6.0.301 installed as default" dotnet --version | grep 6.0.301
9+
check "dotnet version 5.0 installed" ls -l /usr/local/dotnet | grep 5.0
10+
check "dotnet version 3.1.420 installed" ls -l /usr/local/dotnet | grep 3.1.420
11+
12+
# Report result
13+
reportResults
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#!/bin/bash
2+
3+
set -e
4+
5+
# Optional: Import test library
6+
source dev-container-features-test-lib
7+
8+
check "java version 17 installed as default" java --version | grep 17
9+
check "java version 11 installed" ls /usr/local/sdkman/candidates/java | grep 11
10+
check "java version 8 installed" ls /usr/local/sdkman/candidates/java | grep 8
11+
12+
# Report result
13+
reportResults

test-scenarios/scenarios.json

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,15 @@
55
"php": {
66
"version": "8.1.4",
77
"additional_versions": "8.0.17,8.0.3"
8+
}
9+
}
10+
},
11+
"install_additional_java": {
12+
"image": "ubuntu:focal",
13+
"features": {
14+
"java": {
15+
"version": "17",
16+
"additional_versions": "11,8"
817
}
918
}
1019
},
@@ -47,5 +56,14 @@
4756
"additional_versions": "2.5,3.0.4"
4857
}
4958
}
59+
},
60+
"install_additional_dotnet": {
61+
"image": "ubuntu:focal",
62+
"features": {
63+
"dotnet": {
64+
"version": "6.0.301",
65+
"additional_versions": "5.0,3.1.420"
66+
}
67+
}
5068
}
5169
}

0 commit comments

Comments
 (0)