feat(ci): auto-detect and install root requirements.txt via pip - #1
Merged
Conversation
Repo guidance for Claude Code covering architecture, versioning conventions, and known GitHub Actions quirks.
Some rosdep keys aren't resolvable (e.g. python3-open3d-pip). Mirror the existing apt_dependencies auto-detection: an optional requirements.txt at the consumer repo root is pip installed (full dependency tree, --break-system-packages) via AFTER_INSTALL_TARGET_DEPENDENCIES, after rosdep target deps are in place. No-op when the file is absent, so existing @v1 consumers are unaffected.
duatic_skills' jazzy build hangs ~29min inside industrial_ci's colcon_setup apt-get step on the self-hosted runner, both before and after the requirements.txt change, so it isn't caused by this PR. Add before/after df/free/docker snapshots plus a 15s-interval background poller (uploaded as an artifact via if: always(), since that survives job cancellation) to see whether disk/memory is exhausted during the hang. Remove once root-caused.
Host resources (disk/memory) stayed completely flat for the full ~29min of the duatic_skills hang, which means colcon_setup's apt-get is genuinely blocked, not slow. builder_setup in industrial_ci does nothing but that single apt-get call, and debconf is already set to noninteractive during init, so the likely culprit is a maintainer script blocking on something like systemctl/dbus during dpkg trigger processing (common when a container has no init system running). Poll `docker exec <cid> ps auxf` alongside the existing resource monitor to see which process is actually stuck next run.
vcs import still hangs identically on the same private repos' git ls-remote after CI_PAT was added to duatic_skills, which could mean either the secret isn't reaching this job (misconfigured scope, wrong repo/org level) or it reaches but doesn't have access to those repos (fails auth, falls back to the same interactive-prompt hang). Add a boolean-only echo of secrets.CI_PAT presence, plus a count of git global insteadOf rules configured inside the container (from BEFORE_INIT), to tell the two cases apart without printing the token.
Root-caused: duatic_skills' hang was two separate, repo-side issues, not a defect in this shared workflow -- a missing/misnamed CI_PAT secret (git blocked on an unanswerable credential prompt) and a stale repos.list pointing at two repos that had since been merged into duatic_dynaarm. Neither needed a change here, so drop the scaffolding.
open3d's dependency tree wants a newer typing_extensions than the one apt/debian installed on the base image. pip can't uninstall a debian-managed package (no RECORD file), so it fails with "Cannot uninstall typing_extensions ..., RECORD file not found". --ignore-installed makes pip install its own copy alongside instead of trying to uninstall the OS-managed one first -- the standard workaround for --break-system-packages installs colliding with apt.
5 tasks
pre-commit was skipped whenever a single distro was chosen (manual dispatch or targeted rebuild), so linting only ran on the default "all" path. Lint checks aren't tied to which distro is being built, so run them unconditionally (still skipped on draft PRs).
Match duatic_dynaarm's public-facing repo conventions: BSD-3-Clause LICENSE and a CONTRIBUTING.md covering contribution/licensing terms. The tooling section is adapted for this repo specifically, since it has no pre-commit config of its own -- points at the syntax-check and consumer-dispatch validation steps instead.
Adds a .pre-commit-config.yaml scoped to what this repo actually contains (workflow YAML, docs) -- standard hygiene hooks, actionlint for GitHub Actions-specific linting, and codespell. A new self-check.yml workflow dogfoods the repo's own pre-commit.yml leaf workflow on every PR/push to main, since previously this repo had no CI of its own.
Updated README.md for clarity and consistency.
Nested .github/ci/apt_dependencies didn't match the requirements.txt convention (repo root). Move it to an Aptfile at the consumer repo root, same format (one package per line, # comments allowed), so both optional dependency files live in the same obvious place. No existing consumer repo has the old file, so this is a clean rename.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
.github/ci/apt_dependenciesauto-detection: an optionalrequirements.txtat the consumer repo root is now
pip installed (full dependency tree,--break-system-packages)via
AFTER_INSTALL_TARGET_DEPENDENCIES, after rosdep target deps are installed.workflow_callinput — detection only, matching therepos.list/apt_dependenciesprecedent. No-op when
requirements.txtis absent, so existing@v1consumers (e.g.duatic_helpers) are unaffected.duatic_skills, which needsopen3d(not a resolvable rosdep key) and previouslyhardcoded the pip install per-repo in its own copy of
reusable_ici.yml.Test plan
python3 -c "import yaml; yaml.safe_load(open('.github/workflows/reusable_ici.yml'))"Duatic/duatic_skills#<PR>, pinned to this branch's commit SHA,watched with
gh run watch --repo Duatic/duatic_skills --exit-statusv1.2.0and movev1(per this repo'sCLAUDE.mdrelease flow)