ci(nvskills): add NVSkills CI dispatch workflow - #9998
Conversation
Vendors the NVCARPS/NVSkills team-request reusable workflow from NVIDIA/skills and wires a thin caller so PR comments (`/nvskills-ci`) and bot signature commits in this repo can dispatch NVSkills CI on NVIDIA/nvskills-ci. Watched paths match the upstream-supported set (`skills/`, `team-skills/`, `rules/team-rules/`, `plugins/`). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Signed-off-by: Dan Gil <dagil@nvidia.com>
WalkthroughTwo new GitHub Actions workflows add conditional NVSkills CI dispatch: nvskills-ci.yml triggers on push and issue_comment events with minimal permissions, delegating to nvskills-team-request.yml, which validates requester permissions, resolves PR context, checks for changes in watched directories, and conditionally dispatches to the external NVIDIA/nvskills-ci workflow. ChangesNVSkills CI Workflow Integration
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
🧹 Nitpick comments (1)
.github/workflows/nvskills-team-request.yml (1)
138-144: 💤 Low valueConsider using heredoc syntax for
commit_titleoutput.If a commit title contains
%,=, or other characters that GitHub Actions interprets specially in output strings, the value could be truncated or malformed. Using heredoc syntax is more robust:{ echo "should_dispatch=true" echo "pr_number=${pr_number}" echo "head_sha=${head_sha}" echo "base_ref=${base_ref}" echo 'commit_title<<EOF' printf '%s' "${commit_title}" echo echo 'EOF' } >> "${GITHUB_OUTPUT}"That said, the current approach is likely fine for typical commit titles.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.github/workflows/nvskills-team-request.yml around lines 138 - 144, The current block that appends variables to "${GITHUB_OUTPUT}" can break if commit_title contains special chars; change the way commit_title is written by using heredoc syntax: keep echo lines for should_dispatch, pr_number, head_sha, base_ref as-is, then write a heredoc marker like 'commit_title<<EOF' to GITHUB_OUTPUT, emit the raw commit_title via printf '%s' "${commit_title}" (followed by a newline) and close the heredoc with EOF before redirecting, ensuring commit_title is preserved; reference the variables commit_title, pr_number, head_sha, base_ref and the output target "${GITHUB_OUTPUT}" when making the change.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In @.github/workflows/nvskills-team-request.yml:
- Around line 138-144: The current block that appends variables to
"${GITHUB_OUTPUT}" can break if commit_title contains special chars; change the
way commit_title is written by using heredoc syntax: keep echo lines for
should_dispatch, pr_number, head_sha, base_ref as-is, then write a heredoc
marker like 'commit_title<<EOF' to GITHUB_OUTPUT, emit the raw commit_title via
printf '%s' "${commit_title}" (followed by a newline) and close the heredoc with
EOF before redirecting, ensuring commit_title is preserved; reference the
variables commit_title, pr_number, head_sha, base_ref and the output target
"${GITHUB_OUTPUT}" when making the change.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 08a61852-b98d-48a8-adae-b9239bf6419e
📒 Files selected for processing (2)
.github/workflows/nvskills-ci.yml.github/workflows/nvskills-team-request.yml
dmitry-tokarev-nv
left a comment
There was a problem hiding this comment.
Review summary
Reviewed the vendored reusable workflow and the thin caller. Design and security gates look reasonable; the main blocker is missing SPDX headers, which will fail the copyright-checks job. A few should-fix and nit-level items are left inline.
Criticality legend
- Blocker — must address before merge (will fail CI or break expected behavior).
- Should fix — correctness/robustness gap; address before merge unless explicitly deferred.
- Nit — cosmetic, optional hardening, or stylistic.
Findings
Blockers
- Missing SPDX header on both new workflow files (
copyright-check.ps1enforces.yml/.yaml). Inline suggestions provided.
Should fix
- Unbounded pagination loop in
Resolve request context(nvskills-team-request.yml:107). Inline suggestion bounds it at 30 pages. - Push-path trust model relies only on
github.actor+ commit title — no branch scoping and no verification that the bot push went through branch protection. Consider scopingpush:bybranches:(PR description already flags this) and confirm the dispatch PAT is minimally scoped onNVIDIA/nvskills-ci.
Nits
startsWith(github.event.comment.body, '/nvskills-ci')also matches/nvskills-ci-anything. Inline suggestion tightens to an anchored token (or exact match).cancel-in-progress: trueon the push path can kill an in-flight dispatch if the bot rapidly re-pushes its signature commit. Inline note.- Caller (
nvskills-ci.yml) has noif:short-circuit, so everyissue_commentandpushreaches the reusable workflow. Cheap, but trivially avoidable. - Vendored from
NVIDIA/skills/.github/workflows/team-request.yml; a# Vendored from <repo>@<sha>header would aid future syncs.
Notes (not actionable)
- Token hygiene is good:
github.token(read-only) for API reads, dedicatedNVSKILLS_CI_DISPATCH_TOKENfor cross-repo dispatch, minimal workflow-level permissions. - Permission gate on the
issue_commentpath correctly requiresadmin|maintain. issue_comment: [created](notedited) correctly prevents replay via comment edit.- No third-party actions; only local reusable workflow + bash
run:steps. Matches the repo's enterprise allowlist. - Commit is DCO-signed; GPG sig shows
E(unverified key) — non-blocking but flag for visibility.
- Add SPDX headers on both workflow files to satisfy copyright-checks and match repo convention. - Note the upstream source/SHA in team-request.yml for future syncs. - Tighten /nvskills-ci comment match to anchored token (no prefix bleed into /nvskills-cix). - Make cancel-in-progress conditional on issue_comment so back-to-back bot signature pushes aren't aborted mid-dispatch; split concurrency group by event_name. - Bound the PR-files pagination loop at GitHub's 3000-file (30 page) cap so a misbehaving API can't loop indefinitely. Push-path branch scoping and dispatch-token-scope confirmation remain deferred follow-ups, as noted in the PR description. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Signed-off-by: Dan Gil <dagil@nvidia.com>
NVIDIA/skills declares `SPDX-License-Identifier: Apache-2.0 AND CC-BY-4.0` in its LICENSE file (Apache-2.0 for code/configuration, CC-BY-4.0 for documentation). Reflect the same dual identifier on the vendored files instead of Apache-2.0 alone. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Signed-off-by: Dan Gil <dagil@nvidia.com>
NVIDIA/nvskills-ci's onboarded-repositories.json policy expects request workflows at the canonical path .github/workflows/request-nvskills-ci.yml. PR #9998 landed our wrapper as .github/workflows/nvskills-ci.yml, which collides with the destination workflow's name and is rejected by the downstream validator with: Request workflow path '.github/workflows/nvskills-ci.yml' is not allowed Rename the wrapper to request-nvskills-ci.yml and update the in-workflow 'name:' from "NVSkills CI" to "Request NVSkills CI" — matches the upstream template at NVIDIA/nvskills-ci/templates/team-request-workflow.yml and disambiguates from the validation workflow on the other side. No behavior change. Same triggers, same secret, same callee. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Signed-off-by: Dan Gil <dagil@nvidia.com>
Summary
NVIDIA/skills/.github/workflows/team-request.ymlas.github/workflows/nvskills-team-request.yml(reusable workflow, watched paths kept identical to the upstream-supported set:skills/,team-skills/,rules/team-rules/,plugins/)..github/workflows/nvskills-ci.ymlas a thin caller that fires onissue_comment(created) andpush, invoking the reusable workflow and passingNVSKILLS_CI_DISPATCH_TOKENthrough.NVSKILLS_CI_DISPATCH_TOKENhas already been set onai-dynamo/dynamo.Notes
/nvskills-ciPR-comment trigger only fires when the workflow file is on the default branch, so the comment dispatch path won't be live until this PR is merged tomain. Thepushsignature-commit path will work on this branch once merged.skills/,team-skills/,rules/team-rules/,plugins/) exist in this repo yet, so until they're added (e.g. via the.agents/skills/canonical layout), every run skips with the "no changes" summary.push:is currently unscoped; the job-levelif:filters to the bot's signature commit. If the queued-but-skipped runs are noisy we can scope bybranches:later.Test plan
mainand confirm the workflow appears in Actions onai-dynamo/dynamo./nvskills-cifrom a maintainer/admin account and verify a dispatch is sent toNVIDIA/nvskills-ci/.github/workflows/nvskills-ci.yml.nv-nvskill-ci[bot]pushing theAttach NVSkills validation signaturescommit) successfully dispatches.🤖 Generated with Claude Code
Summary by CodeRabbit