Files
ChenjunweiandClaude Opus 4.7 407823768f [fix](build) Prefer thirdparty mirror for JuiceFS downloads (#61968)
## Summary
- prefer the datalake-owned HK OSS mirror for JuiceFS Hadoop jar
downloads in both docker and thirdparty build flows
- keep upstream Maven Central and JuiceFS GitHub release as the fallback
path when the mirror is unavailable
- add shell regression coverage for the new default mirror path and
fallback behavior

## Mirror Path
- mirror root:
`https://doris-regression-hk.oss-cn-hongkong.aliyuncs.com/regression/datalake/thirdparty/juicefs`
- hadoop jar:
`https://doris-regression-hk.oss-cn-hongkong.aliyuncs.com/regression/datalake/thirdparty/juicefs/juicefs-hadoop-1.3.1.jar`
- cli archive:
`https://doris-regression-hk.oss-cn-hongkong.aliyuncs.com/regression/datalake/thirdparty/juicefs/juicefs-1.3.1-linux-amd64.tar.gz`

## Root Cause
JuiceFS downloads were hardcoded to Maven Central and GitHub release
endpoints in the docker and thirdparty scripts. Network jitter on those
upstream endpoints could stall or fail docker startup and thirdparty
downloads.

## Impact
JuiceFS-related bootstrap paths now use the datalake HK OSS mirror by
default while preserving upstream fallback. This avoids depending on the
shared thirdparty mirror for the JuiceFS path.

## Test Plan
- `bash docker/thirdparties/test/juicefs-helpers-mirror-test.sh`
- `bash thirdparty/test/juicefs-default-mirror-test.sh`
- `bash thirdparty/test/download-thirdparty-fallback-test.sh`
- `bash -n docker/thirdparties/juicefs-helpers.sh thirdparty/vars.sh
docker/thirdparties/test/juicefs-helpers-mirror-test.sh
thirdparty/test/juicefs-default-mirror-test.sh
thirdparty/test/download-thirdparty-fallback-test.sh`
- `HEAD
https://doris-regression-hk.oss-cn-hongkong.aliyuncs.com/regression/datalake/thirdparty/juicefs/juicefs-hadoop-1.3.1.jar`
- `HEAD
https://doris-regression-hk.oss-cn-hongkong.aliyuncs.com/regression/datalake/thirdparty/juicefs/juicefs-1.3.1-linux-amd64.tar.gz`
- direct download verification for both objects after upload

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 17:47:25 +08:00

164 lines
5.4 KiB
Bash

#!/usr/bin/env bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# Shared JuiceFS helper functions used by build and docker scripts.
JUICEFS_DEFAULT_VERSION="${JUICEFS_DEFAULT_VERSION:-1.3.1}"
MAVEN_REPOSITORY_URL="${MAVEN_REPOSITORY_URL:-https://repo1.maven.org/maven2}"
JUICEFS_THIRDPARTY_REPOSITORY_URL="${JUICEFS_THIRDPARTY_REPOSITORY_URL:-}"
JUICEFS_DEFAULT_THIRDPARTY_REPOSITORY_URL="${JUICEFS_DEFAULT_THIRDPARTY_REPOSITORY_URL:-}"
JUICEFS_HADOOP_MAVEN_REPO="${JUICEFS_HADOOP_MAVEN_REPO:-${MAVEN_REPOSITORY_URL}/io/juicefs/juicefs-hadoop}"
JUICEFS_CLI_RELEASE_REPO="${JUICEFS_CLI_RELEASE_REPO:-https://github.com/juicedata/juicefs/releases/download}"
juicefs_default_thirdparty_repository_url() {
if [[ -n "${JUICEFS_DEFAULT_THIRDPARTY_REPOSITORY_URL}" ]]; then
echo "${JUICEFS_DEFAULT_THIRDPARTY_REPOSITORY_URL%/}"
return 0
fi
if [[ -n "${s3BucketName:-}" && -n "${s3Endpoint:-}" ]]; then
echo "https://${s3BucketName}.${s3Endpoint}/regression/datalake/thirdparty/juicefs"
return 0
fi
echo "https://doris-regression-hk.oss-cn-hongkong.aliyuncs.com/regression/datalake/thirdparty/juicefs"
}
juicefs_thirdparty_repository_url() {
local repository_url="${JUICEFS_THIRDPARTY_REPOSITORY_URL:-${REPOSITORY_URL:-}}"
if [[ -z "${repository_url}" ]]; then
repository_url=$(juicefs_default_thirdparty_repository_url)
fi
echo "${repository_url%/}"
}
juicefs_repository_file_url() {
local filename="$1"
echo "$(juicefs_thirdparty_repository_url)/${filename}"
}
juicefs_find_hadoop_jar_by_globs() {
local jar_glob=""
local matched_jar=""
for jar_glob in "$@"; do
matched_jar=$(compgen -G "${jar_glob}" | head -n 1 || true)
if [[ -n "${matched_jar}" ]]; then
echo "${matched_jar}"
return 0
fi
done
return 1
}
juicefs_detect_hadoop_version() {
local juicefs_jar="$1"
local default_version="${2:-${JUICEFS_DEFAULT_VERSION}}"
if [[ -z "${juicefs_jar}" ]]; then
echo "${default_version}"
return 0
fi
juicefs_jar=$(basename "${juicefs_jar}")
juicefs_jar=${juicefs_jar#juicefs-hadoop-}
echo "${juicefs_jar%.jar}"
}
juicefs_hadoop_jar_download_url() {
local juicefs_version="$1"
local jar_name="juicefs-hadoop-${juicefs_version}.jar"
echo "${JUICEFS_HADOOP_MAVEN_REPO}/${juicefs_version}/${jar_name}"
}
juicefs_hadoop_jar_download_urls() {
local juicefs_version="$1"
local jar_name="juicefs-hadoop-${juicefs_version}.jar"
printf '%s\n' \
"$(juicefs_repository_file_url "${jar_name}")" \
"$(juicefs_hadoop_jar_download_url "${juicefs_version}")"
}
juicefs_cli_archive_name() {
local juicefs_version="$1"
echo "juicefs-${juicefs_version}-linux-amd64.tar.gz"
}
juicefs_cli_archive_mirror_url() {
local juicefs_version="$1"
local archive_name
archive_name=$(juicefs_cli_archive_name "${juicefs_version}")
juicefs_repository_file_url "${archive_name}"
}
juicefs_cli_archive_download_url() {
local juicefs_version="$1"
local archive_name
archive_name=$(juicefs_cli_archive_name "${juicefs_version}")
echo "${JUICEFS_CLI_RELEASE_REPO}/v${juicefs_version}/${archive_name}"
}
juicefs_cli_archive_download_urls() {
local juicefs_version="$1"
printf '%s\n' \
"$(juicefs_cli_archive_mirror_url "${juicefs_version}")" \
"$(juicefs_cli_archive_download_url "${juicefs_version}")"
}
juicefs_download_file() {
local target_path="$1"
local download_label="$2"
shift 2
local download_url=""
mkdir -p "$(dirname "${target_path}")"
for download_url in "$@"; do
[[ -n "${download_url}" ]] || continue
echo "Downloading ${download_label} from ${download_url}" >&2
if command -v curl >/dev/null 2>&1; then
if curl -fL --retry 3 --retry-delay 2 --connect-timeout 10 -o "${target_path}" "${download_url}"; then
return 0
fi
elif command -v wget >/dev/null 2>&1; then
if wget -q "${download_url}" -O "${target_path}"; then
return 0
fi
fi
done
rm -f "${target_path}"
return 1
}
juicefs_download_hadoop_jar_to_cache() {
local juicefs_version="$1"
local cache_dir="$2"
local jar_name="juicefs-hadoop-${juicefs_version}.jar"
local target_jar="${cache_dir}/${jar_name}"
local -a download_urls=()
mkdir -p "${cache_dir}"
if [[ -s "${target_jar}" ]]; then
echo "${target_jar}"
return 0
fi
mapfile -t download_urls < <(juicefs_hadoop_jar_download_urls "${juicefs_version}")
if juicefs_download_file "${target_jar}" "JuiceFS Hadoop jar ${juicefs_version}" "${download_urls[@]}"; then
echo "${target_jar}"
return 0
fi
return 1
}