Skip to content

Commit 274dbe6

Browse files
Merge branch 'develop' into antoine/document-kamino-tutorial
2 parents d85fc21 + 2644c1e commit 274dbe6

100 files changed

Lines changed: 1788 additions & 978 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/build.yaml

Lines changed: 82 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ env:
7171

7272
jobs:
7373
changes:
74-
name: Detect Docker Test Changes
74+
name: Detect Changes
7575
runs-on: ubuntu-latest
7676
outputs:
7777
run_docker_tests: ${{ steps.detect.outputs.run_docker_tests }}
@@ -80,22 +80,96 @@ jobs:
8080
env:
8181
GH_TOKEN: ${{ github.token }}
8282
PR_NUMBER: ${{ github.event.pull_request.number }}
83+
EVENT_NAME: ${{ github.event_name }}
84+
REPO: ${{ github.repository }}
8385
run: |
8486
set -euo pipefail
8587
86-
if [ "${{ github.event_name }}" != "pull_request" ]; then
87-
echo "run_docker_tests=true" >> "$GITHUB_OUTPUT"
88+
# Docker test jobs run only when paths in the patterns table change.
89+
# Otherwise they skip via `if:` and report green to branch protection,
90+
# which is why we don't use a workflow-level `paths:` filter (a
91+
# not-triggered required check would block the PR forever).
92+
# config.yaml is included because it controls the base image names and
93+
# tags consumed by the Docker build jobs.
94+
patterns=(
95+
$'^source/\tLibrary source code'
96+
$'^docker/\tContainer build inputs'
97+
$'^tools/\tBuild tooling'
98+
$'^apps/\tStandalone apps'
99+
$'^scripts/\tStandalone scripts'
100+
$'^\\.github/workflows/build\\.yaml$\tThis workflow file'
101+
$'^\\.github/workflows/config\\.yaml$\tBase image config'
102+
$'^\\.github/actions/\tCI actions'
103+
)
104+
triggered_jobs="Docker build + all test-* matrix jobs"
105+
106+
render_table() {
107+
local files="$1" entry regex desc count sample
108+
echo "| Pattern | What it covers | Matched files |"
109+
echo "|---|---|---|"
110+
for entry in "${patterns[@]}"; do
111+
IFS=$'\t' read -r regex desc <<< "$entry"
112+
count=$(printf '%s\n' "$files" | grep -cE "$regex" || true)
113+
if [ "$count" -gt 0 ]; then
114+
sample=$(printf '%s\n' "$files" | grep -E "$regex" | head -3 | paste -sd ', ' -)
115+
[ "$count" -gt 3 ] && sample="$sample (and $((count - 3)) more)"
116+
echo "| \`$regex\` | $desc | $sample |"
117+
else
118+
echo "| \`$regex\` | $desc | - |"
119+
fi
120+
done
121+
}
122+
123+
any_match() {
124+
local files="$1" entry regex
125+
for entry in "${patterns[@]}"; do
126+
IFS=$'\t' read -r regex _ <<< "$entry"
127+
if printf '%s\n' "$files" | grep -qE "$regex"; then
128+
return 0
129+
fi
130+
done
131+
return 1
132+
}
133+
134+
decide() {
135+
local decision="$1" reason="$2" files="${3:-}"
136+
echo "Decision: run_docker_tests=$decision ($reason)"
137+
echo "run_docker_tests=$decision" >> "$GITHUB_OUTPUT"
138+
{
139+
echo "## Docker test gating"
140+
echo ""
141+
if [ "$decision" = "true" ]; then
142+
echo "Docker tests will **run**: $reason."
143+
else
144+
echo "Docker tests will be **skipped**: $reason."
145+
fi
146+
echo ""
147+
echo "Triggered jobs: $triggered_jobs."
148+
if [ -n "$files" ]; then
149+
echo ""
150+
render_table "$files"
151+
fi
152+
} >> "$GITHUB_STEP_SUMMARY"
153+
}
154+
155+
if [ "$EVENT_NAME" != "pull_request" ]; then
156+
decide true "non-PR event ($EVENT_NAME)"
157+
exit 0
158+
fi
159+
160+
if ! changed_files="$(gh api --paginate "repos/$REPO/pulls/$PR_NUMBER/files" --jq '.[].filename')"; then
161+
# Fail-safe: a transient API error must not block merge. Default to running.
162+
echo "::warning::Could not list changed files; defaulting to running tests"
163+
decide true "fail-safe (could not list changed files)"
88164
exit 0
89165
fi
90166
91-
changed_files="$(gh api --paginate "repos/${{ github.repository }}/pulls/${PR_NUMBER}/files" --jq '.[].filename')"
92167
printf '%s\n' "$changed_files"
93168
94-
# config.yaml controls the base image names and tags consumed by the Docker build jobs.
95-
if printf '%s\n' "$changed_files" | grep -qE '^(source/|docker/|tools/|apps/|scripts/|\.github/workflows/build\.yaml$|\.github/workflows/config\.yaml$|\.github/actions/)'; then
96-
echo "run_docker_tests=true" >> "$GITHUB_OUTPUT"
169+
if any_match "$changed_files"; then
170+
decide true "relevant paths changed" "$changed_files"
97171
else
98-
echo "run_docker_tests=false" >> "$GITHUB_OUTPUT"
172+
decide false "no relevant paths changed" "$changed_files"
99173
fi
100174
101175
config:
@@ -531,100 +605,6 @@ jobs:
531605
container-name: isaac-lab-environments-training-test
532606
#endregion
533607

