sccache 云存储怎么接:S3、GCS、Azure 三家后端配置与验证要点
【免费下载链接】sccacheSccache is a ccache-like tool. It is used as a compiler wrapper and avoids compilation when possible. Sccache has the capability to utilize caching in remote storage environments, including various cloud storage options, or alternatively, in local storage.项目地址: https://gitcode.com/GitHub_Trending/sc/sccache
一条 PR 触发全量编译要跑四十分钟,而本地缓存只在自己那台机器上生效——这正是团队用 sccache 这类共享编译缓存工具想解决的问题。sccache 是 ccache 风格的编译缓存包装器,除了本地磁盘,还能把缓存对象存进云存储。下面不重复原理,直接讲 sccache 云存储怎么配:S3、GCS、Azure 三家各要设哪些环境变量、凭证从哪来、怎么验证生效,以及最容易踩的几个坑。
动手前先把三件事想清楚
别急着填环境变量。真正决定你配哪套的,是下面三个判断,想清楚再选后端,后面基本是照单填值。
缓存对象放哪个后端
- 团队已经在用 AWS,或想兼容 R2 / MinIO / DigitalOcean 这类 S3 协议对象存储,选S3 路线,复用现有桶和凭证即可。
- 主体在 GCP,或想在 CI 里走无密钥的外部账号(Workload Identity)换取临时凭证,选GCS 路线。
- 团队在 Azure,尤其想在 AKS 上用 workload identity 或托管身份做免密认证,选Azure 路线。
这块缓存是只读还是可写
同一个后端,"只读"和"可读可写"往往由不同变量控制,而且默认值并不一致(GCS 默认是只读的,见下文)。CI 里常见做法是:主干机器可读可写,拉取请求的 runner 只读,防止 PR 把脏数据写进共享缓存。
凭证从哪来
三家都能接多种凭证来源,但机制差别很大:S3 吃 AWS 生态的静态密钥 / profile / IMDSv2 / AssumeRole;GCS 吃服务账号或外部账号的 JSON 文件;Azure 既能用连接字符串,也能走 Microsoft Entra ID 的免密身份。先确认你手头是哪一种,再决定填哪些变量。
路线一:AWS S3(兼容 R2 / MinIO / DigitalOcean)
最小配置就两个变量:桶名和区域。
export SCCACHE_BUCKET=my-bucket export SCCACHE_REGION=us-east-1如果走的是 MinIO、DigitalOcean 这类兼容端点,而不是 AWS 官方,再补一个SCCACHE_ENDPOINT=<ip>:<port>,并把SCCACHE_REGION设成auto。端点若走 HTTPS/TLS,置SCCACHE_S3_USE_SSL=true;内网不需要加密层时可以关掉换取性能。
几个按需再加的旋钮:
- 和别的应用共用同一个桶时,用
SCCACHE_S3_KEY_PREFIX给所有缓存对象加前缀,相当于圈出一块独立作用域。 - 要让 CI 只读,设
SCCACHE_S3_RW_MODE=READ_ONLY,默认是READ_WRITE。 - 需要服务端加密的,有三种模式按优先级依次解析:自管 KMS 密钥
SCCACHE_S3_SERVER_SIDE_ENCRYPTION_KMS_KEY_ID、AWS 托管 KMSSCCACHE_S3_SERVER_SIDE_ENCRYPTION_AWS_KMS=true、S3 托管 AES256SCCACHE_S3_SERVER_SIDE_ENCRYPTION=true。
凭证方面,sccache 会按 AWS 惯用方式找:静态的AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY、~/.aws/credentials加~/.aws/config(用AWS_PROFILE选 profile)、EC2 的 IMDSv2 元数据、AWS_ROLE_ARN的 AssumeRole,以及AWS_ROLE_ARN+AWS_WEB_IDENTITY_TOKEN_FILE的 Web Identity。还有个实用开关:SCCACHE_S3_NO_CREDENTIALS=true让 sccache 以匿名只读方式访问公共桶——给无法拿到凭证的 PR 建只读缓存时正合适。R2 也是同一套变量,只是必须写SCCACHE_ENDPOINT(形如https://<ACCOUNT_ID>.r2.cloudflarestorage.com)且SCCACHE_REGION=auto。细节见 S3 官方文档。
路线二:Google Cloud Storage
先填桶名和凭证文件:
export SCCACHE_GCS_BUCKET=my-bucket export SCCACHE_GCS_KEY_PATH=./service-account.json⚠️ 这里有个和 S3 相反的默认值:GCS 后端默认是只读的。要真正写入缓存,必须显式打开SCCACHE_GCS_RW_MODE=READ_WRITE(可选值还有READ_ONLY)。共享桶同样用SCCACHE_GCS_KEY_PREFIX加前缀。
凭证的查找顺序大致是:先看你给的SCCACHE_GCS_KEY_PATH(可以是服务账号 JSON,也可以是外部账号 JSON),然后是GOOGLE_APPLICATION_CREDENTIALS,再是各平台的默认位置,最后是 VM 元数据。其中服务账号必须对目标桶有Storage Object Admin权限,否则会直接报Permission denied。如果想免掉长期密钥文件,外部账号 + Workload Identity 是更干净的路子:把外部账号 JSON 路径传给SCCACHE_GCS_KEY_PATH即可,池里的服务账号同样要有Storage Object Admin。注意旧的SCCACHE_GCS_OAUTH_URL已废弃,别再配。完整说明见 GCS 文档。
路线三:Azure Blob Storage
先说一个硬约束:SCCACHE_AZURE_BLOB_CONTAINER指向的容器必须已经存在,sccache 只负责往里读写,不会替你创建,所以要先在 Azure 里把容器建好。
共享密钥(连接字符串)是最直接的接法:
export SCCACHE_AZURE_BLOB_CONTAINER=my-container export SCCACHE_AZURE_CONNECTION_STRING="<connection-string>"如果你的存储账号关掉了共享密钥访问,就走 Microsoft Entra ID 免密认证:用SCCACHE_AZURE_STORAGE_ACCOUNT(账号名,sccache 会拼出https://{account}.blob.core.windows.net)或SCCACHE_AZURE_ENDPOINT(主权云 / 自定义 DNS 时用的完整端点,且必须 https)。连接字符串与账号/端点是互斥的,后两者里SCCACHE_AZURE_ENDPOINT优先。
免密路径下凭证按这个顺序解析:服务主体(AZURE_TENANT_ID+AZURE_CLIENT_ID+AZURE_CLIENT_SECRET)→ workload identity(AKS / K8s / 联邦 OIDC,用AZURE_FEDERATED_TOKEN_FILE)→ 托管身份(走实例元数据端点169.254.169.254,VM 上无需额外变量,设AZURE_CLIENT_ID可选定某个用户分配身份)。身份在容器上需要的数据平面角色是:READ_WRITE(默认)对应Storage Blob Data Contributor,READ_ONLY对应Storage Blob Data Reader。主权云跑服务主体 / workload identity 时还要设AZURE_AUTHORITY_HOST。本地用 Azurite 的话走连接字符串那条路。共享与读写控制分别是SCCACHE_AZURE_KEY_PREFIX和SCCACHE_AZURE_RW_MODE,详见 Azure 文档。
三家关键环境变量对照
| 配置项 | AWS S3 | Google Cloud Storage | Azure Blob |
|---|---|---|---|
| 桶 / 容器 | SCCACHE_BUCKET | SCCACHE_GCS_BUCKET | SCCACHE_AZURE_BLOB_CONTAINER |
| 区域 | SCCACHE_REGION | 不需要 | 不需要 |
| 自定义端点 | SCCACHE_ENDPOINT | 不需要 | SCCACHE_AZURE_ENDPOINT |
| 键前缀(共享隔离) | SCCACHE_S3_KEY_PREFIX | SCCACHE_GCS_KEY_PREFIX | SCCACHE_AZURE_KEY_PREFIX |
| 读写模式 | SCCACHE_S3_RW_MODE | SCCACHE_GCS_RW_MODE | SCCACHE_AZURE_RW_MODE |
| 默认读写行为 | 可读可写 | 只读,需显式打开写 | 可读可写 |
这张表的价值在于暴露那个不一致的默认值:GCS 不手动设READ_WRITE的话,缓存永远只进不出。
接完怎么确认真的生效
配完之后不要假设,跑一下统计命令:
sccache --show-stats输出里的Cache location一行会如实反映当前指向的后端,例如 GCS 会显示GCS, bucket: Bucket(name=...),S3 / Azure 也会带上桶名与 key_prefix。看到它指向了你预期的桶和容器,才算接对了;顺带也能读到缓存命中相关的统计。更完整的选项汇总在 配置总览。
上线前容易被忽略的几个坑
- 改完环境变量要重启服务。这些配置只在 sccache 服务器启动时读取,也就是首次运行时。你改了桶或区域,先
sccache --stop-server停掉旧服务再重跑,否则还在用老配置。 - GCS 默认只读。上面强调过,这是和 S3 / Azure 最大的行为差异,忘了开
READ_WRITE就会一直 miss。 - 容器 / 桶得先建好。Azure 容器不会自动创建;S3、GCS 同理,权限也要到位(GCS 要
Storage Object Admin,Azure 要对应的 Blob Data 角色),否则要么创建失败要么Permission denied。 - 路径不一致会拉低命中率。sccache 的缓存键会带上编译上下文,团队成员 / CI 若用了不同的绝对路径,同一份代码也会各 miss 各的。保持构建根路径一致,能显著提升共享缓存的命中。
- 共享桶记得加前缀。三家都有对应的
KEY_PREFIX变量,和别的系统共用一个桶 / 容器时不开前缀,键空间会互相污染。
把这三件事(放哪、读写、凭证)和对照表过一遍,再对着--show-stats的输出确认一次,接入就算闭环了。
【免费下载链接】sccacheSccache is a ccache-like tool. It is used as a compiler wrapper and avoids compilation when possible. Sccache has the capability to utilize caching in remote storage environments, including various cloud storage options, or alternatively, in local storage.项目地址: https://gitcode.com/GitHub_Trending/sc/sccache
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考