diff --git a/.aiops.args b/.aiops.args new file mode 100644 index 0000000..1dbc55b --- /dev/null +++ b/.aiops.args @@ -0,0 +1,4 @@ +--mode +local +--port +8080 diff --git a/backend/model/deploy_tool.go b/backend/model/deploy_tool.go index 1a1b051..390a550 100644 --- a/backend/model/deploy_tool.go +++ b/backend/model/deploy_tool.go @@ -77,10 +77,10 @@ func PredefinedTools() []DeployTool { CheckCommand: "/usr/local/bin/java -version 2>&1 | head -1", VersionURL: "https://api.adoptium.net/v3/info/release_versions?heap_size=normal&image_type=jdk&page=0&page_size=1&project=jdk&release_type=ga&semver=false&sort_method=DEFAULT&sort_order=DESC&version=%5B17%2C99%5D", DownloadURL: "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-{version}/OpenJDK17U-jdk_x64_linux_hotspot_{version}.tar.gz", - DefaultVersion: "17.0.13+7", + DefaultVersion: "17.0.19+10", InstallScript: `#!/bin/sh -# JDK lazy install — Alpine apk 优先,否则 Adoptium API 多镜像 // Logan.Li -JDK_VERSION="${TOOL_VERSION:-17.0.13+7}" +# JDK lazy install — Alpine apk 优先,否则国内镜像轮询 Adoptium // Logan.Li +JDK_VERSION="${TOOL_VERSION:-17.0.19+10}" JDK_MAJOR=$(echo "$JDK_VERSION" | cut -d. -f1) JDK_FILE_VER=$(echo "$JDK_VERSION" | tr '+' '_') echo "[JDK] Installing ${JDK_VERSION} (major ${JDK_MAJOR})..." @@ -109,20 +109,26 @@ fi cd /tmp && rm -rf jdk.tar.gz jdk-install mkdir -p jdk-install && cd jdk-install DOWNLOADED=0 +# 国内镜像优先: 阿里云 > 清华 > 华为 > 中科大 > GitHub // Logan.Li for URL in \ + "https://mirrors.aliyun.com/Adoptium/${JDK_MAJOR}/jdk/${JDK_VERSION}/OpenJDK${JDK_MAJOR}U-jdk_x64_linux_hotspot_${JDK_FILE_VER}.tar.gz" \ + "https://mirrors.tuna.tsinghua.edu.cn/Adoptium/${JDK_MAJOR}/jdk/x64/linux/OpenJDK${JDK_MAJOR}U-jdk_x64_linux_hotspot_${JDK_FILE_VER}.tar.gz" \ + "https://mirrors.huaweicloud.com/Adoptium/${JDK_MAJOR}/jdk/${JDK_VERSION}/OpenJDK${JDK_MAJOR}U-jdk_x64_linux_hotspot_${JDK_FILE_VER}.tar.gz" \ + "https://mirrors.ustc.edu.cn/Adoptium/${JDK_MAJOR}/jdk/${JDK_VERSION}/OpenJDK${JDK_MAJOR}U-jdk_x64_linux_hotspot_${JDK_FILE_VER}.tar.gz" \ "https://api.adoptium.net/v3/binary/version/${JDK_VERSION}/linux/x64/jdk/hotspot/normal/eclipse?project=jdk" \ - "https://mirrors.tuna.tsinghua.edu.cn/Adoptium/${JDK_MAJOR}/jdk/${JDK_VERSION}/OpenJDK${JDK_MAJOR}U-jdk_x64_linux_hotspot_${JDK_FILE_VER}.tar.gz" \ "https://github.com/adoptium/temurin${JDK_MAJOR}-binaries/releases/download/jdk-${JDK_VERSION}/OpenJDK${JDK_MAJOR}U-jdk_x64_linux_hotspot_${JDK_FILE_VER}.tar.gz" do echo "[JDK] Trying $URL" - if curl -fsSL -L -o jdk.tar.gz "$URL"; then - DOWNLOADED=1 - break + if curl -fsSL -L --connect-timeout 15 --max-time 300 -o jdk.tar.gz "$URL"; then + if [ -s jdk.tar.gz ] && file jdk.tar.gz | grep -q gzip; then + DOWNLOADED=1 + break + fi fi rm -f jdk.tar.gz done [ "$DOWNLOADED" -eq 1 ] || { echo "[JDK] all mirrors failed"; exit 1; } -tar xzf jdk.tar.gz +tar xzf jdk.tar.gz || { echo "[JDK] extract failed"; exit 1; } JDK_DIR=$(find . -maxdepth 1 -type d -name 'jdk-*' | head -1) [ -n "$JDK_DIR" ] || { echo "[JDK] extract dir not found"; exit 1; } mkdir -p /usr/local/share @@ -148,29 +154,35 @@ echo "[JDK] Installed: $(/usr/local/bin/java -version 2>&1 | head -1)" CheckCommand: "/usr/local/bin/mvn --version 2>/dev/null | head -1", DownloadURL: "https://dlcdn.apache.org/maven/maven-3/{version}/binaries/apache-maven-{version}-bin.tar.gz", VersionURL: "https://dlcdn.apache.org/maven/maven-3/", - DefaultVersion: "3.9.9", + DefaultVersion: "3.9.16", InstallScript: `#!/bin/sh -# Maven lazy install — 多镜像轮询 // Logan.Li -MAVEN_VERSION="${TOOL_VERSION:-3.9.9}" +# Maven lazy install — 国内镜像优先(阿里云 > 华为 > 清华 > 中科大 > 官方)// Logan.Li +MAVEN_VERSION="${TOOL_VERSION:-3.9.16}" +MAJOR="${MAVEN_VERSION%%.*}" echo "[Maven] Downloading ${MAVEN_VERSION}..." cd /tmp && rm -rf maven.tar.gz maven-install mkdir -p maven-install && cd maven-install DOWNLOADED=0 for URL in \ - "https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz" \ - "https://repo.huaweicloud.com/apache/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz" \ - "https://dlcdn.apache.org/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz" \ - "https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz" + "https://mirrors.aliyun.com/apache/maven/maven-${MAJOR}/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz" \ + "https://repo.huaweicloud.com/apache/maven/maven-${MAJOR}/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz" \ + "https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-${MAJOR}/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz" \ + "https://mirrors.ustc.edu.cn/apache/maven/maven-${MAJOR}/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz" \ + "https://mirrors.nju.edu.cn/apache/maven/maven-${MAJOR}/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz" \ + "https://dlcdn.apache.org/maven/maven-${MAJOR}/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz" \ + "https://archive.apache.org/dist/maven/maven-${MAJOR}/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz" do echo "[Maven] Trying $URL" - if curl -fsSL -o maven.tar.gz "$URL"; then - DOWNLOADED=1 - break + if curl -fsSL --connect-timeout 15 --max-time 120 -o maven.tar.gz "$URL"; then + if [ -s maven.tar.gz ] && file maven.tar.gz | grep -q gzip; then + DOWNLOADED=1 + break + fi fi rm -f maven.tar.gz done [ "$DOWNLOADED" -eq 1 ] || { echo "[Maven] all mirrors failed"; exit 1; } -tar xzf maven.tar.gz +tar xzf maven.tar.gz || { echo "[Maven] extract failed"; exit 1; } MVN_DIR=$(find . -maxdepth 1 -type d -name 'apache-maven-*' | head -1) [ -n "$MVN_DIR" ] || { echo "[Maven] extract dir not found"; exit 1; } mkdir -p /usr/local/share @@ -311,28 +323,57 @@ direct_install_binary() { RESOLVED="$1" DEST="$NVM_DIR/versions/node/${RESOLVED}" TMP="/tmp/node-dl-$$" - rm -rf "$TMP" "$DEST" + ARCHIVE="/tmp/node-archive-$$.tar.xz" + rm -rf "$TMP" "$DEST" "$ARCHIVE" mkdir -p "$TMP" + # 国内优先: 阿里云 OSS > npmmirror > 清华 > 官方 // Logan.Li if [ -f /etc/alpine-release ]; then - # Node 官方仅 glibc;Alpine musl 走 unofficial-builds // Logan.Li - URLS="https://unofficial-builds.nodejs.org/download/release/${RESOLVED}/node-${RESOLVED}-linux-x64-musl.tar.xz" + URLS=" + https://unofficial-builds.nodejs.org/download/release/${RESOLVED}/node-${RESOLVED}-linux-x64-musl.tar.xz + " else - URLS="${NODE_MIRROR}/${RESOLVED}/node-${RESOLVED}-linux-x64.tar.xz https://nodejs.org/dist/${RESOLVED}/node-${RESOLVED}-linux-x64.tar.xz" + URLS=" + https://mirrors.aliyun.com/nodejs-release/${RESOLVED}/node-${RESOLVED}-linux-x64.tar.xz + https://mirrors.tuna.tsinghua.edu.cn/nodejs-release/${RESOLVED}/node-${RESOLVED}-linux-x64.tar.xz + ${NODE_MIRROR}/${RESOLVED}/node-${RESOLVED}-linux-x64.tar.xz + https://nodejs.org/dist/${RESOLVED}/node-${RESOLVED}-linux-x64.tar.xz + " fi + DOWNLOADED=0 for URL in $URLS; do + [ -n "$URL" ] || continue echo "[Node.js] Downloading $URL" - rm -rf "$TMP"/* 2>/dev/null || true - if curl -fsSL -L "$URL" | tar -xJ -C "$TMP" 2>/dev/null; then - SUB=$(find "$TMP" -mindepth 1 -maxdepth 1 -type d | head -1) - if [ -n "$SUB" ] && [ -x "$SUB/bin/node" ]; then - mv "$SUB" "$DEST" - rm -rf "$TMP" - echo "[Node.js] Installed $RESOLVED" - return 0 + rm -f "$ARCHIVE" + if curl -fsSL -L --connect-timeout 30 --max-time 300 -o "$ARCHIVE" "$URL"; then + if [ -s "$ARCHIVE" ]; then + DOWNLOADED=1 + break fi fi echo "[Node.js] Failed: $URL" + rm -f "$ARCHIVE" done + [ "$DOWNLOADED" -eq 1 ] || { echo "[Node.js] all mirrors failed"; rm -rf "$TMP"; return 1; } + # xz is not always available; fallback to python3 tarfile // Logan.Li + if command -v xz >/dev/null 2>&1; then + xz -dc "$ARCHIVE" | tar -xC "$TMP" 2>/dev/null || true + fi + if [ ! -x "$TMP"/*/bin/node ] 2>/dev/null; then + python3 -c " +import tarfile, os +with tarfile.open('$ARCHIVE') as tf: + tf.extractall(path='$TMP', filter='fully_trusted') +" 2>/dev/null || true + fi + rm -f "$ARCHIVE" + SUB=$(find "$TMP" -mindepth 1 -maxdepth 1 -type d | head -1) + if [ -n "$SUB" ] && [ -x "$SUB/bin/node" ]; then + mv "$SUB" "$DEST" + rm -rf "$TMP" + echo "[Node.js] Installed $RESOLVED" + return 0 + fi + echo "[Node.js] extract failed" rm -rf "$TMP" return 1 } diff --git a/backend/static/.gitkeep b/backend/static/.gitkeep deleted file mode 100644 index e69de29..0000000