534-
docker-tests-gate:
535-
name: Docker Tests Gate
536-
runs-on: ubuntu-latest
537-
needs:
538-
- changes
539-
- build
540-
- build-curobo
541-
- test-isaaclab-tasks
542-
- test-isaaclab-tasks-2
543-
- test-isaaclab-tasks-3
544-
- test-isaaclab-core
545-
- test-isaaclab-core-2
546-
- test-isaaclab-core-3
547-
- test-isaaclab-rl
548-
- test-isaaclab-mimic
549-
- test-isaaclab-assets
550-
- test-isaaclab-contrib
551-
- test-isaaclab-teleop
552-
- test-isaaclab-visualizers
553-
- test-isaaclab-newton
554-
- test-isaaclab-physx
555-
- test-isaaclab-ov
556-
- test-curobo
557-
- test-skillgen
558-
- test-environments-training
559-
if: always()
560-
steps:
561-
- name: Check Docker test results
562-
env:
563-
CHANGES_RESULT: ${{ needs.changes.result }}
564-
RUN_DOCKER_TESTS: ${{ needs.changes.outputs.run_docker_tests }}
565-
BUILD_RESULT: ${{ needs.build.result }}
566-
BUILD_CUROBO_RESULT: ${{ needs.build-curobo.result }}
567-
TASKS_1_RESULT: ${{ needs.test-isaaclab-tasks.result }}
568-
TASKS_2_RESULT: ${{ needs.test-isaaclab-tasks-2.result }}
569-
TASKS_3_RESULT: ${{ needs.test-isaaclab-tasks-3.result }}
570-
CORE_1_RESULT: ${{ needs.test-isaaclab-core.result }}
571-
CORE_2_RESULT: ${{ needs.test-isaaclab-core-2.result }}
572-
CORE_3_RESULT: ${{ needs.test-isaaclab-core-3.result }}
573-
RL_RESULT: ${{ needs.test-isaaclab-rl.result }}
574-
MIMIC_RESULT: ${{ needs.test-isaaclab-mimic.result }}
575-
ASSETS_RESULT: ${{ needs.test-isaaclab-assets.result }}
576-
CONTRIB_RESULT: ${{ needs.test-isaaclab-contrib.result }}
577-
TELEOP_RESULT: ${{ needs.test-isaaclab-teleop.result }}
578-
VISUALIZERS_RESULT: ${{ needs.test-isaaclab-visualizers.result }}
579-
NEWTON_RESULT: ${{ needs.test-isaaclab-newton.result }}
580-
PHYSX_RESULT: ${{ needs.test-isaaclab-physx.result }}
581-
OV_RESULT: ${{ needs.test-isaaclab-ov.result }}
582-
CUROBO_RESULT: ${{ needs.test-curobo.result }}
583-
SKILLGEN_RESULT: ${{ needs.test-skillgen.result }}
584-
ENVIRONMENTS_TRAINING_RESULT: ${{ needs.test-environments-training.result }}
585-
run: |
586-
set -euo pipefail
587-
588-
if [ "$CHANGES_RESULT" != "success" ]; then
589-
echo "Change detection failed with result: $CHANGES_RESULT"
590-
exit 1
591-
fi
592-
593-
if [ "$RUN_DOCKER_TESTS" != "true" ]; then
594-
echo "Docker tests are not required for this change."
595-
exit 0
596-
fi
597-
598-
failures=()
599-
[ "$BUILD_RESULT" = "success" ] || failures+=("Build Base Docker Image: $BUILD_RESULT")
600-
[ "$BUILD_CUROBO_RESULT" = "success" ] || failures+=("Build cuRobo Docker Image: $BUILD_CUROBO_RESULT")
601-
[ "$TASKS_1_RESULT" = "success" ] || failures+=("isaaclab_tasks [1/3]: $TASKS_1_RESULT")
602-
[ "$TASKS_2_RESULT" = "success" ] || failures+=("isaaclab_tasks [2/3]: $TASKS_2_RESULT")
603-
[ "$TASKS_3_RESULT" = "success" ] || failures+=("isaaclab_tasks [3/3]: $TASKS_3_RESULT")
604-
[ "$CORE_1_RESULT" = "success" ] || failures+=("isaaclab (core) [1/3]: $CORE_1_RESULT")
605-
[ "$CORE_2_RESULT" = "success" ] || failures+=("isaaclab (core) [2/3]: $CORE_2_RESULT")
606-
[ "$CORE_3_RESULT" = "success" ] || failures+=("isaaclab (core) [3/3]: $CORE_3_RESULT")
607-
[ "$RL_RESULT" = "success" ] || failures+=("isaaclab_rl: $RL_RESULT")
608-
[ "$MIMIC_RESULT" = "success" ] || failures+=("isaaclab_mimic: $MIMIC_RESULT")
609-
[ "$ASSETS_RESULT" = "success" ] || failures+=("isaaclab_assets: $ASSETS_RESULT")
610-
[ "$CONTRIB_RESULT" = "success" ] || failures+=("isaaclab_contrib: $CONTRIB_RESULT")
611-
[ "$TELEOP_RESULT" = "success" ] || failures+=("isaaclab_teleop: $TELEOP_RESULT")
612-
[ "$VISUALIZERS_RESULT" = "success" ] || failures+=("isaaclab_visualizers: $VISUALIZERS_RESULT")
613-
[ "$NEWTON_RESULT" = "success" ] || failures+=("isaaclab_newton: $NEWTON_RESULT")
614-
[ "$PHYSX_RESULT" = "success" ] || failures+=("isaaclab_physx: $PHYSX_RESULT")
615-
[ "$OV_RESULT" = "success" ] || failures+=("isaaclab_ov: $OV_RESULT")
616-
[ "$CUROBO_RESULT" = "success" ] || failures+=("test-curobo: $CUROBO_RESULT")
617-
[ "$SKILLGEN_RESULT" = "success" ] || failures+=("test-skillgen: $SKILLGEN_RESULT")
618-
[ "$ENVIRONMENTS_TRAINING_RESULT" = "success" ] || failures+=("environments_training: $ENVIRONMENTS_TRAINING_RESULT")
619-
620-
if [ "${#failures[@]}" -gt 0 ]; then
621-
printf 'Docker checks did not pass:\n'
622-
printf ' - %s\n' "${failures[@]}"
623-
exit 1
624-
fi
625-
626-
echo "Docker checks passed."
627-
628608
#region disabled quarantined tests
629609
# test-quarantined:
630610
# name: "Quarantined Tests"

