Skip to content

fix(ci): restrict code-cleanup workflow to Linux runners only#1948

Merged
leshy merged 3 commits intodevfrom
fix/code-cleanup-linux-only
May 1, 2026
Merged

fix(ci): restrict code-cleanup workflow to Linux runners only#1948
leshy merged 3 commits intodevfrom
fix/code-cleanup-linux-only

Conversation

@spomichter
Copy link
Copy Markdown
Contributor

Problem

code-cleanup.yml uses runs-on: self-hosted which matches all self-hosted runners — including the macOS EC2 runner. That runner runs as ec2-user (home: /Users/ec2-user) and actions/setup-python tries to create /Users/runner/ which doesn't exist, causing:

Error: mkdir: /Users/runner: Permission denied
Error: The process '/bin/bash' failed with exit code 1

This has been failing 4+ times on PRs including #1925 and #1940.

Fix

One line:

# before
runs-on: self-hosted

# after  
runs-on: [self-hosted, Linux]

Consistent with tests.yml and docker.yml which already scope to [self-hosted, Linux].

Scope

No logic changes. Zero risk.

Workflow was using `runs-on: self-hosted` which matches all
self-hosted runners including macOS. The macOS EC2 runner (ec2-user)
fails because actions/setup-python tries to create /Users/runner/
which doesn't exist on that instance.

Restrict to `[self-hosted, Linux]` consistent with tests.yml and
docker.yml.
@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Apr 30, 2026

Greptile Summary

Adds Linux label to the runs-on array in code-cleanup.yml, narrowing runner selection from all self-hosted runners to Linux-only. This matches the existing pattern in tests.yml and docker.yml and directly fixes the permission error (mkdir: /Users/runner: Permission denied) that caused repeated failures on macOS EC2 runners.

Confidence Score: 5/5

Safe to merge — one-line runner label addition with zero logic changes.

The change is minimal, targeted, and consistent with the existing runner configuration pattern across other workflow files in the repo. No logic, permissions, or step ordering is modified.

No files require special attention.

Important Files Changed

Filename Overview
.github/workflows/code-cleanup.yml Single-line fix: runs-on: self-hostedruns-on: [self-hosted, Linux], aligning runner targeting with the rest of the CI workflows and preventing macOS runner mismatches.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[PR Event Triggered] --> B{Runner Selection}
    B -- "Before: runs-on: self-hosted" --> C[Any self-hosted runner]
    C --> D[macOS EC2 runner\nec2-user home: /Users/ec2-user]
    C --> E[Linux runner]
    D --> F["❌ mkdir: /Users/runner: Permission denied\nWorkflow fails"]
    E --> G[✅ Workflow succeeds]
    B -- "After: runs-on: [self-hosted, Linux]" --> H[Linux runner only]
    H --> I[✅ Workflow succeeds]
Loading

Reviews (3): Last reviewed commit: "Merge branch 'dev' into fix/code-cleanup..." | Re-trigger Greptile

@leshy leshy enabled auto-merge (squash) April 30, 2026 06:47
@leshy leshy merged commit d2f1cbc into dev May 1, 2026
4 checks passed
@leshy leshy deleted the fix/code-cleanup-linux-only branch May 1, 2026 03:19
Nabla7 added a commit that referenced this pull request May 6, 2026
…whole_body coordinator + async modules + setup_logger

Brings in 15 PRs from dev (May 1 - May 6).  Headline incoming changes:

* #1954 (Mustafa) - G1 low-level connection module coordinator
  integration: WHOLE_BODY HardwareType, _create_whole_body_adapter
  on ControlCoordinator, ConnectedWholeBody on hardware_interface,
  whole_body/registry.py, whole_body/transport/adapter.py,
  unitree_g1_coordinator blueprint, MotorCommandArray msg.
* #1920 - async modules (additive: async def handle_x, async @rpc,
  async def main, self.spawn(), self.process_observable()).
* #1895 - setup_logger enforcement (test scans for stray
  logging.getLogger outside whitelist).
* #1939 - patrol module converted to async (skill dispatcher
  handles sync->async transparently).
* #1958 - MuJoCo sim teleop for xarm + piper.
* #1885 - go2 SDK adapter + nix cyclonedds setup.
* Plus #1880 (dtop), #1713 (tool-streams), #1925 (memory2 go2
  autorecorder), #1948/#1944 (CI), #1909 (peek_stream),
  #1924 (revert), #1921 (mypy 3.10 fixes).

Conflict resolutions
--------------------
* dimos/hardware/whole_body/spec.py - UNION write.  Took both our
  WholeBodyConfig dataclass + read_odom() (default None) and
  Mustafa's has_motor_states().  Updated SimMujocoG1WholeBodyAdapter
  to implement has_motor_states (returns True once SHM is attached).
* dimos/hardware/whole_body/registry.py - adopted Mustafa's pattern
  (Callable[..., WholeBodyAdapter] factory + setup_logger), extended
  discover() with depth=2 walk so both their flat ("transport/")
  and our nested ("mujoco/g1/") layouts both register.
* dimos/control/coordinator.py - kept our TaskConfig.decimation +
  passthrough; took Mustafa's WholeBodyAdapter union types and
  WHOLE_BODY branch in _setup_hardware (cleaner than our lazy
  imports).
* dimos/control/hardware_interface.py - adopted Mustafa's
  _try_initialize_last_commanded (gates on has_motor_states for
  real-hw cold start) + ControlMode validation.  Kept our
  per-joint kp/kd resolution from component.wb_config.
* dimos/control/components.py - joint-naming convention switched
  from PascalCase + "_" separator to Mustafa's snake_case + "/"
  separator (g1/left_hip_pitch instead of g1_LeftHipPitch).  Kept
  our _QUADRUPED_LEG_JOINTS + make_quadruped_joints helper.
* dimos/visualization/viser/robot_meshes.py:dimos_joint_to_mjcf -
  rewritten for the new naming: split on "/", append "_joint".
  Dropped the camelCase->snake regex.
* dimos/robot/catalog/g1.py - _LEFT_ARM_JOINT_PAIRS /
  _RIGHT_ARM_JOINT_PAIRS updated to new joint names; manipulation
  module's joint lookup against the coordinator's published state
  now hits.
* dimos/robot/all_blueprints.py - kept both unitree-g1-coordinator
  (Mustafa's) and unitree-g1-dds-coordinator (ours) entries.
* dimos/hardware/drive_trains/unitree_go2/adapter.py +
  dimos/robot/unitree/go2/blueprints/basic/unitree_go2_keyboard_teleop.py
  - added-by-both; took dev's canonical Go2 adapter from #1885.
* logging.getLogger -> setup_logger in 6 files (control/examples/
  g1_playback.py, g1_zero_posture.py, go2_standup.py;
  visualization/viser/scene_editor.py;
  hardware/whole_body/unitree/g1/adapter.py + go2/adapter.py).
* pyproject.toml: dropped duplicate unitree-dds key from auto-merge,
  kept dev's newer unitree-sdk2py-dimos>=1.0.2.  uv.lock regenerated
  via uv sync.

Verification
------------
* Blueprint composes: unitree_g1_groot_wbc_sim imports cleanly.
* dimos/project/test_get_logger.py passes (no stray logging.getLogger).
* Smoke test: dimos run unitree-g1-groot-wbc-sim launches all 19
  modules and ControlCoordinator stabilizes at 50 Hz.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants