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/android.yml b/.gitea/workflows/android.yml index 477a450..94c99f6 100644 --- a/.gitea/workflows/android.yml +++ b/.gitea/workflows/android.yml @@ -7,6 +7,7 @@ on: - main paths: - ".gitea/workflows/android.yml" + - ".gitea/actions/prepare-ram-ci/**" env: # Change only this value to build another RustDesk tag/release. @@ -20,9 +21,23 @@ env: jobs: build-android: name: Build RustDesk Android ARM64 - runs-on: rustdesk-android + runs-on: ci-linux-builder + + defaults: + run: + shell: bash + + 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 + # ----------------------------------------------------------------------- # RustDesk source # ----------------------------------------------------------------------- @@ -249,7 +264,13 @@ jobs: [ -n "${preferred}" ] && [ "$(flutter_version "${preferred}")" = "${requested}" ] ); then - root="${preferred}" + # Flutter writes into its SDK cache and receives source patches. + # Copy the image SDK into RAM before using it. + root="${fallback}" + if [ ! -d "${root}" ]; then + mkdir -p "$(dirname "${root}")" + cp -a "${preferred}" "${root}" + fi else root="${fallback}" @@ -397,8 +418,17 @@ jobs: echo echo "=== vcpkg ===" - test -n "${VCPKG_ROOT:-}" - test -d "${VCPKG_ROOT}/.git" + # Reuse the image checkout and prebuilt libraries in RAM when present. + image_vcpkg="${VCPKG_ROOT:-}" + export VCPKG_ROOT="${CI_ROOT}/vcpkg" + if [ ! -d "${VCPKG_ROOT}/.git" ]; then + if [ -n "${image_vcpkg}" ] && [ -d "${image_vcpkg}/.git" ]; then + cp -a "${image_vcpkg}" "${VCPKG_ROOT}" + else + git clone https://github.com/microsoft/vcpkg.git "${VCPKG_ROOT}" + fi + fi + echo "VCPKG_ROOT=${VCPKG_ROOT}" >> "${GITHUB_ENV}" current_vcpkg="$( git -C "${VCPKG_ROOT}" rev-parse HEAD