name: Rust Setup + Cache description: Install Rust toolchain and cache cargo/rustup dependencies for Gitea Actions author: eric inputs: toolchain: description: Rust toolchain to install (e.g., stable, 1.75.0, nightly) default: stable required: false outputs: cache-hit: description: "Whether a cache entry was found" value: ${{ steps.cache.outputs.cache-hit }} runs: using: composite steps: # Gitea Actions does not have Cargo.lock by default (cargo generates it on first build), # and hashFiles() globs don't work reliably here. Use shell hashing instead. - name: Compute cache key id: cache-key shell: bash run: | # Hash both files; if Cargo.lock doesn't exist yet, only Cargo.toml is hashed HASH=$( (cat Cargo.toml 2>/dev/null || true; cat Cargo.lock 2>/dev/null || true) | sha256sum | cut -d' ' -f1) echo "hash=$HASH" >> $GITHUB_OUTPUT echo "fingerprint=$HASH" >> $GITHUB_ENV - name: Setup Rust shell: bash run: | # If toolchain was cached, rustup will skip download — install still runs for metadata curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \ | sh -s -- -y --default-toolchain ${{ inputs.toolchain }} # Add cargo bin to PATH for subsequent steps echo "$HOME/.cargo/bin" >> $GITHUB_PATH - name: Show sizes before cache shell: bash run: | echo "=== ~/.cargo ===" && du -sh ~/.cargo 2>/dev/null || echo "(empty)" echo "=== ~/.rustup ===" && du -sh ~/.rustup 2>/dev/null || echo "(empty)" - name: Save cache id: cache-save uses: https://gitea.com/actions/cache@v3 with: path: | ~/.cargo/registry ~/.cargo/git ~/.rustup/toolchains ~/.rustup/settings.toml target key: rust-linux-${{ steps.cache-key.outputs.hash }} save-always: true - name: Twirp probe via curl (debug) shell: bash env: ACTIONS_CACHE_URL: ${{ env.ACTIONS_CACHE_URL }} ACTIONS_RUNTIME_TOKEN: ${{ env.ACTIONS_RUNTIME_TOKEN }} ACTIONS_RESULTS_URL: ${{ env.ACTIONS_RESULTS_URL }} run: | echo "=== Cache env vars ===" echo "ACTIONS_CACHE_URL=$ACTIONS_CACHE_URL" echo "ACTIONS_RUNTIME_TOKEN len=${#ACTIONS_RUNTIME_TOKEN}" echo "ACTIONS_RESULTS_URL=$ACTIONS_RESULTS_URL" if [ -n "$ACTIONS_CACHE_URL" ]; then echo "=== Twirp probe (v1): GetCacheEntryDownloadURL ===" BODY=$(printf '{"key":"rust-linux-%s","restoreKeys":[],"version":"%s"}' "$HASH" "$HASH") RESP=$(curl -s -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ACTIONS_RUNTIME_TOKEN" \ "$ACTIONS_CACHE_URL/twirp/github.actions.results.api.v1.CacheService/GetCacheEntryDownloadURL" \ -d "$BODY" \ -w "\nHTTP_STATUS:%{http_code}" 2>&1) echo "$RESP" else echo "ACTIONS_CACHE_URL is empty" fi - name: Lookup same key immediately after save id: cache-lookup env: ACTIONS_CACHE_URL: ${{ env.ACTIONS_CACHE_URL }} ACTIONS_RUNTIME_TOKEN: ${{ env.ACTIONS_RUNTIME_TOKEN }} ACTIONS_CACHE_SERVICE_V2: "0" ACTIONS_RESULTS_URL: ${{ env.ACTIONS_RESULTS_URL }} uses: https://gitea.com/actions/cache@v3 with: path: ~/.cargo/registry key: rust-linux-${{ steps.cache-key.outputs.hash }} lookup-only: true - name: Show sizes after cache shell: bash run: | echo "=== ~/.cargo ===" && du -sh ~/.cargo 2>/dev/null || echo "(empty)" echo "=== ~/.rustup ===" && du -sh ~/.rustup 2>/dev/null || echo "(empty)" echo "save result: ${{ steps.cache-save.outputs.cache-hit }}" echo "lookup result: ${{ steps.cache-lookup.outputs.cache-hit }}" echo "ACTIONS_CACHE_URL=$ACTIONS_CACHE_URL"