sccache 云存储怎么接:S3、GCS、Azure 三家后端配置与验证要点
2026/9/20 12:10:52 网站建设 项目流程

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 ContributorREAD_ONLY对应Storage Blob Data Reader。主权云跑服务主体 / workload identity 时还要设AZURE_AUTHORITY_HOST。本地用 Azurite 的话走连接字符串那条路。共享与读写控制分别是SCCACHE_AZURE_KEY_PREFIXSCCACHE_AZURE_RW_MODE,详见 Azure 文档。

三家关键环境变量对照

配置项AWS S3Google Cloud StorageAzure Blob
桶 / 容器SCCACHE_BUCKETSCCACHE_GCS_BUCKETSCCACHE_AZURE_BLOB_CONTAINER
区域SCCACHE_REGION不需要不需要
自定义端点SCCACHE_ENDPOINT不需要SCCACHE_AZURE_ENDPOINT
键前缀(共享隔离)SCCACHE_S3_KEY_PREFIXSCCACHE_GCS_KEY_PREFIXSCCACHE_AZURE_KEY_PREFIX
读写模式SCCACHE_S3_RW_MODESCCACHE_GCS_RW_MODESCCACHE_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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询