Skip to main content

GitHub Actions runner as a schedulable Python sandbox via WebSocket remote objects

Project description

WorkflowVM

将 GitHub Actions 免费 Ubuntu Runner 化身为可调度的云端 Python 沙盒

License Workflow Status Release PyPI version

Docker Image version Docker Image size Last Commit


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 模块(因此可以直接调用 openprint 等内置函数)。使用 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

workflowvm-0.2.3.tar.gz (27.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

workflowvm-0.2.3-py3-none-any.whl (24.8 kB view details)

Uploaded Python 3

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

Hashes for workflowvm-0.2.3.tar.gz
Algorithm Hash digest
SHA256 be30ffe5cc8cc4eebf74fd361ac37cf49fed9138e17f52c19829ca9cb1562952
MD5 beb0777bc97f40fb7235d3eea291eeea
BLAKE2b-256 9a8bca73769e62f559bf5088b48977f9114c4b2b9e995cbb36cacce80940e319

See more details on using hashes here.

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

Hashes for workflowvm-0.2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 376e3dfd8c9d0e41e4c9d8e4b8f3e154e2d08fb0a22321eedf995a34aab3ed1f
MD5 5f10ad95eb30cc4492202d050ee758a7
BLAKE2b-256 06c66e520db97496dcc8c99391d61762b30587a75d7c7041e3c1968d1b6d3883

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page