You've already forked setup-dotnet
							
							
				mirror of
				https://github.com/actions/setup-dotnet.git
				synced 2025-10-31 07:16:21 +07:00 
			
		
		
		
	Compare commits
	
		
			2 Commits
		
	
	
		
			v3.1.0
			...
			remove-fal
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| c1da47a992 | |||
| 71a4fd9b27 | 
							
								
								
									
										2
									
								
								.github/workflows/check-dist.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/check-dist.yml
									
									
									
									
										vendored
									
									
								
							| @ -44,7 +44,7 @@ jobs: | ||||
|         id: diff | ||||
|  | ||||
|       # If index.js was different than expected, upload the expected version as an artifact | ||||
|       - uses: actions/upload-artifact@v2 | ||||
|       - uses: actions/upload-artifact@v4 | ||||
|         if: ${{ failure() && steps.diff.conclusion == 'failure' }} | ||||
|         with: | ||||
|           name: dist | ||||
|  | ||||
							
								
								
									
										2
									
								
								.github/workflows/test-dotnet.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/test-dotnet.yml
									
									
									
									
										vendored
									
									
								
							| @ -17,7 +17,7 @@ jobs: | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         operating-system: [ubuntu-latest, windows-latest, macOS-latest] | ||||
|         operating-system: [ubuntu-22.04, windows-latest, macOS-latest] | ||||
|         dotnet-version: ['2.1', '2.2', '3.0', '3.1', '5.0'] | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|  | ||||
							
								
								
									
										24
									
								
								.github/workflows/workflow.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								.github/workflows/workflow.yml
									
									
									
									
										vendored
									
									
								
							| @ -17,7 +17,7 @@ jobs: | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         operating-system: [ubuntu-latest, windows-latest, macOS-latest] | ||||
