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