6.5 KiB
Runtime Version Worker Pipeline Integration
Date: 2026-02-26
Summary
Integrated the runtime version system into the worker execution pipeline, enabling version-aware action execution. When an action declares a runtime_version_constraint (e.g., ">=3.12"), the worker now automatically selects the best matching runtime version and uses its version-specific interpreter, environment commands, and configuration.
Changes Made
1. Version-Aware Execution Context (crates/worker/src/runtime/mod.rs)
Added three new fields to ExecutionContext:
runtime_config_override: Option<RuntimeExecutionConfig>— version-specific execution config that overrides the parent runtime's configruntime_env_dir_suffix: Option<String>— directory suffix for per-version environment isolation (e.g.,"python-3.12")selected_runtime_version: Option<String>— selected version string for logging/diagnostics
2. Runtime Version Resolution in Executor (crates/worker/src/executor.rs)
Added resolve_runtime_version() method to ActionExecutor that:
- Queries
runtime_versionrows for the action's runtime from the database - Calls
select_best_version()with the action'sruntime_version_constraint - Returns the selected version's
execution_config, env dir suffix, and version string - Gracefully handles missing versions, failed queries, and unmatched constraints with warnings
The method is called during prepare_execution_context() and the results are passed through the ExecutionContext to the ProcessRuntime.
3. Version-Aware ProcessRuntime (crates/worker/src/runtime/process.rs)
Modified ProcessRuntime::execute() to:
- Use
effective_config(eithercontext.runtime_config_overrideorself.config) - Compute version-specific environment directories when
runtime_env_dir_suffixis present - Use version-specific interpreter resolution, environment variables, and interpreter args
- Recreate broken environments using the effective (possibly version-specific) config
- Log the selected version in all execution diagnostics
4. Runtime Version Verification (crates/worker/src/version_verify.rs)
New module that verifies which runtime versions are available on the system at worker startup:
- Extracts verification commands from
distributions.verification.commandsJSONB - Runs each command with proper timeout handling (10s per command)
- Matches exit codes and output patterns (regex-based)
- Updates
availableandverified_atcolumns in the database - Respects
ATTUNE_WORKER_RUNTIMESfilter (alias-aware) - Falls back to
binary --versioncheck when no explicit verification commands exist - Includes 8 unit tests for command extraction and verification logic
5. Version-Aware Environment Setup (crates/worker/src/env_setup.rs)
Extended the proactive environment setup system to create per-version environments:
- At startup scan: creates environments at
{runtime_envs_dir}/{pack_ref}/{runtime_name}-{version}for each available version - On
pack.registeredMQ events: creates per-version environments alongside base environments - Each version environment uses the version's own
execution_config(different interpreter binary, venv create command, etc.) - Base (unversioned) environments are still created for backward compatibility
6. Worker Startup Sequence (crates/worker/src/service.rs)
Updated the startup sequence to include version verification before environment setup:
- Connect to DB and MQ
- Load runtimes → create ProcessRuntime instances
- Register worker and set up MQ infrastructure
- NEW: Verify runtime versions (run verification commands, update
availableflags) - Set up runtime environments (now version-aware)
- Start heartbeat, execution consumer, pack registration consumer
7. Test Updates
Updated all ExecutionContext initializations across the workspace to include the new fields:
crates/worker/src/runtime/process.rs— 8 test contextscrates/worker/src/runtime/local.rs— 2 test contextscrates/worker/src/runtime/python.rs— 4 test contextscrates/worker/src/runtime/shell.rs— 8 test contextscrates/worker/tests/dependency_isolation_test.rs— 1 test contextcrates/worker/tests/log_truncation_test.rs— 3 test contextscrates/worker/tests/security_tests.rs— 8 test contexts
Also fixed pre-existing missing env_vars fields in RuntimeExecutionConfig initializations in test helper functions.
Architecture
Action with runtime_version_constraint=">=3.12"
│
▼
ActionExecutor::prepare_execution_context()
│
├── Load runtime model (e.g., "Python")
├── Query RuntimeVersion rows for that runtime
├── select_best_version(versions, ">=3.12")
│ └── Returns Python 3.13 (highest available matching >=3.12)
├── Set runtime_config_override = version's execution_config
├── Set runtime_env_dir_suffix = "python-3.13"
└── Set selected_runtime_version = "3.13"
│
▼
ProcessRuntime::execute(context)
│
├── effective_config = context.runtime_config_override (python3.13 config)
├── env_dir = /opt/attune/runtime_envs/{pack}/python-3.13
├── interpreter = python3.13 (from version-specific config)
└── Execute action with version-specific setup
Environment Directory Layout
/opt/attune/runtime_envs/
└── my_pack/
├── python/ # Base (unversioned) environment
├── python-3.11/ # Python 3.11 specific environment
├── python-3.12/ # Python 3.12 specific environment
├── python-3.13/ # Python 3.13 specific environment
├── node/ # Base Node.js environment
├── node-18/ # Node.js 18 specific environment
├── node-20/ # Node.js 20 specific environment
└── node-22/ # Node.js 22 specific environment
Dependencies Added
regex(workspace dependency, already inCargo.toml) added toattune-workerfor verification pattern matching
Test Results
- All 93 worker unit tests pass
- All 17 dependency isolation tests pass
- All 8 log truncation tests pass
- All 7 security tests pass
- All 33 version matching tests + 2 doc tests pass
- Zero compiler warnings across the workspace
What's Next
- API/UI endpoints for runtime version management (list, verify, toggle availability)
- Sensor service integration with version-aware runtime selection
- Runtime version auto-detection at pack install time (not just worker startup)