|         operating-system: [ubuntu-22.04, windows-latest, macos-13] | ||||
|     steps: | ||||
|     - name: Checkout | ||||
|       uses: actions/checkout@v2 | ||||
| @ -38,7 +38,7 @@ jobs: | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         operating-system: [ubuntu-latest, windows-latest, macOS-latest] | ||||
|         operating-system: [ubuntu-22.04, windows-latest, macOS-latest] | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
| @ -61,7 +61,7 @@ jobs: | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         operating-system: [ubuntu-latest, windows-latest, macOS-latest] | ||||
|         operating-system: [ubuntu-22.04, windows-latest, macos-13] | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
| @ -94,7 +94,7 @@ jobs: | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         operating-system: [ubuntu-latest, windows-latest, macOS-latest] | ||||
|         operating-system: [ubuntu-22.04, windows-latest, macOS-latest] | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
| @ -119,7 +119,7 @@ jobs: | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         operating-system: [ubuntu-latest, windows-latest, macOS-latest] | ||||
|         operating-system: [ubuntu-22.04, windows-latest, macOS-latest] | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
| @ -143,7 +143,7 @@ jobs: | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         operating-system: [ubuntu-latest, windows-latest, macOS-latest] | ||||
|         operating-system: [ubuntu-22.04, windows-latest, macOS-latest] | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
| @ -163,18 +163,20 @@ jobs: | ||||
|         run: __tests__/verify-dotnet.ps1 3.1 2.2 | ||||
|  | ||||
|   test-proxy: | ||||
|     runs-on: ubuntu-latest | ||||
|     runs-on: ubuntu-20.04 | ||||
|     container: | ||||
|       image: mcr.microsoft.com/dotnet/core/runtime-deps:3.0-bionic | ||||
|       image: ubuntu:20.04 | ||||
|       options: --dns 127.0.0.1 | ||||
|     services: | ||||
|       squid-proxy: | ||||
|         image: datadog/squid:latest | ||||
|         image: ubuntu/squid:latest | ||||
|         ports: | ||||
|           - 3128:3128 | ||||
|     env: | ||||
|       https_proxy: http://squid-proxy:3128 | ||||
|       http_proxy: http://squid-proxy:3128 | ||||
|       DOTNET_SYSTEM_GLOBALIZATION_INVARIANT: true | ||||
|  | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v2 | ||||
| @ -183,7 +185,7 @@ jobs: | ||||
|       - name: Install curl | ||||
|         run: | | ||||
|           apt update | ||||
|           apt -y install curl | ||||
|           apt -y install curl libssl-dev | ||||
|       - name: Setup dotnet 3.1.201 | ||||
|         uses: ./ | ||||
|         with: | ||||
| @ -195,7 +197,7 @@ jobs: | ||||
|         run: __tests__/verify-dotnet.sh 3.1.201 | ||||
|  | ||||
|   test-bypass-proxy: | ||||
|     runs-on: ubuntu-latest | ||||
|     runs-on: ubuntu-22.04 | ||||
|     env: | ||||
|       https_proxy: http://no-such-proxy:3128 | ||||
|       no_proxy: github.com,dotnetcli.blob.core.windows.net,download.visualstudio.microsoft.com,api.nuget.org,dotnetcli.azureedge.net | ||||
|  | ||||
							
								
								
									
										3
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							| @ -18169,6 +18169,7 @@ class DotnetCoreInstaller { | ||||
|     getReleasesJsonUrl(httpClient, versionParts) { | ||||
|         return __awaiter(this, void 0, void 0, function* () { | ||||
|             const response = yield httpClient.getJson(DotNetCoreIndexUrl); | ||||
|  | ||||
|             const result = response.result || {}; | ||||
|             let releasesInfo = result['releases-index']; | ||||
|             releasesInfo = releasesInfo.filter((info) => { | ||||
| @ -18192,7 +18193,7 @@ class DotnetCoreInstaller { | ||||
|     } | ||||
| } | ||||
| exports.DotnetCoreInstaller = DotnetCoreInstaller; | ||||
| const DotNetCoreIndexUrl = 'https://dotnetcli.blob.core.windows.net/dotnet/release-metadata/releases-index.json'; | ||||
| const DotNetCoreIndexUrl = 'https://builds.dotnet.microsoft.com/dotnet/release-metadata/releases-index.json'; | ||||
|  | ||||
|  | ||||
| /***/ }), | ||||
|  | ||||
							
								
								
									
										3085
									
								
								externals/install-dotnet.ps1
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3085
									
								
								externals/install-dotnet.ps1
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										450
									
								
								externals/install-dotnet.sh
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										450
									
								
								externals/install-dotnet.sh
									
									
									
									
										vendored
									
									
								
							| @ -298,14 +298,43 @@ get_machine_architecture() { | ||||
|     if command -v uname > /dev/null; then | ||||
|         CPUName=$(uname -m) | ||||
|         case $CPUName in | ||||
|         armv1*|armv2*|armv3*|armv4*|armv5*|armv6*) | ||||
|             echo "armv6-or-below" | ||||
|             return 0 | ||||
|             ;; | ||||
|         armv*l) | ||||
|             echo "arm" | ||||
|             return 0 | ||||
|             ;; | ||||
|         aarch64|arm64) | ||||
|             if [ "$(getconf LONG_BIT)" -lt 64 ]; then | ||||
|                 # This is 32-bit OS running on 64-bit CPU (for example Raspberry Pi OS) | ||||
|                 echo "arm" | ||||
|                 return 0 | ||||
|             fi | ||||
|             echo "arm64" | ||||
|             return 0 | ||||
|             ;; | ||||
|         s390x) | ||||
|             echo "s390x" | ||||
|             return 0 | ||||
|             ;; | ||||
|         ppc64le) | ||||
|             echo "ppc64le" | ||||
|             return 0 | ||||
|             ;; | ||||
|         loongarch64) | ||||
|             echo "loongarch64" | ||||
|             return 0 | ||||
|             ;; | ||||
|         riscv64) | ||||
|             echo "riscv64" | ||||
|             return 0 | ||||
|             ;; | ||||
|         powerpc|ppc) | ||||
|             echo "ppc" | ||||
|             return 0 | ||||
|             ;; | ||||
|         esac | ||||
|     fi | ||||
|  | ||||
| @ -322,7 +351,13 @@ get_normalized_architecture_from_architecture() { | ||||
|     local architecture="$(to_lowercase "$1")" | ||||
|  | ||||
|     if [[ $architecture == \<auto\> ]]; then | ||||
|         echo "$(get_machine_architecture)" | ||||
|         machine_architecture="$(get_machine_architecture)" | ||||
|         if [[ "$machine_architecture" == "armv6-or-below" ]]; then | ||||
|             say_err "Architecture \`$machine_architecture\` not supported. If you think this is a bug, report it at https://github.com/dotnet/install-scripts/issues" | ||||
|             return 1 | ||||
|         fi | ||||
|  | ||||
|         echo $machine_architecture | ||||
|         return 0 | ||||
|     fi | ||||
|  | ||||
| @ -339,12 +374,72 @@ get_normalized_architecture_from_architecture() { | ||||
|             echo "arm64" | ||||
|             return 0 | ||||
|             ;; | ||||
|         s390x) | ||||
|             echo "s390x" | ||||
|             return 0 | ||||
|             ;; | ||||
|         ppc64le) | ||||
|             echo "ppc64le" | ||||
|             return 0 | ||||
|             ;; | ||||
|         loongarch64) | ||||
|             echo "loongarch64" | ||||
|             return 0 | ||||
|             ;; | ||||
|     esac | ||||
|  | ||||
|     say_err "Architecture \`$architecture\` not supported. If you think this is a bug, report it at https://github.com/dotnet/install-scripts/issues" | ||||
|     return 1 | ||||
| } | ||||
|  | ||||
| # args: | ||||
| # version - $1 | ||||
| # channel - $2 | ||||
| # architecture - $3 | ||||
| get_normalized_architecture_for_specific_sdk_version() { | ||||
|     eval $invocation | ||||
|  | ||||
|     local is_version_support_arm64="$(is_arm64_supported "$1")" | ||||
|     local is_channel_support_arm64="$(is_arm64_supported "$2")" | ||||
|     local architecture="$3"; | ||||
|     local osname="$(get_current_os_name)" | ||||
|  | ||||
|     if [ "$osname" == "osx" ] && [ "$architecture" == "arm64" ] && { [ "$is_version_support_arm64" = false ] || [ "$is_channel_support_arm64" = false ]; }; then | ||||
|         #check if rosetta is installed | ||||
|         if [ "$(/usr/bin/pgrep oahd >/dev/null 2>&1;echo $?)" -eq 0 ]; then  | ||||
|             say_verbose "Changing user architecture from '$architecture' to 'x64' because .NET SDKs prior to version 6.0 do not support arm64."  | ||||
|             echo "x64" | ||||
|             return 0; | ||||
|         else | ||||
|             say_err "Architecture \`$architecture\` is not supported for .NET SDK version \`$version\`. Please install Rosetta to allow emulation of the \`$architecture\` .NET SDK on this platform" | ||||
|             return 1 | ||||
|         fi | ||||
|     fi | ||||
|  | ||||
|     echo "$architecture" | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| # args: | ||||
| # version or channel - $1 | ||||
| is_arm64_supported() { | ||||
|     # Extract the major version by splitting on the dot | ||||
|     major_version="${1%%.*}" | ||||
|  | ||||
|     # Check if the major version is a valid number and less than 6 | ||||
|     case "$major_version" in | ||||
|         [0-9]*)   | ||||
|             if [ "$major_version" -lt 6 ]; then | ||||
|                 echo false | ||||
|                 return 0 | ||||
|             fi | ||||
|             ;; | ||||
|     esac | ||||
|  | ||||
|     echo true | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| # args: | ||||
| # user_defined_os - $1 | ||||
| get_normalized_os() { | ||||
| @ -357,8 +452,13 @@ get_normalized_os() { | ||||
|                 echo "$osname" | ||||
|                 return 0 | ||||
|                 ;; | ||||
|             macos) | ||||
|                 osname='osx' | ||||
|                 echo "$osname" | ||||
|                 return 0 | ||||
|                 ;; | ||||
|             *) | ||||
|                 say_err "'$user_defined_os' is not a supported value for --os option, supported values are: osx, linux, linux-musl, freebsd, rhel.6. If you think this is a bug, report it at https://github.com/dotnet/install-scripts/issues." | ||||
|                 say_err "'$user_defined_os' is not a supported value for --os option, supported values are: osx, macos, linux, linux-musl, freebsd, rhel.6. If you think this is a bug, report it at https://github.com/dotnet/install-scripts/issues." | ||||
|                 return 1 | ||||
|                 ;; | ||||
|         esac | ||||
| @ -401,6 +501,10 @@ get_normalized_channel() { | ||||
|  | ||||
|     local channel="$(to_lowercase "$1")" | ||||
|  | ||||
|     if [[ $channel == current ]]; then | ||||
|         say_warning 'Value "Current" is deprecated for -Channel option. Use "STS" instead.' | ||||
|     fi | ||||
|  | ||||
|     if [[ $channel == release/* ]]; then | ||||
|         say_warning 'Using branch name with -Channel option is no longer supported with newer releases. Use -Quality option with a channel in X.Y format instead.'; | ||||
|     fi | ||||
| @ -411,6 +515,14 @@ get_normalized_channel() { | ||||
|                 echo "LTS" | ||||
|                 return 0 | ||||
|                 ;; | ||||
|             sts) | ||||
|                 echo "STS" | ||||
|                 return 0 | ||||
|                 ;; | ||||
|             current) | ||||
|                 echo "STS" | ||||
|                 return 0 | ||||
|                 ;; | ||||
|             *) | ||||
|                 echo "$channel" | ||||
|                 return 0 | ||||
| @ -476,6 +588,40 @@ is_dotnet_package_installed() { | ||||
|     fi | ||||
| } | ||||
|  | ||||
| # args: | ||||
| # downloaded file - $1 | ||||
| # remote_file_size - $2 | ||||
| validate_remote_local_file_sizes()  | ||||
| { | ||||
|     eval $invocation | ||||
|  | ||||
|     local downloaded_file="$1" | ||||
|     local remote_file_size="$2" | ||||
|     local file_size='' | ||||
|  | ||||
|     if [[ "$OSTYPE" == "linux-gnu"* ]]; then | ||||
|         file_size="$(stat -c '%s' "$downloaded_file")" | ||||
|     elif [[ "$OSTYPE" == "darwin"* ]]; then | ||||
|         # hardcode in order to avoid conflicts with GNU stat | ||||
|         file_size="$(/usr/bin/stat -f '%z' "$downloaded_file")" | ||||
|     fi   | ||||
|      | ||||
|     if [ -n "$file_size" ]; then | ||||
|         say "Downloaded file size is $file_size bytes." | ||||
|  | ||||
|         if [ -n "$remote_file_size" ] && [ -n "$file_size" ]; then | ||||
|             if [ "$remote_file_size" -ne "$file_size" ]; then | ||||
|                 say "The remote and local file sizes are not equal. The remote file size is $remote_file_size bytes and the local size is $file_size bytes. The local package may be corrupted." | ||||
|             else | ||||
|                 say "The remote and local file sizes are equal." | ||||
|             fi | ||||
|         fi | ||||
|          | ||||
|     else | ||||
|         say "Either downloaded or local package size can not be measured. One of them may be corrupted."       | ||||
|     fi  | ||||
| } | ||||
|  | ||||
| # args: | ||||
| # azure_feed - $1 | ||||
| # channel - $2 | ||||
| @ -515,7 +661,7 @@ parse_globaljson_file_for_version() { | ||||
|         return 1 | ||||
|     fi | ||||
|  | ||||
|     sdk_section=$(cat $json_file | awk '/"sdk"/,/}/') | ||||
|     sdk_section=$(cat $json_file | tr -d "\r" | awk '/"sdk"/,/}/') | ||||
|     if [ -z "$sdk_section" ]; then | ||||
|         say_err "Unable to parse the SDK node in \`$json_file\`" | ||||
|         return 1 | ||||
| @ -637,11 +783,13 @@ get_specific_product_version() { | ||||
|  | ||||
|         if machine_has "curl" | ||||
|         then | ||||
|             specific_product_version=$(curl -s --fail "${download_link}${feed_credential}" 2>&1) | ||||
|             if [ $? = 0 ]; then | ||||
|             if ! specific_product_version=$(curl -s --fail "${download_link}${feed_credential}" 2>&1); then | ||||
|                 continue | ||||
|             else | ||||
|                 echo "${specific_product_version//[$'\t\r\n']}" | ||||
|                 return 0 | ||||
|             fi | ||||
|  | ||||
|         elif machine_has "wget" | ||||
|         then | ||||
|             specific_product_version=$(wget -qO- "${download_link}${feed_credential}" 2>&1) | ||||
| @ -808,6 +956,37 @@ get_absolute_path() { | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| # args: | ||||
| # override - $1 (boolean, true or false) | ||||
| get_cp_options() { | ||||
|     eval $invocation | ||||
|  | ||||
|     local override="$1" | ||||
|     local override_switch="" | ||||
|  | ||||
|     if [ "$override" = false ]; then | ||||
|         override_switch="-n" | ||||
|  | ||||
|         # create temporary files to check if 'cp -u' is supported | ||||
|         tmp_dir="$(mktemp -d)" | ||||
|         tmp_file="$tmp_dir/testfile" | ||||
|         tmp_file2="$tmp_dir/testfile2" | ||||
|  | ||||
|         touch "$tmp_file" | ||||
|  | ||||
|         # use -u instead of -n if it's available | ||||
|         if cp -u "$tmp_file" "$tmp_file2" 2>/dev/null; then | ||||
|             override_switch="-u" | ||||
|         fi | ||||
|  | ||||
|         # clean up | ||||
|         rm -f "$tmp_file" "$tmp_file2" | ||||
|         rm -rf "$tmp_dir" | ||||
|     fi | ||||
|  | ||||
|     echo "$override_switch" | ||||
| } | ||||
|  | ||||
| # args: | ||||
| # input_files - stdin | ||||
| # root_path - $1 | ||||
| @ -819,15 +998,7 @@ copy_files_or_dirs_from_list() { | ||||
|     local root_path="$(remove_trailing_slash "$1")" | ||||
|     local out_path="$(remove_trailing_slash "$2")" | ||||
|     local override="$3" | ||||
|     local osname="$(get_current_os_name)" | ||||
|     local override_switch=$( | ||||
|         if [ "$override" = false ]; then | ||||
|             if [ "$osname" = "linux-musl" ]; then | ||||
|                 printf -- "-u"; | ||||
|             else | ||||
|                 printf -- "-n"; | ||||
|             fi | ||||
|         fi) | ||||
|     local override_switch="$(get_cp_options "$override")" | ||||
|  | ||||
|     cat | uniq | while read -r file_path; do | ||||
|         local path="$(remove_beginning_slash "${file_path#$root_path}")" | ||||
| @ -842,14 +1013,39 @@ copy_files_or_dirs_from_list() { | ||||
|     done | ||||
| } | ||||
|  | ||||
| # args: | ||||
| # zip_uri - $1 | ||||
| get_remote_file_size() { | ||||
|     local zip_uri="$1" | ||||
|  | ||||
|     if machine_has "curl"; then | ||||
|         file_size=$(curl -sI  "$zip_uri" | grep -i content-length | awk '{ num = $2 + 0; print num }') | ||||
|     elif machine_has "wget"; then | ||||
|         file_size=$(wget --spider --server-response -O /dev/null "$zip_uri" 2>&1 | grep -i 'Content-Length:' | awk '{ num = $2 + 0; print num }') | ||||
|     else | ||||
|         say "Neither curl nor wget is available on this system." | ||||
|         return | ||||
|     fi | ||||
|  | ||||
|     if [ -n "$file_size" ]; then | ||||
|         say "Remote file $zip_uri size is $file_size bytes." | ||||
|         echo "$file_size" | ||||
|     else | ||||
|         say_verbose "Content-Length header was not extracted for $zip_uri." | ||||
|         echo "" | ||||
|     fi | ||||
| } | ||||
|  | ||||
| # args: | ||||
| # zip_path - $1 | ||||
| # out_path - $2 | ||||
| # remote_file_size - $3 | ||||
| extract_dotnet_package() { | ||||
|     eval $invocation | ||||
|  | ||||
|     local zip_path="$1" | ||||
|     local out_path="$2" | ||||
|     local remote_file_size="$3" | ||||
|  | ||||
|     local temp_out_path="$(mktemp -d "$temporary_file_template")" | ||||
|  | ||||
| @ -859,9 +1055,13 @@ extract_dotnet_package() { | ||||
|     local folders_with_version_regex='^.*/[0-9]+\.[0-9]+[^/]+/' | ||||
|     find "$temp_out_path" -type f | grep -Eo "$folders_with_version_regex" | sort | copy_files_or_dirs_from_list "$temp_out_path" "$out_path" false | ||||
|     find "$temp_out_path" -type f | grep -Ev "$folders_with_version_regex" | copy_files_or_dirs_from_list "$temp_out_path" "$out_path" "$override_non_versioned_files" | ||||
|  | ||||
|      | ||||
|     validate_remote_local_file_sizes "$zip_path" "$remote_file_size" | ||||
|      | ||||
|     rm -rf "$temp_out_path" | ||||
|     rm -f "$zip_path" && say_verbose "Temporary zip file $zip_path was removed" | ||||
|     if [ -z ${keep_zip+x} ]; then | ||||
|         rm -f "$zip_path" && say_verbose "Temporary archive file $zip_path was removed" | ||||
|     fi | ||||
|  | ||||
|     if [ "$failed" = true ]; then | ||||
|         say_err "Extraction failed" | ||||
| @ -921,9 +1121,15 @@ get_http_header_wget() { | ||||
|     local remote_path="$1" | ||||
|     local disable_feed_credential="$2" | ||||
|     local wget_options="-q -S --spider --tries 5 " | ||||
|     # Store options that aren't supported on all wget implementations separately. | ||||
|     local wget_options_extra="--waitretry 2 --connect-timeout 15 " | ||||
|     local wget_result='' | ||||
|  | ||||
|     local wget_options_extra='' | ||||
|  | ||||
|     # Test for options that aren't supported on all wget implementations. | ||||
|     if [[ $(wget -h 2>&1 | grep -E 'waitretry|connect-timeout') ]]; then | ||||
|         wget_options_extra="--waitretry 2 --connect-timeout 15 " | ||||
|     else | ||||
|         say "wget extra options are unavailable for this environment" | ||||
|     fi | ||||
|  | ||||
|     remote_path_with_credential="$remote_path" | ||||
|     if [ "$disable_feed_credential" = false ]; then | ||||
| @ -931,15 +1137,8 @@ get_http_header_wget() { | ||||
|     fi | ||||
|  | ||||
|     wget $wget_options $wget_options_extra "$remote_path_with_credential" 2>&1 | ||||
|     wget_result=$? | ||||
|  | ||||
|     if [[ $wget_result == 2 ]]; then | ||||
|         # Parsing of the command has failed. Exclude potentially unrecognized options and retry. | ||||
|         wget $wget_options "$remote_path_with_credential" 2>&1 | ||||
|         return $? | ||||
|     fi | ||||
|  | ||||
|     return $wget_result | ||||
|     return $? | ||||
| } | ||||
|  | ||||
| # args: | ||||
| @ -979,8 +1178,6 @@ download() { | ||||
|         sleep $((attempts*10)) | ||||
|     done | ||||
|  | ||||
|  | ||||
|  | ||||
|     if [ "$failed" = true ]; then | ||||
|         say_verbose "Download failed: $remote_path" | ||||
|         return 1 | ||||
| @ -999,19 +1196,27 @@ downloadcurl() { | ||||
|     # Avoid passing URI with credentials to functions: note, most of them echoing parameters of invocation in verbose output. | ||||
|     local remote_path_with_credential="${remote_path}${feed_credential}" | ||||
|     local curl_options="--retry 20 --retry-delay 2 --connect-timeout 15 -sSL -f --create-dirs " | ||||
|     local failed=false | ||||
|     local curl_exit_code=0; | ||||
|     if [ -z "$out_path" ]; then | ||||
|         curl $curl_options "$remote_path_with_credential" 2>&1 || failed=true | ||||
|         curl $curl_options "$remote_path_with_credential" 2>&1 | ||||
|         curl_exit_code=$? | ||||
|     else | ||||
|         curl $curl_options -o "$out_path" "$remote_path_with_credential" 2>&1 || failed=true | ||||
|         curl $curl_options -o "$out_path" "$remote_path_with_credential" 2>&1 | ||||
|         curl_exit_code=$? | ||||
|     fi | ||||
|     if [ "$failed" = true ]; then | ||||
|         local disable_feed_credential=false | ||||
|         local response=$(get_http_header_curl $remote_path $disable_feed_credential) | ||||
|         http_code=$( echo "$response" | awk '/^HTTP/{print $2}' | tail -1 ) | ||||
|      | ||||
|     if [ $curl_exit_code -gt 0 ]; then | ||||
|         download_error_msg="Unable to download $remote_path." | ||||
|         if  [[ $http_code != 2* ]]; then | ||||
|             download_error_msg+=" Returned HTTP status code: $http_code." | ||||
|         # Check for curl timeout codes | ||||
|         if [[ $curl_exit_code == 7 || $curl_exit_code == 28 ]]; then | ||||
|             download_error_msg+=" Failed to reach the server: connection timeout." | ||||
|         else | ||||
|             local disable_feed_credential=false | ||||
|             local response=$(get_http_header_curl $remote_path $disable_feed_credential) | ||||
|             http_code=$( echo "$response" | awk '/^HTTP/{print $2}' | tail -1 ) | ||||
|             if  [[ ! -z $http_code && $http_code != 2* ]]; then | ||||
|                 download_error_msg+=" Returned HTTP status code: $http_code." | ||||
|             fi | ||||
|         fi | ||||
|         say_verbose "$download_error_msg" | ||||
|         return 1 | ||||
| @ -1030,10 +1235,17 @@ downloadwget() { | ||||
|     # Append feed_credential as late as possible before calling wget to avoid logging feed_credential | ||||
|     local remote_path_with_credential="${remote_path}${feed_credential}" | ||||
|     local wget_options="--tries 20 " | ||||
|     # Store options that aren't supported on all wget implementations separately. | ||||
|     local wget_options_extra="--waitretry 2 --connect-timeout 15 " | ||||
|  | ||||
|     local wget_options_extra='' | ||||
|     local wget_result='' | ||||
|  | ||||
|     # Test for options that aren't supported on all wget implementations. | ||||
|     if [[ $(wget -h 2>&1 | grep -E 'waitretry|connect-timeout') ]]; then | ||||
|         wget_options_extra="--waitretry 2 --connect-timeout 15 " | ||||
|     else | ||||
|         say "wget extra options are unavailable for this environment" | ||||
|     fi | ||||
|  | ||||
|     if [ -z "$out_path" ]; then | ||||
|         wget -q $wget_options $wget_options_extra -O - "$remote_path_with_credential" 2>&1 | ||||
|         wget_result=$? | ||||
| @ -1042,24 +1254,16 @@ downloadwget() { | ||||
|         wget_result=$? | ||||
|     fi | ||||
|  | ||||
|     if [[ $wget_result == 2 ]]; then | ||||
|         # Parsing of the command has failed. Exclude potentially unrecognized options and retry. | ||||
|         if [ -z "$out_path" ]; then | ||||
|             wget -q $wget_options -O - "$remote_path_with_credential" 2>&1 | ||||
|             wget_result=$? | ||||
|         else | ||||
|             wget $wget_options -O "$out_path" "$remote_path_with_credential" 2>&1 | ||||
|             wget_result=$? | ||||
|         fi | ||||
|     fi | ||||
|  | ||||
|     if [[ $wget_result != 0 ]]; then | ||||
|         local disable_feed_credential=false | ||||
|         local response=$(get_http_header_wget $remote_path $disable_feed_credential) | ||||
|         http_code=$( echo "$response" | awk '/^  HTTP/{print $2}' | tail -1 ) | ||||
|         download_error_msg="Unable to download $remote_path." | ||||
|         if  [[ $http_code != 2* ]]; then | ||||
|         if  [[ ! -z $http_code && $http_code != 2* ]]; then | ||||
|             download_error_msg+=" Returned HTTP status code: $http_code." | ||||
|         # wget exit code 4 stands for network-issue | ||||
|         elif [[ $wget_result == 4 ]]; then | ||||
|             download_error_msg+=" Failed to reach the server: connection timeout." | ||||
|         fi | ||||
|         say_verbose "$download_error_msg" | ||||
|         return 1 | ||||
| @ -1068,13 +1272,69 @@ downloadwget() { | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| extract_stem() { | ||||
|     local url="$1" | ||||
|     # extract the protocol | ||||
|     proto="$(echo $1 | grep :// | sed -e's,^\(.*://\).*,\1,g')" | ||||
|     # remove the protocol | ||||
|     url="${1/$proto/}" | ||||
|     # extract the path (if any) - since we know all of our feeds have a first path segment, we can skip the first one. otherwise we'd use -f2- to get the full path | ||||
|     full_path="$(echo $url | grep / | cut -d/ -f2-)" | ||||
|     path="$(echo $full_path | cut -d/ -f2-)" | ||||
|     echo $path | ||||
| } | ||||
|  | ||||
| check_url_exists() { | ||||
|     eval $invocation | ||||
|     local url="$1" | ||||
|  | ||||
|     local code="" | ||||
|     if machine_has "curl" | ||||
|     then | ||||
|         code=$(curl --head -o /dev/null -w "%{http_code}" -s --fail "$url"); | ||||
|     elif machine_has "wget" | ||||
|     then | ||||
|         # get the http response, grab the status code | ||||
|         server_response=$(wget -qO- --method=HEAD --server-response "$url" 2>&1) | ||||
|         code=$(echo "$server_response" | grep "HTTP/" | awk '{print $2}') | ||||
|     fi | ||||
|     if [ $code = "200" ]; then | ||||
|         return 0 | ||||
|     else | ||||
|         return 1 | ||||
|     fi | ||||
| } | ||||
|  | ||||
| sanitize_redirect_url() { | ||||
|     eval $invocation | ||||
|  | ||||
|     local url_stem | ||||
|     url_stem=$(extract_stem "$1") | ||||
|     say_verbose "Checking configured feeds for the asset at ${yellow:-}$url_stem${normal:-}" | ||||
|  | ||||
|     for feed in "${feeds[@]}" | ||||
|     do | ||||
|         local trial_url="$feed/$url_stem" | ||||
|         say_verbose "Checking ${yellow:-}$trial_url${normal:-}" | ||||
|         if check_url_exists "$trial_url"; then | ||||
|             say_verbose "Found a match at ${yellow:-}$trial_url${normal:-}" | ||||
|             echo "$trial_url" | ||||
|             return 0 | ||||
|         else | ||||
|             say_verbose "No match at ${yellow:-}$trial_url${normal:-}" | ||||
|         fi | ||||
|     done | ||||
|     return 1 | ||||
| } | ||||
|  | ||||
| get_download_link_from_aka_ms() { | ||||
|     eval $invocation | ||||
|  | ||||
|     #quality is not supported for LTS or current channel | ||||
|     if [[ ! -z "$normalized_quality"  && ("$normalized_channel" == "LTS" || "$normalized_channel" == "current") ]]; then | ||||
|     #quality is not supported for LTS or STS channel | ||||
|     #STS maps to current | ||||
|     if [[ ! -z "$normalized_quality"  && ("$normalized_channel" == "LTS" || "$normalized_channel" == "STS") ]]; then | ||||
|         normalized_quality="" | ||||
|         say_warning "Specifying quality for current or LTS channel is not supported, the quality will be ignored." | ||||
|         say_warning "Specifying quality for STS or LTS channel is not supported, the quality will be ignored." | ||||
|     fi | ||||
|  | ||||
|     say_verbose "Retrieving primary payload URL from aka.ms for channel: '$normalized_channel', quality: '$normalized_quality', product: '$normalized_product', os: '$normalized_os', architecture: '$normalized_architecture'."  | ||||
| @ -1103,6 +1363,12 @@ get_download_link_from_aka_ms() { | ||||
|     http_codes=$( echo "$response" | awk '$1 ~ /^HTTP/ {print $2}' ) | ||||
|     # They all need to be 301, otherwise some links are broken (except for the last, which is not a redirect but 200 or 404). | ||||
|     broken_redirects=$( echo "$http_codes" | sed '$d' | grep -v '301' ) | ||||
|     # The response may end without final code 2xx/4xx/5xx somehow, e.g. network restrictions on www.bing.com causes redirecting to bing.com fails with connection refused. | ||||
|     # In this case it should not exclude the last. | ||||
|     last_http_code=$(  echo "$http_codes" | tail -n 1 ) | ||||
|     if ! [[ $last_http_code =~ ^(2|4|5)[0-9][0-9]$ ]]; then | ||||
|         broken_redirects=$( echo "$http_codes" | grep -v '301' ) | ||||
|     fi | ||||
|  | ||||
|     # All HTTP codes are 301 (Moved Permanently), the redirect link exists. | ||||
|     if [[ -z "$broken_redirects" ]]; then | ||||
| @ -1113,6 +1379,11 @@ get_download_link_from_aka_ms() { | ||||
|             return 1 | ||||
|         fi | ||||
|  | ||||
|         sanitized_redirect_url=$(sanitize_redirect_url "$aka_ms_download_link") | ||||
|         if [[ -n "$sanitized_redirect_url" ]]; then | ||||
|             aka_ms_download_link="$sanitized_redirect_url" | ||||
|         fi | ||||
|  | ||||
|         say_verbose "The redirect location retrieved: '$aka_ms_download_link'." | ||||
|         return 0 | ||||
|     else | ||||
| @ -1124,7 +1395,9 @@ get_download_link_from_aka_ms() { | ||||
| get_feeds_to_use() | ||||
| { | ||||
|     feeds=( | ||||
|     "https://builds.dotnet.microsoft.com/dotnet" | ||||
|     "https://dotnetcli.azureedge.net/dotnet" | ||||
|     "https://ci.dot.net/public" | ||||
|     "https://dotnetbuilds.azureedge.net/public" | ||||
|     ) | ||||
|  | ||||
| @ -1182,6 +1455,11 @@ generate_akams_links() { | ||||
|     local valid_aka_ms_link=true; | ||||
|  | ||||
|     normalized_version="$(to_lowercase "$version")" | ||||
|     if [[ "$normalized_version" != "latest" ]] && [ -n "$normalized_quality" ]; then | ||||
|         say_err "Quality and Version options are not allowed to be specified simultaneously. See https://learn.microsoft.com/dotnet/core/tools/dotnet-install-script#options for details." | ||||
|         return 1 | ||||
|     fi | ||||
|  | ||||
|     if [[ -n "$json_file" || "$normalized_version" != "latest" ]]; then | ||||
|         # aka.ms links are not needed when exact version is specified via command or json file | ||||
|         return | ||||
| @ -1325,6 +1603,8 @@ calculate_vars() { | ||||
|     install_root="$(resolve_installation_path "$install_dir")" | ||||
|     say_verbose "InstallRoot: '$install_root'." | ||||
|  | ||||
|     normalized_architecture="$(get_normalized_architecture_for_specific_sdk_version "$version" "$normalized_channel" "$normalized_architecture")" | ||||
|  | ||||
|     if [[ "$runtime" == "dotnet" ]]; then | ||||
|         asset_relative_path="shared/Microsoft.NETCore.App" | ||||
|         asset_name=".NET Core Runtime" | ||||
| @ -1343,10 +1623,11 @@ install_dotnet() { | ||||
|     eval $invocation | ||||
|     local download_failed=false | ||||
|     local download_completed=false | ||||
|     local remote_file_size=0 | ||||
|  | ||||
|     mkdir -p "$install_root" | ||||
|     zip_path="$(mktemp "$temporary_file_template")" | ||||
|     say_verbose "Zip path: $zip_path" | ||||
|     zip_path="${zip_path:-$(mktemp "$temporary_file_template")}" | ||||
|     say_verbose "Archive path: $zip_path" | ||||
|  | ||||
|     for link_index in "${!download_links[@]}" | ||||
|     do | ||||
| @ -1370,7 +1651,7 @@ install_dotnet() { | ||||
|                 say "Failed to download $link_type link '$download_link': $download_error_msg" | ||||
|                 ;; | ||||
|             esac | ||||
|             rm -f "$zip_path" 2>&1 && say_verbose "Temporary zip file $zip_path was removed" | ||||
|             rm -f "$zip_path" 2>&1 && say_verbose "Temporary archive file $zip_path was removed" | ||||
|         else | ||||
|             download_completed=true | ||||
|             break | ||||
| @ -1383,8 +1664,10 @@ install_dotnet() { | ||||
|         return 1 | ||||
|     fi | ||||
|  | ||||
|     say "Extracting zip from $download_link" | ||||
|     extract_dotnet_package "$zip_path" "$install_root" || return 1 | ||||
|     remote_file_size="$(get_remote_file_size "$download_link")" | ||||
|  | ||||
|     say "Extracting archive from $download_link" | ||||
|     extract_dotnet_package "$zip_path" "$install_root" "$remote_file_size" || return 1 | ||||
|  | ||||
|     #  Check if the SDK version is installed; if not, fail the installation. | ||||
|     # if the version contains "RTM" or "servicing"; check if a 'release-type' SDK version is installed. | ||||
| @ -1395,6 +1678,7 @@ install_dotnet() { | ||||
|         unset IFS; | ||||
|         say_verbose "Checking installation: version = $release_version" | ||||
|         if is_dotnet_package_installed "$install_root" "$asset_relative_path" "$release_version"; then | ||||
|             say "Installed version is $effective_version" | ||||
|             return 0 | ||||
|         fi | ||||
|     fi | ||||
| @ -1402,6 +1686,7 @@ install_dotnet() { | ||||
|     #  Check if the standard SDK version is installed. | ||||
|     say_verbose "Checking installation: version = $effective_version" | ||||
|     if is_dotnet_package_installed "$install_root" "$asset_relative_path" "$effective_version"; then | ||||
|         say "Installed version is $effective_version" | ||||
|         return 0 | ||||
|     fi | ||||
|  | ||||
| @ -1532,36 +1817,53 @@ do | ||||
|             override_non_versioned_files=false | ||||
|             non_dynamic_parameters+=" $name" | ||||
|             ;; | ||||
|         --keep-zip|-[Kk]eep[Zz]ip) | ||||
|             keep_zip=true | ||||
|             non_dynamic_parameters+=" $name" | ||||
|             ;; | ||||
|         --zip-path|-[Zz]ip[Pp]ath) | ||||
|             shift | ||||
|             zip_path="$1" | ||||
|             ;; | ||||
|         -?|--?|-h|--help|-[Hh]elp) | ||||
|             script_name="$(basename "$0")" | ||||
|             script_name="dotnet-install.sh" | ||||
|             echo ".NET Tools Installer" | ||||
|             echo "Usage: $script_name [-c|--channel <CHANNEL>] [-v|--version <VERSION>] [-p|--prefix <DESTINATION>]" | ||||
|             echo "Usage:" | ||||
|             echo "       # Install a .NET SDK of a given Quality from a given Channel" | ||||
|             echo "       $script_name [-c|--channel <CHANNEL>] [-q|--quality <QUALITY>]" | ||||
|             echo "       # Install a .NET SDK of a specific public version" | ||||
|             echo "       $script_name [-v|--version <VERSION>]" | ||||
|             echo "       $script_name -h|-?|--help" | ||||
|             echo "" | ||||
|             echo "$script_name is a simple command line interface for obtaining dotnet cli." | ||||
|             echo "    Note that the intended use of this script is for Continuous Integration (CI) scenarios, where:" | ||||
|             echo "    - The SDK needs to be installed without user interaction and without admin rights." | ||||
|             echo "    - The SDK installation doesn't need to persist across multiple CI runs." | ||||
|             echo "    To set up a development environment or to run apps, use installers rather than this script. Visit https://dotnet.microsoft.com/download to get the installer." | ||||
|             echo "" | ||||
|             echo "Options:" | ||||
|             echo "  -c,--channel <CHANNEL>         Download from the channel specified, Defaults to \`$channel\`." | ||||
|             echo "      -Channel" | ||||
|             echo "          Possible values:" | ||||
|             echo "          - Current - most current release" | ||||
|             echo "          - LTS - most current supported release" | ||||
|             echo "          - STS - the most recent Standard Term Support release" | ||||
|             echo "          - LTS - the most recent Long Term Support release" | ||||
|             echo "          - 2-part version in a format A.B - represents a specific release" | ||||
|             echo "              examples: 2.0; 1.0" | ||||
|             echo "          - 3-part version in a format A.B.Cxx - represents a specific SDK release" | ||||
|             echo "              examples: 5.0.1xx, 5.0.2xx." | ||||
|             echo "              Supported since 5.0 release" | ||||
|             echo "          Warning: Value 'Current' is deprecated for the Channel parameter. Use 'STS' instead." | ||||
|             echo "          Note: The version parameter overrides the channel parameter when any version other than 'latest' is used." | ||||
|             echo "  -v,--version <VERSION>         Use specific VERSION, Defaults to \`$version\`." | ||||
|             echo "      -Version" | ||||
|             echo "          Possible values:" | ||||
|             echo "          - latest - most latest build on specific channel" | ||||
|             echo "          - latest - the latest build on specific channel" | ||||
|             echo "          - 3-part version in a format A.B.C - represents specific version of build" | ||||
|             echo "              examples: 2.0.0-preview2-006120; 1.1.0" | ||||
|             echo "  -q,--quality <quality>         Download the latest build of specified quality in the channel." | ||||
|             echo "      -Quality" | ||||
|             echo "          The possible values are: daily, signed, validated, preview, GA." | ||||
|             echo "          Works only in combination with channel. Not applicable for current and LTS channels and will be ignored if those channels are used."  | ||||
|             echo "          Works only in combination with channel. Not applicable for STS and LTS channels and will be ignored if those channels are used."  | ||||
|             echo "          For SDK use channel in A.B.Cxx format. Using quality for SDK together with channel in A.B format is not supported."  | ||||
|             echo "          Supported since 5.0 release."  | ||||
|             echo "          Note: The version parameter overrides the channel parameter when any version other than 'latest' is used, and therefore overrides the quality." | ||||
| @ -1572,7 +1874,7 @@ do | ||||
|             echo "      -InstallDir" | ||||
|             echo "  --architecture <ARCHITECTURE>      Architecture of dotnet binaries to be installed, Defaults to \`$architecture\`." | ||||
|             echo "      --arch,-Architecture,-Arch" | ||||
|             echo "          Possible values: x64, arm, and arm64" | ||||
|             echo "          Possible values: x64, arm, arm64, s390x, ppc64le and loongarch64" | ||||
|             echo "  --os <system>                    Specifies operating system to be used when selecting the installer." | ||||
|             echo "          Overrides the OS determination approach used by the script. Supported values: osx, linux, linux-musl, freebsd, rhel.6." | ||||
|             echo "          In case any other value is provided, the platform will be determined by the script based on machine configuration." | ||||
| @ -1597,6 +1899,8 @@ do | ||||
|             echo "  --no-cdn,-NoCdn                    Disable downloading from the Azure CDN, and use the uncached feed directly." | ||||
|             echo "  --jsonfile <JSONFILE>              Determines the SDK version from a user specified global.json file." | ||||
|             echo "                                     Note: global.json must have a value for 'SDK:Version'" | ||||
|             echo "  --keep-zip,-KeepZip                If set, downloaded file is kept." | ||||
|             echo "  --zip-path, -ZipPath               If set, downloaded file is stored at the specified path." | ||||
|             echo "  -?,--?,-h,--help,-Help             Shows this help message" | ||||
|             echo "" | ||||
|             echo "Install Location:" | ||||
| @ -1615,10 +1919,10 @@ do | ||||
|     shift | ||||
| done | ||||
|  | ||||
| say "Note that the intended use of this script is for Continuous Integration (CI) scenarios, where:" | ||||
| say "- The SDK needs to be installed without user interaction and without admin rights." | ||||
| say "- The SDK installation doesn't need to persist across multiple CI runs." | ||||
| say "To set up a development environment or to run apps, use installers rather than this script. Visit https://dotnet.microsoft.com/download to get the installer.\n" | ||||
| say_verbose "Note that the intended use of this script is for Continuous Integration (CI) scenarios, where:" | ||||
| say_verbose "- The SDK needs to be installed without user interaction and without admin rights." | ||||
| say_verbose "- The SDK installation doesn't need to persist across multiple CI runs." | ||||
| say_verbose "To set up a development environment or to run apps, use installers rather than this script. Visit https://dotnet.microsoft.com/download to get the installer.\n" | ||||
|  | ||||
| if [ "$internal" = true ] && [ -z "$(echo $feed_credential)" ]; then | ||||
|     message="Provide credentials via --feed-credential parameter." | ||||
| @ -1651,5 +1955,5 @@ else | ||||
| fi | ||||
|  | ||||
| say "Note that the script does not resolve dependencies during installation." | ||||
| say "To check the list of dependencies, go to https://docs.microsoft.com/dotnet/core/install, select your operating system and check the \"Dependencies\" section." | ||||
| say "Installation finished successfully." | ||||
| say "To check the list of dependencies, go to https://learn.microsoft.com/dotnet/core/install, select your operating system and check the \"Dependencies\" section." | ||||
| say "Installation finished successfully." | ||||
|  | ||||
| @ -262,6 +262,7 @@ export class DotnetCoreInstaller { | ||||
|     versionParts: string[] | ||||
|   ): Promise<string> { | ||||
|     const response = await httpClient.getJson<any>(DotNetCoreIndexUrl); | ||||
|  | ||||
|     const result = response.result || {}; | ||||
|     let releasesInfo: any[] = result['releases-index']; | ||||
|  | ||||
| @ -300,4 +301,4 @@ export class DotnetCoreInstaller { | ||||
| } | ||||
|  | ||||
| const DotNetCoreIndexUrl: string = | ||||
|   'https://dotnetcli.blob.core.windows.net/dotnet/release-metadata/releases-index.json'; | ||||
|   'https://builds.dotnet.microsoft.com/dotnet/release-metadata/releases-index.json'; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	