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"