目录
- [1. 架构概述](#1. 架构概述)
- [2. 集群设备环境部署](#2. 集群设备环境部署)
- [3. 客户端使用方案](#3. 客户端使用方案)
- [4. 运维与监控](#4. 运维与监控)
- [5. 故障排查](#5. 故障排查)
- [6. 附录](#6. 附录)
1. 架构概述
1.1 整体架构
flowchart TD
subgraph Client["开发者客户端"]
A1["Android Studio"]
A2["depot_tools"]
A3["Siso 构建工具"]
A4["GN 生成器"]
A5[".sisoenv 配置<br />RBE 连接参数"]
A1 --> A5
A2 --> A5
A3 --> A5
A4 --> A5
end
A5 -->|"gRPC / HTTPS"| S
subgraph Scheduler["RBE 集群调度层 (Scheduler)"]
S["EngFlow / BuildBuddy /<br />Bazel Remote / 自建集群"]
end
S --> W
subgraph Workers["执行节点池 (Worker Pool)"]
W1["Worker 1<br />编译器 + 缓存"]
W2["Worker 2<br />编译器 + 缓存"]
W3["Worker 3<br />编译器 + 缓存"]
WN["Worker N<br />编译器 + 缓存"]
end
W1 --> C
W2 --> C
W3 --> C
WN --> C
subgraph Cache["远程缓存层 (CAS + AC)"]
C1["CAS 内容寻址存储<br />S3 / MinIO / NAS"]
C2["AC 动作缓存<br />Redis / 内存"]
end
1.2 组件说明
|-----------------------------------------|-----------|-------------------------------------|
| 组件 | 作用 | 推荐方案 |
| Scheduler(调度节点) | 任务调度、负载均衡 | EngFlow / BuildBuddy / Bazel Remote |
| Worker(执行节点) | 实际执行编译任务 | 高性能 Linux 服务器 |
| CAS(Content-Addressable Storage,内容寻址存储) | 缓存编译产物 | S3 / MinIO / 本地 NAS |
| AC(Action Cache,动作缓存) | 缓存编译命令结果 | Redis / 内存缓存 |
| Siso | 客户端构建工具 | depot_tools 内置 |
组件之间的调用关系如下:
flowchart LR
Siso["Siso 客户端"] -->|"提交编译动作"| Sched["Scheduler"]
Sched -->|"分发任务"| Worker["Worker 节点"]
Worker -->|"查询/写入"| AC["Action Cache (Redis)"]
Worker -->|"查询/写入"| CAS["CAS (MinIO / S3)"]
Siso -->|"读取缓存"| AC
Siso -->|"读取缓存"| CAS
2. 集群设备环境部署
2.1 硬件要求
Scheduler(调度节点)
|---------|------------|-----------------|
| 配置项 | 最低要求 | 推荐配置 |
| CPU | 8 核 | 16 核+ |
| 内存 | 16 GB | 32 GB+ |
| 磁盘 | 100 GB SSD | 500 GB NVMe SSD |
| 网络 | 千兆网卡 | 万兆网卡 |
| 数量 | 1 | 2(主备) |
Worker(执行节点)
|---------|------------|------------------------------|
| 配置项 | 最低要求 | 推荐配置 |
| CPU | 16 核 | 32 核+(AMD EPYC / Intel Xeon) |
| 内存 | 32 GB | 64 GB+ |
| 磁盘 | 200 GB SSD | 1 TB NVMe SSD |
| 网络 | 千兆网卡 | 万兆网卡 |
| 数量 | 4 | 8+ |
注意:Worker(执行节点)需要与客户端代码库版本一致的工具链(clang、ndk、sdk)。
缓存节点(Cache)
|---------|----------|-----------------------|
| 配置项 | 最低要求 | 推荐配置 |
| CPU | 4 核 | 8 核 |
| 内存 | 16 GB | 64 GB+ |
| 磁盘 | 1 TB SSD | 4 TB+ NVMe SSD / 对象存储 |
| 网络 | 千兆网卡 | 万兆网卡 |
| 数量 | 1 | 2(高可用) |
2.2 软件环境
操作系统(所有节点)
# 推荐 Ubuntu 22.04 LTS
sudo apt update && sudo apt upgrade -y
# 基础依赖
sudo apt install -y \
build-essential \
git \
curl \
wget \
python3 \
python3-pip \
openjdk-17-jdk \
docker.io \
docker-compose
三种部署方案的选型对比如下:
flowchart TD
Start["选择 RBE 部署方案"] --> Q1{"是否需要<br />企业级支持?"}
Q1 -->|"是"| P1["方案一:EngFlow<br />商业方案,功能完整"]
Q1 -->|"否"| Q2{"是否希望<br />开源自建?"}
Q2 -->|"是"| P2["方案二:BuildBuddy<br />开源,Docker Compose 部署"]
Q2 -->|"否"| P3["方案三:Bazel Remote + Siso<br />轻量级,适合小团队/测试"]
2.2.1 方案一:EngFlow 集群部署
EngFlow 是商业 RBE 解决方案,提供企业级支持。
步骤一:部署 Scheduler
下载 EngFlow 部署包
wget https://releases.engflow.com/engflow-scheduler-latest.tar.gz
tar -xzf engflow-scheduler-latest.tar.gz
cd engflow-scheduler
配置 scheduler
sudo tee /etc/engflow/scheduler.yaml << 'EOF'
server:
port: 8080
tls:
cert_file: /etc/engflow/server.crt
key_file: /etc/engflow/server.key
backend:
type: kubernetes # 或 docker, local
kubernetes:
namespace: engflow
worker_image: engflow/worker:latest
worker_count: 8
worker_cpu: 32
worker_memory: 64Gi
cache:
cas:
type: s3
s3:
bucket: engflow-cas
region: us-east-1
endpoint: s3.example.com
ac:
type: redis
redis:
address: redis.example.com:6379
password: ${REDIS_PASSWORD}
auth:
type: google_oidc
google_oidc:
client_id: ${GOOGLE_CLIENT_ID}
client_secret: ${GOOGLE_CLIENT_SECRET}
EOF
启动 scheduler
sudo systemctl enable engflow-scheduler
sudo systemctl start engflow-scheduler
步骤二:部署 Worker
使用 Docker 部署 Worker
cat > docker-compose.worker.yml << 'EOF'
version: '3.8'
services:
worker:
image: engflow/worker:latest
restart: always
environment:
- SCHEDULER_ADDRESS=scheduler.example.com:8080
- WORKER_NAME=worker-${HOSTNAME}
- WORKER_CPU=32
- WORKER_MEMORY=64
volumes:
- /var/cache/engflow:/cache
- /opt/android-toolchain:/toolchain:ro
deploy:
resources:
limits:
cpus: '32'
memory: 64G
EOF
sudo docker-compose -f docker-compose.worker.yml up -d
步骤三:部署缓存
Redis (Action Cache)
sudo apt install -y redis-server
sudo tee /etc/redis/redis.conf << 'EOF'
bind 0.0.0.0
port 6379
maxmemory 32gb
maxmemory-policy allkeys-lru
requirepass ${REDIS_PASSWORD}
EOF
sudo systemctl restart redis-server
MinIO (CAS - 对象存储)
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/
创建 MinIO 服务
sudo tee /etc/systemd/system/minio.service << 'EOF'
[Unit]
Description=MinIO Object Storage
After=network.target
[Service]
Type=simple
User=minio
Group=minio
Environment="MINIO_ROOT_USER=${MINIO_ACCESS_KEY}"
Environment="MINIO_ROOT_PASSWORD=${MINIO_SECRET_KEY}"
ExecStart=/usr/local/bin/minio server /data/minio --console-address :9001
Restart=always
[Install]
WantedBy=multi-user.target
EOF
sudo useradd -r -s /bin/false minio
sudo mkdir -p /data/minio
sudo chown -R minio:minio /data/minio
sudo systemctl enable minio
sudo systemctl start minio
2.2.2 方案二:BuildBuddy 开源部署
BuildBuddy 提供开源版本,适合自建集群。
使用 Docker Compose 部署完整集群
cat > docker-compose.buildbuddy.yml << 'EOF'
version: '3.8'
services:
buildbuddy:
image: buildbuddy/buildbuddy-app:latest
restart: always
ports:
- "1985:1985"
- "8080:8080"
environment:
- BUILD_BUDDY_CONFIG=/config/buildbuddy.yaml
volumes:
- ./buildbuddy.yaml:/config/buildbuddy.yaml:ro
- buildbuddy-data:/data
worker:
image: buildbuddy/buildbuddy-executor:latest
restart: always
privileged: true
environment:
- BUILD_BUDDY_EXECUTOR_CONFIG=/config/executor.yaml
volumes:
- ./executor.yaml:/config/executor.yaml:ro
- /var/run/docker.sock:/var/run/docker.sock
deploy:
replicas: 8
resources:
limits:
cpus: '32'
memory: 64G
redis:
image: redis:7-alpine
restart: always
command: redis-server --maxmemory 32gb --maxmemory-policy allkeys-lru
volumes:
- redis-data:/data
minio:
image: minio/minio:latest
restart: always
command: server /data --console-address :9001
environment:
- MINIO_ROOT_USER=${MINIO_ACCESS_KEY}
- MINIO_ROOT_PASSWORD=${MINIO_SECRET_KEY}
volumes:
- minio-data:/data
ports:
- "9000:9000"
- "9001:9001"
volumes:
buildbuddy-data:
redis-data:
minio-data:
EOF
BuildBuddy 配置文件
sudo tee buildbuddy.yaml << 'EOF'
storage:
disk:
root_directory: /data/storage
gcs:
bucket: buildbuddy-cas
project_id: my-project
credentials_file: /config/gcs-credentials.json
cache:
redis_target: redis:6379
max_size_bytes: 100000000000 # 100GB
executor:
enable_firecracker: false
docker_socket: /var/run/docker.sock
docker_net_host: true
default_isolation_type: "docker"
auth:
oauth_providers:
- issuer_url: "https://accounts.google.com"
client_id: "${GOOGLE_CLIENT_ID}"
client_secret: "${GOOGLE_CLIENT_SECRET}"
EOF
sudo docker-compose -f docker-compose.buildbuddy.yml up -d
2.2.3 方案三:Bazel Remote + Siso(轻量级)
适合小型团队或测试环境。
部署 bazel-remote 缓存服务器
sudo docker run -d \
--name bazel-remote \
-v /data/bazel-remote:/data \
-p 9092:9092 \
buchgr/bazel-remote-cache \
--dir=/data \
--max_size_gb=500 \
--grpc_port=9092
部署本地 Worker(使用 Siso 内置 Worker 模式)
注意:Siso 本身不直接提供 Worker,需要配合 Bazel-buildfarm 或自定义 Worker。
2.3 Worker 节点工具链配置
Worker 必须包含与客户端一致的 Android 编译工具链。
# 在 Worker 节点上安装 Android 工具链
sudo mkdir -p /opt/android-toolchain
cd /opt/android-toolchain
# 下载 Android NDK
wget https://dl.google.com/android/repository/android-ndk-r27c-linux.zip
unzip android-ndk-r27c-linux.zip
# 下载 Android SDK Command Line Tools
wget https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip
mkdir -p cmdline-tools/latest
unzip commandlinetools-linux-11076708_latest.zip -d cmdline-tools/latest
mv cmdline-tools/latest/cmdline-tools/* cmdline-tools/latest/
# 安装 SDK 组件
export ANDROID_HOME=/opt/android-toolchain
yes | cmdline-tools/latest/bin/sdkmanager --licenses
cmdline-tools/latest/bin/sdkmanager \
"platforms;android-35" \
"build-tools;35.0.0" \
"platform-tools"
# 下载 Chromium depot_tools(包含 Siso 和编译脚本)
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH="/opt/android-toolchain/depot_tools:$PATH"
# 确保 Worker 节点可以访问这些工具链
sudo chown -R 1000:1000 /opt/android-toolchain
2.4 网络与安全配置
# 防火墙规则 (Scheduler 节点)
sudo ufw allow 8080/tcp # EngFlow / BuildBuddy HTTP
sudo ufw allow 9092/tcp # gRPC (bazel-remote)
sudo ufw allow 443/tcp # HTTPS
sudo ufw allow 6379/tcp # Redis (仅限内网)
sudo ufw allow 9000/tcp # MinIO S3 API
sudo ufw allow 9001/tcp # MinIO Console
# 配置 TLS (使用 Let's Encrypt 或自签名证书)
sudo apt install -y certbot
sudo certbot certonly --standalone -d scheduler.example.com
配置 Nginx 反向代理(可选)
sudo tee /etc/nginx/sites-available/rbe << 'EOF'
server {
listen 443 ssl http2;
server_name scheduler.example.com;
ssl_certificate /etc/letsencrypt/live/scheduler.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/scheduler.example.com/privkey.pem;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
# gRPC 支持
location /google.devtools.remoteexecution.v2.RemoteExecution {
grpc_pass grpc://localhost:8080;
}
}
EOF
sudo ln -s /etc/nginx/sites-available/rbe /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl restart nginx
3. 客户端使用方案
3.1 客户端环境准备
系统要求
|---------|--------------------------------------|------------------|
| 配置项 | 最低要求 | 推荐配置 |
| OS | Ubuntu 20.04 / macOS 12 / Windows 10 | Ubuntu 22.04 LTS |
| CPU | 8 核 | 16 核+ |
| 内存 | 16 GB | 32 GB+ |
| 磁盘 | 100 GB SSD | 500 GB NVMe SSD |
| 网络 | 稳定互联网 | 企业专线 (低延迟) |
安装依赖
# Ubuntu / Debian
sudo apt update
sudo apt install -y \
git \
python3 \
python3-pip \
curl \
wget \
openjdk-17-jdk \
lsb-release \
sudo
# 安装 depot_tools(包含 Siso)
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git ~/depot_tools
export PATH="$HOME/depot_tools:$PATH"
# 验证 Siso 安装
which siso
siso --version
3.2 项目配置
3.2.1 AOSP 项目配置
# 下载 AOSP 源码
mkdir -p ~/aosp && cd ~/aosp
repo init -u https://android.googlesource.com/platform/manifest -b main
repo sync -c -j8
# 配置编译环境
source build/envsetup.sh
lunch aosp_arm64-eng
# 创建 Siso 配置文件
mkdir -p ~/.config/siso
tee ~/.config/siso/config.json << 'EOF'
{
"remote_execution": {
"enabled": true,
"server_address": "scheduler.example.com:443",
"instance_name": "aosp",
"credentials_helper": "siso-credential-helper.sh",
"tls_enabled": true,
"timeout_seconds": 300
},
"cache": {
"enabled": true,
"read_only": false,
"max_cache_size_gb": 50
},
"local_execution": {
"fallback_enabled": true,
"max_local_jobs": 8
}
}
EOF
# 配置认证 (以 Google OIDC 为例)
tee ~/bin/siso-credential-helper.sh << 'EOF'
#!/bin/bash
# 从 gcloud 获取访问令牌
gcloud auth print-access-token
EOF
chmod +x ~/bin/siso-credential-helper.sh
# 或者使用 API Key 方式
tee ~/.config/siso/api_key << 'EOF'
your-api-key-here
EOF
3.2.2 Chromium for Android 配置
# 下载 Chromium 源码
mkdir -p ~/chromium && cd ~/chromium
fetch --nohooks android
# 安装依赖
cd src
./build/install-build-deps-android.sh
gclient runhooks
# 配置 GN 参数
mkdir -p out/Default
tee out/Default/args.gn << 'EOF'
# 目标平台
target_os = "android"
target_cpu = "arm64"
# 启用远程执行
use_remoteexec = true
# 禁用组件构建 (推荐用于远程编译)
is_component_build = false
# 其他编译选项
is_debug = false
symbol_level = 1
android_static_analysis = false
EOF
# 生成 Ninja 文件
gn gen out/Default
# 配置 .sisoenv (Siso 环境变量)
tee .sisoenv << 'EOF'
# RBE 集群配置
RBE_server_address=scheduler.example.com:443
RBE_instance=default
# 认证方式
RBE_credentials_helper=siso-credential-helper.sh
# 工具链路径 (Worker 节点需一致)
RBE_toolchain_path=/opt/android-toolchain
# 超时设置
RBE_rpc_timeout=300s
RBE_exec_timeout=600s
# 日志级别
SISO_LOG_LEVEL=info
EOF
3.3 编译执行
基础编译命令
# 标准编译 (自动使用远程集群)
siso ninja -C out/Default
# 指定并发数
siso ninja -C out/Default -j 200
# 强制严格远程模式 (不回退本地)
siso ninja -C out/Default --strict_remote=true
# 仅使用远程缓存 (不执行远程编译)
siso ninja -C out/Default --remote_cache_only
# 本地编译 (不使用远程)
siso ninja -C out/Default --local
# 详细日志输出
siso ninja -C out/Default -v
增量编译
# 修改代码后重新编译
siso ninja -C out/Default chrome_public_apk
# 清理后重新编译
siso ninja -C out/Default -t clean
siso ninja -C out/Default
多目标编译
# 同时编译多个目标
siso ninja -C out/Default \
chrome_public_apk \
system_webview_apk \
monochrome_public_apk
3.4 高级配置
3.4.1 自定义 Starlark 规则
创建 build/config/siso/main.star 以自定义远程执行行为:
load("@builtin//encoding.star", "json")
load("@builtin//struct.star", "module")
def init(ctx):
step_config = {
"rules": [
{
"name": "clang_compile",
"action": "CXX_COMPILER.|C_COMPILER.",
"remote_command": "clang++",
"remote": True,
"input_root_absolute_path": True,
"use_system_input": True,
"timeout": "300s",
},
{
"name": "java_compile",
"action": "JAVA_COMPILE.",
"remote_command": "javac",
"remote": True,
"timeout": "120s",
},
{
"name": "link",
"action": "LINK.",
"remote_command": "ld.lld",
"remote": True,
"timeout": "600s",
"pool": "link_pool", # 限制并发链接任务
},
{
"name": "local_only",
"action": "LOCAL_.*|SIGN_.*|PACK.*",
"remote": False,
"local": True,
},
],
"pools": {
"link_pool": {
"depth": 4, # 同时最多 4 个链接任务
}
}
}
return module(
"config",
step_config = json.encode(step_config),
filegroups = {},
handlers = {},
)
3.4.2 配置文件分层管理
~/.config/siso/
├── config.json # 全局默认配置
├── profiles/
│ ├── aosp.json # AOSP 项目配置
│ ├── chromium.json # Chromium 配置
│ └── internal.json # 内网集群配置
└── credentials/
├── google_oidc.json # Google 认证
├── api_key.json # API Key
└── cert/
├── client.crt # 客户端证书
└── client.key # 客户端密钥
切换配置 profile:
# 使用指定 profile
siso ninja -C out/Default --profile=chromium
# 或设置环境变量
export SISO_PROFILE=chromium
siso ninja -C out/Default
3.5 不同场景配置示例
场景 1:企业内网集群
# .sisoenv
RBE_server_address=192.168.1.100:8080
RBE_instance=android
RBE_tls_enabled=false # 内网可关闭 TLS
RBE_credentials_helper=none
场景 2:云服务商集群 (AWS/GCP/Azure)
# .sisoenv
RBE_server_address=rbe.example.com:443
RBE_instance=android-prod
RBE_tls_enabled=true
RBE_credentials_helper=gcloud-auth
# 设置区域 (减少延迟)
RBE_region=asia-east1
场景 3:混合模式 (本地 + 远程)
# .sisoenv
RBE_server_address=scheduler.example.com:443
RBE_instance=default
# 本地优先小任务,远程执行大任务
RBE_local_fallback=true
RBE_local_job_limit=16
RBE_remote_job_limit=200
4. 运维与监控
4.1 集群监控
Prometheus + Grafana 监控栈。客户端从配置到编译的完整流程如下:
flowchart TD
A["安装 depot_tools<br />并配置 PATH"] --> B["同步源码<br />repo sync / fetch"]
B --> C["配置 GN 参数<br />args.gn"]
C --> D["gn gen 生成 Ninja 文件"]
D --> E["编写 .sisoenv<br />RBE 连接与认证"]
E --> F["执行 siso ninja -C out/Default"]
F --> G{"远程执行成功?"}
G -->|"是"| H["命中缓存 / 远程编译<br />返回产物"]
G -->|"否"| I["按配置回退本地编译"]
H --> J["输出 APK / 目标产物"]
I --> J
# docker-compose.monitoring.yml
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus-data:/prometheus
ports:
- "9090:9090"
grafana:
image: grafana/grafana:latest
volumes:
- grafana-data:/var/lib/grafana
- ./grafana-dashboards:/etc/grafana/provisioning/dashboards:ro
ports:
- "3000:3000"
node-exporter:
image: prom/node-exporter:latest
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
ports:
- "9100:9100"
volumes:
prometheus-data:
grafana-data:
关键监控指标:
|---------------------|-------------|----------|
| 指标 | 说明 | 告警阈值 |
| rbe_queue_length | 等待执行的任务数 | > 100 |
| rbe_worker_active | 活跃 Worker 数 | < 4 |
| rbe_cache_hit_ratio | 缓存命中率 | < 70% |
| rbe_exec_duration | 平均执行时间 | 300s |
| rbe_error_rate | 执行错误率 | 5% |
4.2 日志管理
# 集中日志收集 (Fluentd / Filebeat)
# Scheduler 日志
sudo journalctl -u engflow-scheduler -f
# Worker 日志
sudo docker logs -f worker
# Siso 客户端日志
export SISO_LOG_LEVEL=debug
siso ninja -C out/Default 2>&1 | tee siso-build.log
4.3 缓存管理
# 查看缓存统计
# MinIO
mc alias set local http://minio.example.com:9000 ${ACCESS_KEY} ${SECRET_KEY}
mc du local/engflow-cas --recursive
# 清理过期缓存 (保留最近 30 天)
mc rm --recursive --force --older-than 30d local/engflow-cas/
# Redis 缓存清理
redis-cli -h redis.example.com -a ${PASSWORD} --eval purge-old-keys.lua
4.4 扩容与缩容
# Kubernetes 自动扩缩容 (HPA)
kubectl autoscale deployment worker \
--cpu-percent=70 \
--min=4 \
--max=32
# 手动扩容 Worker
sudo docker-compose -f docker-compose.worker.yml up -d --scale worker=16
5. 故障排查
5.1 常见问题速查表
|--------|------------------|----------------------------------|
| 症状 | 可能原因 | 解决方案 |
| 连接超时 | 网络延迟 / 防火墙 | 检查端口连通性,调整 RBE_rpc_timeout |
| 认证失败 | Token 过期 / 权限不足 | 重新运行 gcloud auth login,检查 IAM 权限 |
| 缓存未命中 | 工具链版本不一致 | 确保 Worker 与客户端工具链完全一致 |
| 编译错误 | 环境差异 | 检查 Worker 的 PATH 和依赖库版本 |
| 任务排队 | Worker 不足 / 任务过多 | 扩容 Worker 或调整并发限制 |
| 内存不足 | 链接任务过大 | 增加 Worker 内存,或限制链接并发数 |
5.2 诊断命令
# 测试 RBE 连接
siso remote-test --server=scheduler.example.com:443
# 检查 Worker 状态
# EngFlow
curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
https://scheduler.example.com/api/v1/workers
# 查看详细构建日志
siso ninja -C out/Default -v --log_level=debug 2>&1 | tee build-debug.log
# 分析缓存命中率
siso ninja -C out/Default --profile_build \
&& cat out/Default/.siso/profile.json | jq '.cache_stats'
# 检查工具链一致性
# 客户端
clang --version
# Worker (通过 SSH)
ssh worker1 "clang --version"
5.3 调试模式
# 单任务调试
siso ninja -C out/Default obj/foo.o --verbose
# 禁用远程,仅本地调试
siso ninja -C out/Default --local -j1
# 远程单任务执行
siso ninja -C out/Default obj/foo.o --remote_only
# 查看 Starlark 规则匹配
export SISO_STARLARK_DEBUG=1
siso ninja -C out/Default
6. 附录
6.1 参考资源
6.2 版本兼容性
|-------------|-----------------|-------------|----------------|
| Siso 版本 | Chromium 版本 | AOSP 版本 | RBE API 版本 |
| ≥ 2024.01 | ≥ M120 | Android 14+ | v2 |
| ≥ 2024.06 | ≥ M125 | Android 15+ | v2.1 |
| ≥ 2025.01 | ≥ M132 | Android 16+ | v2.2 |
6.3 性能基准
|------------------|----------------|------------------|---------|
| 项目 | 本地编译 (16核) | 远程集群 (8×32核) | 加速比 |
| AOSP (完整) | ~4 小时 | ~30 分钟 | 8x |
| Chromium Android | ~3 小时 | ~25 分钟 | 7x |
| 增量编译 | ~10 分钟 | ~2 分钟 | 5x |
实际性能取决于网络带宽、缓存命中率和集群负载。
6.4 配置文件模板汇总
完整 .sisoenv 模板
# ============================================
# Siso RBE 配置文件模板
# 复制到项目根目录,命名为 .sisoenv
# ============================================
# ---- 服务器配置 ----
RBE_server_address=scheduler.example.com:443
RBE_instance=default
RBE_tls_enabled=true
# ---- 认证配置 (选择一种) ----
# 方式 1: Google OIDC
RBE_credentials_helper=siso-credential-helper.sh
# 方式 2: API Key
# RBE_api_key_file=/path/to/api_key
# 方式 3: 无认证 (内网)
# RBE_credentials_helper=none
# ---- 超时配置 ----
RBE_rpc_timeout=300s
RBE_exec_timeout=600s
RBE_connection_timeout=30s
# ---- 并发控制 ----
RBE_remote_job_limit=200
RBE_local_job_limit=16
# ---- 缓存配置 ----
RBE_cache_read=true
RBE_cache_write=true
RBE_cache_max_size_gb=50
# ---- 调试配置 ----
# SISO_LOG_LEVEL=debug
# SISO_PROFILE_BUILD=true
完整 GN args 模板 (Chromium Android)
# ============================================
# GN 构建参数模板
# 保存为 out/Default/args.gn
# ============================================
# ---- 目标平台 ----
target_os = "android"
target_cpu = "arm64" # arm, x86, x64
# ---- 远程执行 ----
use_remoteexec = true
# ---- 构建类型 ----
is_debug = false
is_component_build = false
symbol_level = 1
# ---- Android 特定 ----
android_static_analysis = false
android_sdk_version = 35
android_ndk_version = "r27c"
# ---- 性能优化 ----
treat_warnings_as_errors = false
use_lld = true
# ---- 可选功能 ----
# enable_nacl = false
# ffmpeg_branding = "Chrome"
# proprietary_codecs = true