.github/workflows/check-links.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ on:
2222
- cron: '0 0 * * 0' # Every Sunday at midnight UTC
2323

2424
concurrency:
25-
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
25+
group: ${{ github.workflow }}-${{ github.ref }}
2626
cancel-in-progress: true
2727

2828
jobs:
@@ -101,6 +101,9 @@ jobs:
101101
--exclude 'huggingface\.co/nvidia/X-Mobility'
102102
--exclude 'openusd\.org'
103103
--exclude 'ubuntu\.com/server/docs'
104+
--exclude 'docs\.ray\.io'
105+
--exclude 'docs\.conda\.io'
106+
--exclude 'stackoverflow\.com'
104107
--max-retries 5
105108
--retry-wait-time 10
106109
--timeout 20

.github/workflows/docs.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ on:
1818
types: [opened, synchronize, reopened]
1919

2020
concurrency:
21-
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
21+
group: ${{ github.workflow }}-${{ github.ref }}
2222
cancel-in-progress: true
2323

2424
jobs:

.github/workflows/install-ci.yml

Lines changed: 80 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ on:
2424
default: ''
2525

2626
concurrency:
27-
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
27+
group: ${{ github.workflow }}-${{ github.ref }}
2828
cancel-in-progress: true
2929

3030
permissions:
@@ -41,21 +41,94 @@ jobs:
4141
env:
4242
GH_TOKEN: ${{ github.token }}
4343
PR_NUMBER: ${{ github.event.pull_request.number }}
44+
EVENT_NAME: ${{ github.event_name }}
45+
REPO: ${{ github.repository }}
4446
run: |
4547
set -euo pipefail
4648
47-
if [ "${{ github.event_name }}" != "pull_request" ]; then
48-
echo "run_install_tests=true" >> "$GITHUB_OUTPUT"
49+
# Installation tests run only when paths in the patterns table change.
50+
# Otherwise the test job skips via `if:` and reports green to branch
51+
# protection, which is why we don't use a workflow-level `paths:`
52+
# filter (a not-triggered required check would block the PR forever).
53+
patterns=(
54+
$'^apps/\tStandalone apps'
55+
$'^tools/\tBuild tooling'
56+
$'^source/\tLibrary source code'
57+
$'^\\.github/actions/run-package-tests/\tTest action'
58+
$'^\\.github/workflows/install-ci\\.yml$\tThis workflow file'
59+
$'^VERSION$\tVersion file'
60+
$'(^|/)pyproject\\.toml$\tPython project metadata'
61+
$'(^|/)environment\\.ya?ml$\tConda environment file'
62+
)
63+
triggered_jobs="Installation Tests"
64+
65+
render_table() {
66+
local files="$1" entry regex desc count sample
67+
echo "| Pattern | What it covers | Matched files |"
68+
echo "|---|---|---|"
69+
for entry in "${patterns[@]}"; do
70+
IFS=$'\t' read -r regex desc <<< "$entry"
71+
count=$(printf '%s\n' "$files" | grep -cE "$regex" || true)
72+
if [ "$count" -gt 0 ]; then
73+
sample=$(printf '%s\n' "$files" | grep -E "$regex" | head -3 | paste -sd ', ' -)
74+
[ "$count" -gt 3 ] && sample="$sample (and $((count - 3)) more)"
75+
echo "| \`$regex\` | $desc | $sample |"
76+
else
77+
echo "| \`$regex\` | $desc | - |"
78+
fi
79+
done
80+
}
81+
82+
any_match() {
83+
local files="$1" entry regex
84+
for entry in "${patterns[@]}"; do
85+
IFS=$'\t' read -r regex _ <<< "$entry"
86+
if printf '%s\n' "$files" | grep -qE "$regex"; then
87+
return 0
88+
fi
89+
done
90+
return 1
91+
}
92+
93+
decide() {
94+
local decision="$1" reason="$2" files="${3:-}"
95+
echo "Decision: run_install_tests=$decision ($reason)"
96+
echo "run_install_tests=$decision" >> "$GITHUB_OUTPUT"
97+
{
98+
echo "## Installation test gating"
99+
echo ""
100+
if [ "$decision" = "true" ]; then
101+
echo "Installation tests will **run**: $reason."
102+
else
103+
echo "Installation tests will be **skipped**: $reason."
104+
fi
105+
echo ""
106+
echo "Triggered jobs: $triggered_jobs."
107+
if [ -n "$files" ]; then
108+
echo ""
109+
render_table "$files"
110+
fi
111+
} >> "$GITHUB_STEP_SUMMARY"
112+
}
113+
114+
if [ "$EVENT_NAME" != "pull_request" ]; then
115+
decide true "non-PR event ($EVENT_NAME)"
116+
exit 0
117+
fi
118+
119+
if ! changed_files="$(gh api --paginate "repos/$REPO/pulls/$PR_NUMBER/files" --jq '.[].filename')"; then
120+
# Fail-safe: a transient API error must not block merge. Default to running.
121+
echo "::warning::Could not list changed files; defaulting to running tests"
122+
decide true "fail-safe (could not list changed files)"
49123
exit 0
50124
fi
51125
52-
changed_files="$(gh api --paginate "repos/${{ github.repository }}/pulls/${PR_NUMBER}/files" --jq '.[].filename')"
53126
printf '%s\n' "$changed_files"
54127
55-
if printf '%s\n' "$changed_files" | grep -qE '^(apps/|tools/|source/|\.github/actions/run-package-tests/|\.github/workflows/install-ci\.yml$|VERSION$)|(^|/)pyproject\.toml$|(^|/)environment\.ya?ml$'; then
56-
echo "run_install_tests=true" >> "$GITHUB_OUTPUT"
128+
if any_match "$changed_files"; then
129+
decide true "relevant paths changed" "$changed_files"
57130
else
58-
echo "run_install_tests=false" >> "$GITHUB_OUTPUT"
131+
decide false "no relevant paths changed" "$changed_files"
59132
fi
60133
61134
install-tests:
@@ -82,34 +155,3 @@ jobs:
82155
fi
83156
84157
tools/run_install_ci.py docker $RUNNER_ARGS -- --tb=short "${PYTEST_EXTRA_ARGS[@]}"
85-
86-
installation-tests-gate:
87-
name: Installation Tests Gate
88-
needs: [changes, install-tests]
89-
if: always()
90-
runs-on: ubuntu-latest
91-
steps:
92-
- name: Check installation test result
93-
env:
94-
CHANGES_RESULT: ${{ needs.changes.result }}
95-
RUN_INSTALL_TESTS: ${{ needs.changes.outputs.run_install_tests }}
96-
INSTALL_TESTS_RESULT: ${{ needs.install-tests.result }}
97-
run: |
98-
set -euo pipefail
99-
100-
if [ "$CHANGES_RESULT" != "success" ]; then
101-
echo "Change detection failed with result: $CHANGES_RESULT"
102-
exit 1
103-
fi
104-
105-
if [ "$RUN_INSTALL_TESTS" != "true" ]; then
106-
echo "Installation tests are not required for this change."
107-
exit 0
108-
fi
109-
110-
if [ "$INSTALL_TESTS_RESULT" != "success" ]; then
111-
echo "Installation Tests did not pass: $INSTALL_TESTS_RESULT"
112-
exit 1
113-
fi
114-
115-
echo "Installation Tests passed."

.github/workflows/labeler.yml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,6 @@ name: "Pull Request Labeler"
77
on:
88
- pull_request_target
99

10-
concurrency:
11-
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
12-
cancel-in-progress: true
13-
1410
jobs:
1511
labeler:
1612
permissions:

0 commit comments

Comments
 (0)