orchestra 是对 docs/SPEC.md 中 Orchestra 规范的 Go 实现。
Orchestra 是一个受 Symphony 启发、但并非其逐字移植的系统: 它以代码平台
webhook 事件为主要入口,将 issue、pull/merge request、push、tag、release
等外部信号归一化为可调度工作,并以 Codex 作为统一的 agent 执行基础设施。
编码任务是当前最重要的使用场景,但同一套运行时也面向 CI/CD 与仓库自动化。
当前实现已经转向 Kubernetes 控制面模型: 由 controller manager 监听
Workflow、WorkflowTemplate、Tracker、Agent 等 CRD,并以 Pod 作为
Codex agent 的执行载体。
serve启动 Kubernetes controller manager,并暴露共享 HTTP ingress 用于 webhook 与 API 访问Tracker负责外部事件的连接、认证、归一化,以及必要时的轮询补偿WorkflowTemplate承接可复用的工作流模板,并支持 webhook 命中后实例化WorkflowCR 承接运行配置与工作流实例状态,而不仅限于单一 issue 任务Workflow.status暴露运行中、重试中与最近错误的运行摘要- 运行结果可沉淀为 Proof of Work,例如状态变迁、日志、agent 事件与工作区产物
- worker Pod 通过隐藏命令
run-once执行单次 agent 尝试 - 仍保留本地
validate-config/print-config,用于调试 legacy YAML 配置
- Go 1.25+
- Kubernetes 集群访问权限
- 可访问的代码平台 HTTP API / webhook 来源,当前主要围绕 issue 流程,也支持扩展到 GitHub / GitLab 的 PR/MR、push、tag、release 等事件
- worker 镜像内可执行
orchestra与codex app-server - 如果继续使用 SSH 模式:
- controller Pod 所在环境可通过
ssh连接目标 host - 远端 host 具备
bash、codex app-server及所需认证环境
- controller Pod 所在环境可通过
- 安装默认部署清单:
kubectl apply -k config/default- 创建 tracker token secret:
kubectl create namespace orchestra-system
kubectl -n orchestra-system create secret generic github-token --from-literal=token="$GITHUB_TOKEN"- 参考
config/samples/orchestra_v1alpha1_workflow.yaml创建Workflow:
kubectl apply -f config/samples/orchestra_v1alpha1_workflow.yaml- 如果你在本地调试 manager,也可以直接启动:
go run ./cmd/orchestra serve --namespace orchestra-systemserve 在启动 manager 之前会先同步二进制内置的 CRD 清单:
- 集群里不存在时自动安装
- 已存在时按仓库中的
config/crd/bases/*.yaml自动更新
因此运行账号需要具备 CustomResourceDefinition 的读写权限。
常用启动参数:
go run ./cmd/orchestra serve \
--namespace orchestra-system \
--leader-elect=true \
--port 8080 \
--metrics-bind-address :8081serve 默认在 :8080 暴露共享 HTTP 入口:
/api/v1/*API/api/v1/webhooks/:providerwebhook 入口,当前支持github/gitlab/healthz/readyz
当前内置的资源型 API 包括:
/api/v1/workflows/api/v1/workflowtemplates/api/v1/trackers/api/v1/namespaces/api/v1/secrets/api/v1/configmaps
其中:
workflows、workflowtemplates、trackers、secrets、configmaps提供列表 / 查询 / 创建 / 替换更新 / merge patch / 删除namespaces提供集群级列表 / 查询 / 创建 / 替换更新 / merge patch / 删除secrets与configmaps的列表接口支持?namespace=<ns>过滤
指标端点默认单独监听 :8081。
如果是在集群外调试,可显式指定 kubeconfig:
go run ./cmd/orchestra serve --kubeconfig ~/.kube/config仓库中的 Kubernetes 落地清单位于:
config/default/kustomization.yamlconfig/manager/deployment.yamlconfig/manager/namespace.yamlconfig/rbac/service_account.yamlconfig/rbac/role.yamlconfig/rbac/role_binding.yaml
Workflow.spec 目前覆盖以下主要配置块:
trackerpollingworkspaceworkerhooksagentcodexserverprompt
当前 tracker 已统一为 kind: http 的通用 HTTP / webhook 模型。
legacy YAML 中通过 tracker.http.auth.value 配置认证;CRD 中通过
tracker.spec.http.auth.secretFrom 引用 Secret 注入。
worker.mode 支持:
local: 直接在 controller 所在环境启动执行ssh: 按worker.ssh_hosts选择远端 hostkubernetes: 创建 worker Pod 执行单次任务
Kubernetes 模式下,常用字段位于 worker.kubernetes:
namespaceimageserviceAccountNameimagePullPolicypodLabelspodAnnotations
Tracker.spec 现在同时覆盖 webhook 驱动入口与主动轮询补偿两类入口。
产品设计上以 webhook 为主,轮询主要用于 provider 能力不足、刷新补偿或回填。
当前最完整的默认流程仍然是 issue 触发编码任务,但统一事件模型也面向:
- pull / merge request 跟进
- push / tag 触发的仓库自动化
- release 流程与其他 CI/CD 风格任务
主要字段包括:
kind: http: 通用 HTTP trackerhttp.endpoint/http.headers/http.auth: HTTP 连接和认证issue.path/issue.method/issue.query/issue.headers: issue 类入口的拉取请求定义issue.fields.*: 从 HTTP JSON 响应提取统一 issue 字段的路径定义issue.activeStates/issue.terminalStates: issue 类调度状态判定polling.intervalMilliseconds: 主动抓取或补偿刷新周期webhook.enabled: 是否启用 webhook 匹配webhook.provider: webhook 来源提供方,当前支持github/gitlabwebhook.port: 记录期望的 webhook 端口配置webhook.secretFrom: 引用 webhook 验签 Secretwebhook.resourceTypes/webhook.actions: 允许的统一资源事件和动作webhook.sources: 允许的来源标识,如owner/repo或group/project
WorkflowTemplate 用于声明 webhook 命中后的实例模板:
spec: 与Workflow.spec结构一致,定义模板的 trackers 与 dag
Webhook 处理链路如下:
- 外部系统向
/api/v1/webhooks/:provider发送 GitHub 或 GitLab 事件 Tracker根据 provider、签名、source、resourceType、action 完成匹配- 命中的
WorkflowTemplate被实例化为新的Workflow - 新实例会进入现有
Workflowreconciler 的调度、重试与状态收敛流程
仓库仍保留 legacy YAML 示例,位于:
config/config.yamlconfig/github.yamlconfig/gitlab.yaml
这些示例现在都使用统一的 HTTP tracker 结构,可继续用来验证配置转换逻辑:
go run ./cmd/orchestra validate-config --config ./config/config.yaml
go run ./cmd/orchestra print-config --config ./config/config.yamlorchestra 使用 github.com/charmbracelet/log 输出结构化日志。
可通过 --log-level 和 --log-format 控制输出格式。
Workflow.status 当前会暴露:
conditionsobservedGenerationrunningCountretryingCountrunning[]retrying[]lastConfigErrorlastTrackerError
go test ./...Controller 集成测试基于 envtest,首次运行会自动下载 apiserver/etcd 测试二进制到本机的 envtest 缓存目录。
docs/SPEC.md是规范来源config/crd/bases/orchestra.zhubby.dev_{trackers,agents,workflows,workflowtemplates}.yaml是当前 CRD 契约config/config.yaml及其同级示例主要用于 legacy 配置调试- 当前设计目标是 webhook-first 的通用 Codex agent 基础设施,而非 Linear-only 或 polling-first 的 issue scheduler
- CLI 基于 Cobra;Kubernetes 运行时基于 controller-runtime