From 2db7d1a842e1dbfb71847c3a19a720df440cf386 Mon Sep 17 00:00:00 2001 From: GandC Date: Sat, 3 Oct 2026 23:28:58 +0300 Subject: [PATCH] move to RAM build --- .gitea/actions/prepare-ram-ci/action.yml | 102 +++++++++++++++++++++++ .gitea/workflows/windows.yml | 38 +++++++-- 2 files changed, 131 insertions(+), 9 deletions(-) create mode 100644 .gitea/actions/prepare-ram-ci/action.yml diff --git a/.gitea/actions/prepare-ram-ci/action.yml b/.gitea/actions/prepare-ram-ci/action.yml new file mode 100644 index 0000000..f76652f --- /dev/null +++ b/.gitea/actions/prepare-ram-ci/action.yml @@ -0,0 +1,102 @@ +name: Prepare RAM CI environment +description: Keep RustDesk Linux build data and package caches in the RAM workspace + +runs: + using: composite + steps: + - name: Configure RAM CI environment + shell: bash + run: | + set -euo pipefail + set +x + + # The runner must mount its workspace on executable tmpfs, as for Fluxer. + case "$(findmnt -n -o FSTYPE -T "$GITHUB_WORKSPACE")" in + tmpfs|ramfs) ;; + *) echo "ERROR: GITHUB_WORKSPACE must be backed by RAM (tmpfs/ramfs)."; exit 1 ;; + esac + + normalize_url() { + local value="$1" + value="${value//$'\r'/}" + value="${value//$'\n'/}" + case "$value" in + \"*\") value="${value#\"}"; value="${value%\"}" ;; + \'*\') value="${value#\'}"; value="${value%\'}" ;; + esac + test -n "$value" || { echo "ERROR: Nexus URL is empty" >&2; return 1; } + printf '%s/' "${value%/}" + } + + NEXUS_CARGO_URL="$(normalize_url "${NEXUS_CARGO_URL:-}")" + NEXUS_MAVEN_URL="$(normalize_url "${NEXUS_MAVEN_URL:-}")" + + # Preserve rustup and its proxies before moving HOME and Cargo caches. + # Unlike Fluxer, RustDesk selects multiple toolchains from upstream CI. + RUSTUP_HOME="${RUSTUP_HOME:-$HOME/.rustup}" + RUSTUP_EXE="$(command -v rustup)" + RUSTUP_BIN="$(dirname "$RUSTUP_EXE")" + CI_ROOT="$GITHUB_WORKSPACE/.ci" + mkdir -p "$CI_ROOT"/{home,tmp,cargo/bin,pub-cache,gradle/init.d,xdg-cache,xdg-config,xdg-data,vcpkg-cache,vcpkg-downloads} + chmod 700 "$CI_ROOT/home" "$CI_ROOT/cargo" "$CI_ROOT/gradle" + + # Fail before cloning/building when the RAM mount is noexec. + printf '#!/bin/sh\nexit 0\n' > "$CI_ROOT/tmp/check-exec" + chmod +x "$CI_ROOT/tmp/check-exec" + "$CI_ROOT/tmp/check-exec" + rm "$CI_ROOT/tmp/check-exec" + + cat > "$CI_ROOT/cargo/config.toml" < "$CI_ROOT/gradle/init.d/00-nexus.init.gradle" <<'EOF_GRADLE' + def nexusUrl = System.getenv("NEXUS_MAVEN_URL") + if (nexusUrl == null || nexusUrl.isBlank()) { + throw new GradleException("NEXUS_MAVEN_URL is not configured") + } + def configureNexusRepository = { repositories -> + repositories.maven { + name = "CI_NEXUS" + url = uri(nexusUrl) + allowInsecureProtocol = nexusUrl.startsWith("http://") + } + } + gradle.beforeSettings { settings -> + configureNexusRepository(settings.pluginManagement.repositories) + configureNexusRepository(settings.dependencyResolutionManagement.repositories) + } + EOF_GRADLE + + { + echo "CI_ROOT=$CI_ROOT" + echo "HOME=$CI_ROOT/home" + echo "TMPDIR=$CI_ROOT/tmp" + echo "TMP=$CI_ROOT/tmp" + echo "TEMP=$CI_ROOT/tmp" + echo "XDG_CACHE_HOME=$CI_ROOT/xdg-cache" + echo "XDG_CONFIG_HOME=$CI_ROOT/xdg-config" + echo "XDG_DATA_HOME=$CI_ROOT/xdg-data" + echo "CARGO_HOME=$CI_ROOT/cargo" + # Upstream scripts expect rustdesk/target; do not move it elsewhere. + echo "CARGO_TARGET_DIR=$GITHUB_WORKSPACE/rustdesk/target" + echo "RUSTUP_HOME=$RUSTUP_HOME" + echo "PUB_CACHE=$CI_ROOT/pub-cache" + echo "GRADLE_USER_HOME=$CI_ROOT/gradle" + printf 'JAVA_TOOL_OPTIONS=%s -Djava.io.tmpdir="%s"\n' "${JAVA_TOOL_OPTIONS:-}" "$CI_ROOT/tmp" + echo "VCPKG_DEFAULT_BINARY_CACHE=$CI_ROOT/vcpkg-cache" + echo "VCPKG_DOWNLOADS=$CI_ROOT/vcpkg-downloads" + echo "NEXUS_CARGO_URL=$NEXUS_CARGO_URL" + echo "NEXUS_MAVEN_URL=$NEXUS_MAVEN_URL" + } >> "$GITHUB_ENV" + { + echo "$RUSTUP_BIN" + echo "$CI_ROOT/cargo/bin" + } >> "$GITHUB_PATH" + + df -h "$GITHUB_WORKSPACE" diff --git a/.gitea/workflows/windows.yml b/.gitea/workflows/windows.yml index 40690b4..791546b 100644 --- a/.gitea/workflows/windows.yml +++ b/.gitea/workflows/windows.yml @@ -14,9 +14,19 @@ env: jobs: resolve-config: name: Resolve upstream build config - runs-on: rustdesk-android + runs-on: ci-linux-builder + + env: + NEXUS_CARGO_URL: ${{ secrets.NEXUS_CARGO_URL }} + NEXUS_MAVEN_URL: ${{ secrets.NEXUS_MAVEN_URL }} steps: + - name: Checkout CI repository + uses: actions/checkout@v4 + + - name: Prepare RAM CI environment + uses: ./.gitea/actions/prepare-ram-ci + - name: Clone selected RustDesk tag shell: bash run: | @@ -112,9 +122,19 @@ jobs: generate-bridge: name: Generate Flutter Rust Bridge needs: [resolve-config] - runs-on: rustdesk-android + runs-on: ci-linux-builder + + env: + NEXUS_CARGO_URL: ${{ secrets.NEXUS_CARGO_URL }} + NEXUS_MAVEN_URL: ${{ secrets.NEXUS_MAVEN_URL }} steps: + - name: Checkout CI repository + uses: actions/checkout@v4 + + - name: Prepare RAM CI environment + uses: ./.gitea/actions/prepare-ram-ci + - name: Download build config uses: https://github.com/actions/download-artifact@v8 with: @@ -158,12 +178,12 @@ jobs: export RUSTUP_TOOLCHAIN="${BRIDGE_RUST_VERSION}" echo "RUSTUP_TOOLCHAIN=${BRIDGE_RUST_VERSION}" >> "${GITHUB_ENV}" - if [ -x "/opt/flutter-${BRIDGE_FLUTTER_VERSION}/bin/flutter" ]; then - FLUTTER_DIR="/opt/flutter-${BRIDGE_FLUTTER_VERSION}" - else - FLUTTER_DIR="${HOME}/.cache/rustdesk/flutter-${BRIDGE_FLUTTER_VERSION}" - - if [ ! -x "${FLUTTER_DIR}/bin/flutter" ]; then + FLUTTER_DIR="${HOME}/.cache/rustdesk/flutter-${BRIDGE_FLUTTER_VERSION}" + if [ ! -x "${FLUTTER_DIR}/bin/flutter" ]; then + mkdir -p "$(dirname "${FLUTTER_DIR}")" + if [ -x "/opt/flutter-${BRIDGE_FLUTTER_VERSION}/bin/flutter" ]; then + cp -a "/opt/flutter-${BRIDGE_FLUTTER_VERSION}" "${FLUTTER_DIR}" + else rm -rf "${FLUTTER_DIR}" mkdir -p "$(dirname "${FLUTTER_DIR}")" @@ -177,7 +197,7 @@ jobs: git config --global --add safe.directory "${FLUTTER_DIR}" || true - export PATH="${FLUTTER_DIR}/bin:${HOME}/.cargo/bin:${PATH}" + export PATH="${FLUTTER_DIR}/bin:${CARGO_HOME}/bin:${PATH}" echo "${FLUTTER_DIR}/bin" >> "${GITHUB_PATH}" flutter config --no-analytics