setup-sccache.ps1

  1#Requires -Version 5.1
  2$ErrorActionPreference = "Stop"
  3
  4$SCCACHE_VERSION = "v0.10.0"
  5$SCCACHE_DIR = "./target/sccache"
  6
  7function Install-Sccache {
  8    New-Item -ItemType Directory -Path $SCCACHE_DIR -Force | Out-Null
  9
 10    $sccachePath = Join-Path $SCCACHE_DIR "sccache.exe"
 11
 12    if (Test-Path $sccachePath) {
 13        Write-Host "sccache already cached: $(& $sccachePath --version)"
 14    }
 15    else {
 16        Write-Host "Installing sccache ${SCCACHE_VERSION} from GitHub releases..."
 17
 18        $arch = if ([Environment]::Is64BitOperatingSystem) { "x86_64" } else { "i686" }
 19        $archive = "sccache-${SCCACHE_VERSION}-${arch}-pc-windows-msvc.zip"
 20        $basename = "sccache-${SCCACHE_VERSION}-${arch}-pc-windows-msvc"
 21        $url = "https://github.com/mozilla/sccache/releases/download/${SCCACHE_VERSION}/${archive}"
 22
 23        $tempDir = Join-Path $env:TEMP "sccache-install"
 24        New-Item -ItemType Directory -Path $tempDir -Force | Out-Null
 25
 26        try {
 27            $archivePath = Join-Path $tempDir $archive
 28            Invoke-WebRequest -Uri $url -OutFile $archivePath
 29            Expand-Archive -Path $archivePath -DestinationPath $tempDir
 30
 31            $extractedPath = Join-Path $tempDir $basename "sccache.exe"
 32            Move-Item -Path $extractedPath -Destination $sccachePath -Force
 33
 34            Write-Host "Installed sccache: $(& $sccachePath --version)"
 35        }
 36        finally {
 37            Remove-Item -Recurse -Force $tempDir -ErrorAction SilentlyContinue
 38        }
 39    }
 40
 41    $absolutePath = (Resolve-Path $SCCACHE_DIR).Path
 42    if ($env:GITHUB_PATH) {
 43        $absolutePath | Out-File -FilePath $env:GITHUB_PATH -Append -Encoding utf8
 44    }
 45    $env:PATH = "$absolutePath;$env:PATH"
 46}
 47
 48function Configure-Sccache {
 49    if (-not $env:R2_ACCOUNT_ID) {
 50        Write-Host "R2_ACCOUNT_ID not set, skipping sccache configuration"
 51        return
 52    }
 53
 54    Write-Host "Configuring sccache with Cloudflare R2..."
 55
 56    $bucket = if ($env:SCCACHE_BUCKET) { $env:SCCACHE_BUCKET } else { "sccache-zed" }
 57    $keyPrefix = if ($env:SCCACHE_KEY_PREFIX) { $env:SCCACHE_KEY_PREFIX } else { "sccache/" }
 58    $baseDir = if ($env:GITHUB_WORKSPACE) { $env:GITHUB_WORKSPACE } else { (Get-Location).Path }
 59
 60    # Set in current process
 61    $env:SCCACHE_ENDPOINT = "https://$($env:R2_ACCOUNT_ID).r2.cloudflarestorage.com"
 62    $env:SCCACHE_BUCKET = $bucket
 63    $env:SCCACHE_REGION = "auto"
 64    $env:SCCACHE_S3_KEY_PREFIX = $keyPrefix
 65    $env:SCCACHE_BASEDIR = $baseDir
 66    $env:AWS_ACCESS_KEY_ID = $env:R2_ACCESS_KEY_ID
 67    $env:AWS_SECRET_ACCESS_KEY = $env:R2_SECRET_ACCESS_KEY
 68    $env:RUSTC_WRAPPER = "sccache"
 69
 70    # Also write to GITHUB_ENV for subsequent steps
 71    if ($env:GITHUB_ENV) {
 72        @(
 73            "SCCACHE_ENDPOINT=$($env:SCCACHE_ENDPOINT)"
 74            "SCCACHE_BUCKET=$($env:SCCACHE_BUCKET)"
 75            "SCCACHE_REGION=$($env:SCCACHE_REGION)"
 76            "SCCACHE_S3_KEY_PREFIX=$($env:SCCACHE_S3_KEY_PREFIX)"
 77            "SCCACHE_BASEDIR=$($env:SCCACHE_BASEDIR)"
 78            "AWS_ACCESS_KEY_ID=$($env:AWS_ACCESS_KEY_ID)"
 79            "AWS_SECRET_ACCESS_KEY=$($env:AWS_SECRET_ACCESS_KEY)"
 80            "RUSTC_WRAPPER=$($env:RUSTC_WRAPPER)"
 81        ) | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
 82    }
 83
 84    Write-Host "✓ sccache configured with Cloudflare R2 (bucket: $bucket)"
 85}
 86
 87function Show-Config {
 88    Write-Host "=== sccache configuration ==="
 89    Write-Host "sccache version: $(sccache --version)"
 90    Write-Host "RUSTC_WRAPPER: $($env:RUSTC_WRAPPER ?? '<not set>')"
 91    Write-Host "SCCACHE_BUCKET: $($env:SCCACHE_BUCKET ?? '<not set>')"
 92    Write-Host "SCCACHE_ENDPOINT: $($env:SCCACHE_ENDPOINT ?? '<not set>')"
 93    Write-Host "SCCACHE_REGION: $($env:SCCACHE_REGION ?? '<not set>')"
 94    Write-Host "SCCACHE_S3_KEY_PREFIX: $($env:SCCACHE_S3_KEY_PREFIX ?? '<not set>')"
 95    Write-Host "SCCACHE_BASEDIR: $($env:SCCACHE_BASEDIR ?? '<not set>')"
 96
 97    if ($env:AWS_ACCESS_KEY_ID) {
 98        Write-Host "AWS_ACCESS_KEY_ID: <set>"
 99    }
100    else {
101        Write-Host "AWS_ACCESS_KEY_ID: <not set>"
102    }
103
104    if ($env:AWS_SECRET_ACCESS_KEY) {
105        Write-Host "AWS_SECRET_ACCESS_KEY: <set>"
106    }
107    else {
108        Write-Host "AWS_SECRET_ACCESS_KEY: <not set>"
109    }
110
111    Write-Host "=== sccache stats ==="
112    sccache --show-stats
113}
114
115Install-Sccache
116Configure-Sccache
117Show-Config