From 3d0f45f6a8ccd14835ffbec11d1aca319903b716 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E5=B0=8F=E7=99=BD?= <296015668@qq.com> Date: Mon, 2 Nov 2026 15:27:24 +0800 Subject: [PATCH] Update loongarch64 build (#10487) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update loongarch64 build Signed-off-by: 吴小白 <296015668@qq.com> * Update GlobalHotKeys --------- Signed-off-by: 吴小白 <296015668@qq.com> Co-authored-by: 2dust <31833384+2dust@users.noreply.github.com> --- .github/workflows/build-linux.yml | 314 +++++------------------------- package-debian-loong.sh | 2 + package-debian-riscv.sh | 0 package-debian.sh | 0 package-rhel-loong.sh | 8 +- package-rhel-riscv.sh | 0 package-rhel.sh | 0 7 files changed, 59 insertions(+), 265 deletions(-) mode change 100644 => 100755 package-debian-loong.sh mode change 100644 => 100755 package-debian-riscv.sh mode change 100644 => 100755 package-debian.sh mode change 100644 => 100755 package-rhel-loong.sh mode change 100644 => 100755 package-rhel-riscv.sh mode change 100644 => 100755 package-rhel.sh diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml index c65e311d..fa631792 100644 --- a/.github/workflows/build-linux.yml +++ b/.github/workflows/build-linux.yml @@ -221,149 +221,45 @@ jobs: deb-loong64: name: build and release deb loong64 if: (github.event_name == 'workflow_dispatch' && inputs.release_tag != '') || (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')) - runs-on: ubuntu-26.04-arm + runs-on: ubuntu-26.04 env: RELEASE_TAG: ${{ case(inputs.release_tag != '', inputs.release_tag, github.ref_name) }} - QCOW2_URL: https://github.com/xujiegb/debian-loong64-qcow2/releases/download/13.5/debian13-loong64.qcow2 - EFI_CODE_URL: https://github.com/xujiegb/debian-loong64-qcow2/releases/download/13.5/edk2-loongarch64-code.fd - EFI_VARS_URL: https://github.com/xujiegb/debian-loong64-qcow2/releases/download/13.5/edk2-loongarch64-vars.fd - QCOW2_IMAGE: debian13-loong64.qcow2 - EFI_CODE: edk2-loongarch64-code.fd - EFI_VARS: edk2-loongarch64-vars.fd - QEMU_VERSION: 10.2.4 + DOCKER_IMAGE: ghcr.io/loong64/debian:trixie + steps: - - name: Prepare host tools - shell: bash - run: | - set -euo pipefail - sudo apt-get update - sudo apt-get install -y git rsync qemu-utils qemu-system-common expect wget curl ca-certificates libfdt1 libglib2.0-0 libpixman-1-0 libslirp0 virtiofsd - sudo ln -sf /usr/libexec/virtiofsd /usr/local/bin/virtiofsd - virtiofsd --version || virtiofsd --help | head - - name: Host clone repo - shell: bash - env: { GITHUB_TOKEN: "${{ github.token }}" } - run: | - set -euo pipefail - rm -rf repo - git clone --no-single-branch --tags "https://x-access-token:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git" repo - - name: Download QEMU prebuild - run: | - set -euo pipefail - wget -O qemu-linux-arm64-v8.2.tar.gz "https://github.com/xujiegb/qemu-linux-prebuild/releases/download/${QEMU_VERSION}/qemu-linux-arm64-v8.2.tar.gz" - tar -xzf qemu-linux-arm64-v8.2.tar.gz - mkdir -p "$HOME/qemu-install" - rsync -a qemu-linux-arm64-v8.2/ "$HOME/qemu-install/" - "$HOME/qemu-install/bin/qemu-system-loongarch64" --version - - name: Download loong64 qcow2 and EFI firmware - shell: bash - run: | - set -euo pipefail - wget -O "$QCOW2_IMAGE" "$QCOW2_URL" - wget -O "$EFI_CODE" "$EFI_CODE_URL" - wget -O "$EFI_VARS" "$EFI_VARS_URL" - qemu-img info "$QCOW2_IMAGE" - - name: Build loong64 DEB in VM through serial console + - name: Checkout repo + uses: actions/checkout@v6 + with: + submodules: recursive + fetch-depth: 0 + - name: Setup QEMU + uses: docker/setup-qemu-action@v4 + - name: Package DEB (Debian-family) shell: bash timeout-minutes: 180 env: { RELEASE_TAG: "${{ env.RELEASE_TAG }}" } run: | set -euo pipefail - mkdir -p "$GITHUB_WORKSPACE/dist/deb-loong64" - - export VIRTIOFSD_SOCKET="$RUNNER_TEMP/virtiofs-deb-loong64.sock" - rm -f "$VIRTIOFSD_SOCKET" - - sudo virtiofsd --socket-path="$VIRTIOFSD_SOCKET" --shared-dir="$GITHUB_WORKSPACE" --cache=auto & - - VIRTIOFSD_PID=$! - trap 'sudo kill "$VIRTIOFSD_PID" 2>/dev/null || true; rm -f "$VIRTIOFSD_SOCKET"' EXIT - - for i in {1..100}; do - [[ -S "$VIRTIOFSD_SOCKET" ]] && break - sleep 0.1 - done - - [[ -S "$VIRTIOFSD_SOCKET" ]] || { echo "virtiofsd socket not created"; exit 1; } - sudo chown "$USER:$(id -gn)" "$VIRTIOFSD_SOCKET" || true - sudo chmod 660 "$VIRTIOFSD_SOCKET" || true - expect <<'EOF' - log_user 1 - set timeout -1 - set release_tag $env(RELEASE_TAG) - set qemu_bin "$env(HOME)/qemu-install/bin/qemu-system-loongarch64" - set qemu_rom_dir "$env(HOME)/qemu-install/share/qemu" - set virtiofs_socket $env(VIRTIOFSD_SOCKET) - set qcow2 $env(QCOW2_IMAGE) - set efi_code $env(EFI_CODE) - set efi_vars $env(EFI_VARS) - proc wait_prompt {} { - expect { - -re "__CI_PROMPT__# " {} - timeout { exit 1 } - eof { exit 1 } - } - } - proc run_cmd {cmd} { - send -- "$cmd\r" - wait_prompt - } - spawn $qemu_bin \ - -L $qemu_rom_dir \ - -machine virt \ - -accel tcg,thread=multi,tb-size=2048 \ - -cpu la464 \ - -m 9216 \ - -object memory-backend-memfd,id=mem0,size=9216M,share=on \ - -numa node,memdev=mem0 \ - -smp 4 \ - -drive if=pflash,format=raw,unit=0,file=$efi_code,readonly=on \ - -drive if=pflash,format=raw,unit=1,file=$efi_vars \ - -device virtio-blk-pci,drive=hd0,bootindex=1 \ - -drive if=none,media=disk,id=hd0,file=$qcow2,format=qcow2 \ - -netdev user,id=net0 \ - -device virtio-net-pci-non-transitional,netdev=net0 \ - -chardev socket,id=charfs0,path=$virtiofs_socket \ - -device vhost-user-fs-pci,chardev=charfs0,tag=workspace \ - -display none \ - -serial stdio \ - -monitor none - expect -re "login:|debian login:" - send -- "root\r" - expect -re "Password:|密码:|密码:" - send -- "password\r" - expect { - -re "# " {} - timeout { exit 1 } - eof { exit 1 } - } - send -- "export TERM=dumb; export PS1='__CI_PROMPT__# '\r" - wait_prompt - run_cmd "mkdir -p /workspace" - run_cmd "mount -t virtiofs workspace /workspace" - run_cmd "IFACE=\$(ip -o link show | awk -F': ' '\$2 != \"lo\" {print \$2; exit}') ; ip link set \$IFACE up || true" - run_cmd "dhclient \$IFACE || true" - run_cmd "printf 'nameserver 10.0.2.3\nnameserver 1.1.1.1\n' >/etc/resolv.conf" - run_cmd "apt-get update || apt-get update || apt-get update" - run_cmd "DEBIAN_FRONTEND=noninteractive apt-get install -y sudo git rsync findutils tar gzip unzip which curl jq wget file ca-certificates desktop-file-utils xdg-utils fakeroot dpkg-dev gcc make libc6-dev libgcc-s1 libstdc++6 zlib1g libatomic1 fuse3" - run_cmd "rm -rf /root/v2rayN-src" - run_cmd "rsync -a --info=progress2 /workspace/repo/ /root/v2rayN-src/" - run_cmd "cd /root/v2rayN-src && git config --global --add safe.directory /root/v2rayN-src" - run_cmd "cd /root/v2rayN-src && chmod 755 package-debian-loong.sh" - send -- "cd /root/v2rayN-src; cat >/tmp/run-loong-build.sh <<'SCRIPT'\nset +e\nset -o pipefail\nbash -x ./package-debian-loong.sh \"\$RELEASE_TAG\" 2>&1 | tee /tmp/build.log\nrc=\$?\nmkdir -p /workspace/dist/deb-loong64\ncp -av /root/debbuild/*.deb /workspace/dist/deb-loong64/ 2>/dev/null || true\necho __BUILD_DONE__\$rc\nSCRIPT\nRELEASE_TAG=\"$release_tag\" bash /tmp/run-loong-build.sh\r" - expect { - -re "__BUILD_DONE__0" { send -- "poweroff\r" } - default { exit 1 } - } - EOF - - name: Collect DEBs - shell: bash + docker run --rm \ + --privileged \ + --platform linux/loong64 \ + --env DEBIAN_FRONTEND=noninteractive \ + --env DOTNET_EnableWriteXorExecute=0 \ + --volume "${{ github.workspace }}:/root/v2rayN-src" \ + --volume "$HOME/debbuild:/root/debbuild" \ + --workdir /root/v2rayN-src \ + "$DOCKER_IMAGE" bash -c " + apt-get update && \ + apt-get install -y sudo git rsync findutils tar gzip unzip which curl jq wget file ca-certificates desktop-file-utils xdg-utils fakeroot dpkg-dev gcc make libc6-dev libgcc-s1 libstdc++6 zlib1g libatomic1 && \ + git config --global --add safe.directory /root/v2rayN-src && \ + ./package-debian-loong.sh ${RELEASE_TAG}" + - name: Collect DEBs into workspace run: | - set -euo pipefail mkdir -p "$GITHUB_WORKSPACE/dist/deb-loong64" + rsync -av "$HOME/debbuild/" "$GITHUB_WORKSPACE/dist/deb-loong64/" || true find "$GITHUB_WORKSPACE/dist/deb-loong64" -name "*.deb" -exec mv {} "$GITHUB_WORKSPACE/dist/deb-loong64/v2rayN-linux-loong64.deb" \; || true echo "==== Dist tree ====" - ls -R "$GITHUB_WORKSPACE/dist/deb-loong64" + ls -R "$GITHUB_WORKSPACE/dist/deb-loong64" || true - name: Upload DEB artifact uses: actions/upload-artifact@v7 with: { name: release-deb-loong64, path: "dist/deb-loong64/**/*.deb", if-no-files-found: error } @@ -371,149 +267,43 @@ jobs: rpm-loong64: name: build and release rpm loong64 if: (github.event_name == 'workflow_dispatch' && inputs.release_tag != '') || (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')) - runs-on: ubuntu-26.04-arm + runs-on: ubuntu-26.04 env: RELEASE_TAG: ${{ case(inputs.release_tag != '', inputs.release_tag, github.ref_name) }} - QCOW2_URL: https://github.com/xujiegb/fedora-loong64-qcow2/releases/download/43/fedora43-loong64.qcow2 - EFI_CODE_URL: https://github.com/xujiegb/fedora-loong64-qcow2/releases/download/43/edk2-loongarch64-code.fd - EFI_VARS_URL: https://github.com/xujiegb/fedora-loong64-qcow2/releases/download/43/edk2-loongarch64-vars.fd - QCOW2_IMAGE: fedora43-loong64.qcow2 - EFI_CODE: edk2-loongarch64-code.fd - EFI_VARS: edk2-loongarch64-vars.fd - QEMU_VERSION: 10.2.4 + DOCKER_IMAGE: ghcr.io/fedora-remix-loongarch/mini-image:f43 steps: - - name: Prepare host tools - shell: bash - run: | - set -euo pipefail - sudo apt-get update - sudo apt-get install -y git rsync qemu-utils qemu-system-common expect wget curl ca-certificates libfdt1 libglib2.0-0 libpixman-1-0 libslirp0 virtiofsd - sudo ln -sf /usr/libexec/virtiofsd /usr/local/bin/virtiofsd - virtiofsd --version || virtiofsd --help | head - - name: Host clone repo - shell: bash - env: { GITHUB_TOKEN: "${{ github.token }}" } - run: | - set -euo pipefail - rm -rf repo - git clone --no-single-branch --tags "https://x-access-token:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git" repo - - name: Download QEMU prebuild - run: | - set -euo pipefail - wget -O qemu-linux-arm64-v8.2.tar.gz "https://github.com/xujiegb/qemu-linux-prebuild/releases/download/${QEMU_VERSION}/qemu-linux-arm64-v8.2.tar.gz" - tar -xzf qemu-linux-arm64-v8.2.tar.gz - mkdir -p "$HOME/qemu-install" - rsync -a qemu-linux-arm64-v8.2/ "$HOME/qemu-install/" - "$HOME/qemu-install/bin/qemu-system-loongarch64" --version - - name: Download loong64 qcow2 and EFI firmware - shell: bash - run: | - set -euo pipefail - wget -O "$QCOW2_IMAGE" "$QCOW2_URL" - wget -O "$EFI_CODE" "$EFI_CODE_URL" - wget -O "$EFI_VARS" "$EFI_VARS_URL" - qemu-img info "$QCOW2_IMAGE" - - name: Build loong64 RPM in VM through serial console + - name: Checkout repo + uses: actions/checkout@v6 + with: + submodules: recursive + fetch-depth: 0 + - name: Setup QEMU + uses: docker/setup-qemu-action@v4 + - name: Build loong64 RPM shell: bash timeout-minutes: 180 env: { RELEASE_TAG: "${{ env.RELEASE_TAG }}" } run: | set -euo pipefail - mkdir -p "$GITHUB_WORKSPACE/dist/rpm-loong64" - - export VIRTIOFSD_SOCKET="$RUNNER_TEMP/virtiofs-rpm-loong64.sock" - rm -f "$VIRTIOFSD_SOCKET" - - sudo virtiofsd --socket-path="$VIRTIOFSD_SOCKET" --shared-dir="$GITHUB_WORKSPACE" --cache=auto & - - VIRTIOFSD_PID=$! - trap 'sudo kill "$VIRTIOFSD_PID" 2>/dev/null || true; rm -f "$VIRTIOFSD_SOCKET"' EXIT - - for i in {1..100}; do - [[ -S "$VIRTIOFSD_SOCKET" ]] && break - sleep 0.1 - done - - [[ -S "$VIRTIOFSD_SOCKET" ]] || { echo "virtiofsd socket not created"; exit 1; } - sudo chown "$USER:$(id -gn)" "$VIRTIOFSD_SOCKET" || true - sudo chmod 660 "$VIRTIOFSD_SOCKET" || true - expect <<'EOF' - log_user 1 - set timeout -1 - set release_tag $env(RELEASE_TAG) - set qemu_bin "$env(HOME)/qemu-install/bin/qemu-system-loongarch64" - set qemu_rom_dir "$env(HOME)/qemu-install/share/qemu" - set virtiofs_socket $env(VIRTIOFSD_SOCKET) - set qcow2 $env(QCOW2_IMAGE) - set efi_code $env(EFI_CODE) - set efi_vars $env(EFI_VARS) - proc wait_prompt {} { - expect { - -re "__CI_PROMPT__# " {} - timeout { exit 1 } - eof { exit 1 } - } - } - proc run_cmd {cmd} { - send -- "$cmd\r" - wait_prompt - } - spawn $qemu_bin \ - -L $qemu_rom_dir \ - -machine virt \ - -accel tcg,thread=multi,tb-size=2048 \ - -cpu la464 \ - -m 9216 \ - -object memory-backend-memfd,id=mem0,size=9216M,share=on \ - -numa node,memdev=mem0 \ - -smp 4 \ - -drive if=pflash,format=raw,unit=0,file=$efi_code,readonly=on \ - -drive if=pflash,format=raw,unit=1,file=$efi_vars \ - -device virtio-blk-pci,drive=hd0,bootindex=1 \ - -drive if=none,media=disk,id=hd0,file=$qcow2,format=qcow2 \ - -netdev user,id=net0 \ - -device virtio-net-pci-non-transitional,netdev=net0 \ - -chardev socket,id=charfs0,path=$virtiofs_socket \ - -device vhost-user-fs-pci,chardev=charfs0,tag=workspace \ - -display none \ - -serial stdio \ - -monitor none - expect -re "login:|fedora login:" - send -- "root\r" - expect -re "Password:|密码:|密码:" - send -- "password\r" - expect { - -re "# " {} - timeout { exit 1 } - eof { exit 1 } - } - send -- "export TERM=dumb; export PS1='__CI_PROMPT__# '\r" - wait_prompt - run_cmd "mkdir -p /workspace" - run_cmd "mount -t virtiofs workspace /workspace" - run_cmd "IFACE=\$(ip -o link show | awk -F': ' '\$2 != \"lo\" {print \$2; exit}') ; ip link set \$IFACE up || true" - run_cmd "dhclient \$IFACE || true" - run_cmd "printf 'nameserver 10.0.2.3\nnameserver 1.1.1.1\n' >/etc/resolv.conf" - run_cmd "dnf -y makecache || dnf -y makecache || dnf -y makecache" - run_cmd "dnf -y install sudo git rpm-build rpmdevtools dnf-plugins-core rsync findutils tar gzip unzip which curl jq file ca-certificates fuse3 --nogpgcheck" - run_cmd "rm -rf /root/v2rayN-src" - run_cmd "rsync -a --info=progress2 /workspace/repo/ /root/v2rayN-src/" - run_cmd "cd /root/v2rayN-src && git config --global --add safe.directory /root/v2rayN-src" - run_cmd "cd /root/v2rayN-src && chmod 755 package-rhel-loong.sh" - send -- "cd /root/v2rayN-src; cat >/tmp/run-loong-rpm-build.sh <<'SCRIPT'\nset +e\nset -o pipefail\nbash -x ./package-rhel-loong.sh \"\$RELEASE_TAG\" 2>&1 | tee /tmp/build.log\nrc=\$?\nmkdir -p /workspace/dist/rpm-loong64\nfind /root/rpmbuild/RPMS -name '*.rpm' -exec cp -av {} /workspace/dist/rpm-loong64/ \\; 2>/dev/null || true\necho __BUILD_DONE__\$rc\nSCRIPT\nRELEASE_TAG=\"$release_tag\" bash /tmp/run-loong-rpm-build.sh\r" - expect { - -re "__BUILD_DONE__0" { send -- "poweroff\r" } - default { exit 1 } - } - EOF - - name: Collect RPMs - shell: bash + docker run --rm \ + --privileged \ + --platform linux/loong64 \ + --env DOTNET_EnableWriteXorExecute=0 \ + --volume "${{ github.workspace }}:/root/v2rayN-src" \ + --volume "$HOME/rpmbuild/RPMS:/root/rpmbuild/RPMS" \ + --workdir /root/v2rayN-src \ + "$DOCKER_IMAGE" bash -c " + dnf -y makecache && \ + dnf -y install sudo git rpm-build rpmdevtools dnf-plugins-core rsync findutils tar gzip unzip which curl jq file ca-certificates fuse3 && \ + git config --global --add safe.directory /root/v2rayN-src && \ + ./package-rhel-loong.sh ${RELEASE_TAG}" + - name: Collect RPMs into workspace run: | - set -euo pipefail mkdir -p "$GITHUB_WORKSPACE/dist/rpm-loong64" + rsync -av "$HOME/rpmbuild/RPMS/" "$GITHUB_WORKSPACE/dist/rpm-loong64/" || true find "$GITHUB_WORKSPACE/dist/rpm-loong64" -name "*.loongarch64.rpm" -exec mv {} "$GITHUB_WORKSPACE/dist/rpm-loong64/v2rayN-linux-rhel-loong64.rpm" \; || true echo "==== Dist tree ====" - ls -R "$GITHUB_WORKSPACE/dist/rpm-loong64" + ls -R "$GITHUB_WORKSPACE/dist/rpm-loong64" || true - name: Upload RPM artifact uses: actions/upload-artifact@v7 with: { name: release-rpm-loong64, path: "dist/rpm-loong64/**/*.rpm", if-no-files-found: error } diff --git a/package-debian-loong.sh b/package-debian-loong.sh old mode 100644 new mode 100755 index f48eb40d..0e08697f --- a/package-debian-loong.sh +++ b/package-debian-loong.sh @@ -220,6 +220,8 @@ apply_channel_or_keep() { VERSION="${VERSION#v}" return 0 fi + git remote add upstream https://github.com/2dust/v2rayN || true + git fetch upstream echo "[*] Resolving ${ch} tag from GitHub releases..." diff --git a/package-debian-riscv.sh b/package-debian-riscv.sh old mode 100644 new mode 100755 diff --git a/package-debian.sh b/package-debian.sh old mode 100644 new mode 100755 diff --git a/package-rhel-loong.sh b/package-rhel-loong.sh old mode 100644 new mode 100755 index a0222ab3..5461ed0b --- a/package-rhel-loong.sh +++ b/package-rhel-loong.sh @@ -73,12 +73,12 @@ detect_environment() { HOST_ARCH="$(uname -m)" case "$OS_ID" in - rhel|rocky|almalinux|fedora|centos) + rhel|rocky|almalinux|fedora|centos|anolis) echo "Detected supported system: ${OS_NAME:-$OS_ID} ${OS_VERSION_ID:-}" ;; *) die "Unsupported system: ${OS_NAME:-unknown} (${OS_ID:-unknown}). -This script only supports: RHEL / Rocky / AlmaLinux / Fedora / CentOS." +This script only supports: RHEL / Rocky / AlmaLinux / Fedora / CentOS / Anolis OS." ;; esac @@ -216,6 +216,8 @@ apply_channel_or_keep() { VERSION="${VERSION#v}" return 0 fi + git remote add upstream https://github.com/2dust/v2rayN || true + git fetch upstream echo "[*] Resolving ${ch} tag from GitHub releases..." @@ -521,7 +523,7 @@ Requires: freetype >= 2.13 %description v2rayN Linux for Red Hat Enterprise Linux Support vless / vmess / Trojan / http / socks / Anytls / Hysteria2 / Shadowsocks / tuic / WireGuard -Support Red Hat Enterprise Linux / Fedora Linux / Rocky Linux / AlmaLinux / CentOS +Support Red Hat Enterprise Linux / Fedora Linux / Rocky Linux / AlmaLinux / CentOS / Anolis OS For more information, Please visit our website https://github.com/2dust/v2rayN diff --git a/package-rhel-riscv.sh b/package-rhel-riscv.sh old mode 100644 new mode 100755 diff --git a/package-rhel.sh b/package-rhel.sh old mode 100644 new mode 100755