GitHub Actions runner as a schedulable Python sandbox via WebSocket remote objects
Project description
WorkflowVM 允许你通过 WebSocket 远程对象协议,从服务器端透明地操作远程 Python 环境。轻松调度 GitHub 算力池进行沙盒测试、分布式任务或其他高并发场景。
核心特性
- 免费云算力:无缝对接 GitHub Actions,零成本调度 Ubuntu Runner。
- 透明 RPC 调用:像操作本地对象一样,在本地代码中直接操作远端 Python 环境(包含内置函数与模块导入)。
- 自动生命周期:内置连接保活机制,自动分配、保活和释放 Runner 资源。
前置准备:GitHub Token
你需要一个具有特定权限的 Classic PAT (Personal Access Token)。 前往 GitHub Developer Settings 生成 Token,并确保勾选以下权限:
repo- 完整仓库访问权限(用于创建 runner 仓库)。workflow- 触发workflow_dispatch(必需,用于调度 Runner)。
快速开始
1. 配置账号池
创建一个 accounts.yml 文件,配置你的 GitHub 账号信息与服务端设置:
accounts:
- username: your-github-username
token: ghp_YOUR_CLASSIC_PAT # 必须包含 repo + workflow 权限
runner_repo: wvm-runner # 将自动创建此仓库
max_concurrent: 5 # 最大并发 runner 数量
server:
host: 0.0.0.0
port: 8765
api_token: "your-server-api-token"
# ws_url: "wss://your-domain.com" # 反代时配置,agent 用此地址反连;默认 ws://host:port
2. 初始化 Runner 仓库
使用 CLI 工具自动初始化(自动为 accounts.yml 中的每个账号创建仓库并推送 workflow 文件):
workflowvm setup --config accounts.yml
提示:
workflowvm serve启动时也会自动执行此初始化检测。
3. 启动服务器
你可以选择通过原生 Python 或 Docker 启动调度服务器:
选项 A:直接安装运行
pip install workflowvm
workflowvm serve --config accounts.yml
选项 B:使用 Docker
docker compose up -d
4. SDK 调用示例
服务启动后,就可以在你的 Python 代码中无缝调用云端沙盒了:
import workflowvm
# 连接到你的调度服务器
ctrl = workflowvm.Controller(
"wss://your-server:8765",
token="your-server-api-token",
)
# 申请分配一个云端沙盒实例
vm = ctrl.acquire(timeout=120, max_duration=300)
# ----------------- 透明远程对象操作 -----------------
# 1. 导入远程模块(使用 _AgentRoot 提供的无 dunder 别名 import_)
vm.os = vm.import_("os")
print(vm.os.system("whoami")) # 在 GitHub Actions runner 上执行并打印结果
# 2. 直接使用内置函数(open, print 等均被透传)
f = vm.open("/etc/hostname")
content = f.read()
print(vm._repr(content)) # 输出类似: 'runner-hostname\n'
# 释放资源
vm.release()
# ----------------- 推荐:使用 with 语句自动管理 -----------------
with ctrl.acquire(timeout=120, max_duration=300) as vm:
result = vm.import_("platform")
print(vm._repr(result.system()))
架构设计与底层机制
WorkflowVM 的架构采用典型的 C/S 配合反向连接模型:
SDK (调用方)
└─ Controller.acquire() → 获得 RemoteVM 句柄
└─ 调度服务器 (WebSocket Server + 账号池 + 实例池)
└─ 调用 GitHub API (workflow_dispatch)
└─ 启动 GitHub Actions Ubuntu runner
└─ agent.py → 主动反连 WebSocket 服务器
- 连接保活 (Keep-Alive):SDK 每 15 秒会通过
ping操作发送应用层心跳,防止 Caddy 等反向代理因空闲切断连接。所有 WebSocket I/O 均运行在独立后台线程的 Event Loop 中,确保即使在 REPL 空闲期间 ping/pong 也能正常响应。 - 根命名空间 (Root Namespace):Agent 端
obj_id=0是一个_AgentRoot实例。它支持自定义属性赋值,未找到的方法会优雅回退到 Python 的builtins模块(因此可以直接调用open、print等内置函数)。使用import_作为__import__的别名,避免了 dunder 方法带来的冲突问题。
CLI 命令参考
| 命令 | 功能说明 |
|---|---|
workflowvm serve --config <file> |
启动 WebSocket 调度服务器 |
workflowvm setup --config <file> |
初始化并验证所有 Runner 仓库状态 |
workflowvm-agent --server <url> --token <tok> --duration <sec> |
在 Runner 内运行 Agent(通常由 GitHub Workflow 自动执行,无需手动调用) |
测试
运行以下命令执行单元测试:
pytest tests/ -v
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file workflowvm-0.2.3.tar.gz.
File metadata
- Download URL: workflowvm-0.2.3.tar.gz
- Upload date:
- Size: 27.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
be30ffe5cc8cc4eebf74fd361ac37cf49fed9138e17f52c19829ca9cb1562952
|
|
| MD5 |
beb0777bc97f40fb7235d3eea291eeea
|
|
| BLAKE2b-256 |
9a8bca73769e62f559bf5088b48977f9114c4b2b9e995cbb36cacce80940e319
|
File details
Details for the file workflowvm-0.2.3-py3-none-any.whl.
File metadata
- Download URL: workflowvm-0.2.3-py3-none-any.whl
- Upload date:
- Size: 24.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
376e3dfd8c9d0e41e4c9d8e4b8f3e154e2d08fb0a22321eedf995a34aab3ed1f
|
|
| MD5 |
5f10ad95eb30cc4492202d050ee758a7
|
|
| BLAKE2b-256 |
06c66e520db97496dcc8c99391d61762b30587a75d7c7041e3c1968d1b6d3883
|