setup-sccache

  1#!/usr/bin/env bash
  2
  3set -euo pipefail
  4
  5SCCACHE_VERSION="v0.10.0"
  6SCCACHE_DIR="./target/sccache"
  7
  8install_sccache() {
  9    mkdir -p "$SCCACHE_DIR"
 10
 11    if [[ -x "${SCCACHE_DIR}/sccache" ]]; then
 12        echo "sccache already cached: $("${SCCACHE_DIR}/sccache" --version)"
 13    else
 14        echo "Installing sccache ${SCCACHE_VERSION} from GitHub releases..."
 15
 16        local os arch archive basename
 17        os="$(uname -s)"
 18        arch="$(uname -m)"
 19
 20        case "${os}-${arch}" in
 21            Darwin-arm64)
 22                archive="sccache-${SCCACHE_VERSION}-aarch64-apple-darwin.tar.gz"
 23                ;;
 24            Darwin-x86_64)
 25                archive="sccache-${SCCACHE_VERSION}-x86_64-apple-darwin.tar.gz"
 26                ;;
 27            Linux-x86_64)
 28                archive="sccache-${SCCACHE_VERSION}-x86_64-unknown-linux-musl.tar.gz"
 29                ;;
 30            Linux-aarch64)
 31                archive="sccache-${SCCACHE_VERSION}-aarch64-unknown-linux-musl.tar.gz"
 32                ;;
 33            *)
 34                echo "Unsupported platform: ${os}-${arch}"
 35                exit 1
 36                ;;
 37        esac
 38
 39        basename="${archive%.tar.gz}"
 40        curl -fsSL "https://github.com/mozilla/sccache/releases/download/${SCCACHE_VERSION}/${archive}" | tar xz
 41        mv "${basename}/sccache" "${SCCACHE_DIR}/"
 42        rm -rf "${basename}"
 43        echo "Installed sccache: $("${SCCACHE_DIR}/sccache" --version)"
 44    fi
 45
 46    if [[ -n "${GITHUB_PATH:-}" ]]; then
 47        echo "$(pwd)/${SCCACHE_DIR}" >> "$GITHUB_PATH"
 48    fi
 49    export PATH="$(pwd)/${SCCACHE_DIR}:${PATH}"
 50}
 51
 52configure_sccache() {
 53    if [[ -z "${R2_ACCOUNT_ID:-}" ]]; then
 54        echo "R2_ACCOUNT_ID not set, skipping sccache configuration"
 55        return
 56    fi
 57
 58    echo "Configuring sccache with Cloudflare R2..."
 59
 60    local bucket="${SCCACHE_BUCKET:-sccache-zed}"
 61    local key_prefix="${SCCACHE_KEY_PREFIX:-sccache/}"
 62    local base_dir="${GITHUB_WORKSPACE:-$(pwd)}"
 63
 64    # Set in current process
 65    export SCCACHE_ENDPOINT="https://${R2_ACCOUNT_ID}.r2.cloudflarestorage.com"
 66    export SCCACHE_BUCKET="${bucket}"
 67    export SCCACHE_REGION="auto"
 68    export SCCACHE_S3_KEY_PREFIX="${key_prefix}"
 69    export SCCACHE_BASEDIR="${base_dir}"
 70    export AWS_ACCESS_KEY_ID="${R2_ACCESS_KEY_ID}"
 71    export AWS_SECRET_ACCESS_KEY="${R2_SECRET_ACCESS_KEY}"
 72    export RUSTC_WRAPPER="sccache"
 73
 74    # Also write to GITHUB_ENV for subsequent steps
 75    if [[ -n "${GITHUB_ENV:-}" ]]; then
 76        {
 77            echo "SCCACHE_ENDPOINT=${SCCACHE_ENDPOINT}"
 78            echo "SCCACHE_BUCKET=${SCCACHE_BUCKET}"
 79            echo "SCCACHE_REGION=${SCCACHE_REGION}"
 80            echo "SCCACHE_S3_KEY_PREFIX=${SCCACHE_S3_KEY_PREFIX}"
 81            echo "SCCACHE_BASEDIR=${SCCACHE_BASEDIR}"
 82            echo "AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}"
 83            echo "AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}"
 84            echo "RUSTC_WRAPPER=${RUSTC_WRAPPER}"
 85        } >> "$GITHUB_ENV"
 86    fi
 87
 88    echo "✓ sccache configured with Cloudflare R2 (bucket: ${bucket})"
 89}
 90
 91show_config() {
 92    echo "=== sccache configuration ==="
 93    echo "sccache version: $(sccache --version)"
 94    echo "RUSTC_WRAPPER: ${RUSTC_WRAPPER:-<not set>}"
 95    echo "SCCACHE_BUCKET: ${SCCACHE_BUCKET:-<not set>}"
 96    echo "SCCACHE_ENDPOINT: ${SCCACHE_ENDPOINT:-<not set>}"
 97    echo "SCCACHE_REGION: ${SCCACHE_REGION:-<not set>}"
 98    echo "SCCACHE_S3_KEY_PREFIX: ${SCCACHE_S3_KEY_PREFIX:-<not set>}"
 99    echo "SCCACHE_BASEDIR: ${SCCACHE_BASEDIR:-<not set>}"
100    if [[ -n "${AWS_ACCESS_KEY_ID:-}" ]]; then
101        echo "AWS_ACCESS_KEY_ID: <set, length=${#AWS_ACCESS_KEY_ID}>"
102    else
103        echo "AWS_ACCESS_KEY_ID: <not set>"
104    fi
105    if [[ -n "${AWS_SECRET_ACCESS_KEY:-}" ]]; then
106        echo "AWS_SECRET_ACCESS_KEY: <set>"
107    else
108        echo "AWS_SECRET_ACCESS_KEY: <not set>"
109    fi
110    echo "=== sccache stats ==="
111    sccache --show-stats || true
112}
113
114install_sccache
115configure_sccache
116show_config