Limit CI cancel-in-progress to pull_request events #5379
Workflow file for this run
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
| # Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md). | |
| # All rights reserved. | |
| # | |
| # SPDX-License-Identifier: BSD-3-Clause | |
| # region help | |
| # Every test job runs on every PR. | |
| # | |
| # ============================================================================= | |
| # CI DEBUGGING TIPS | |
| # ============================================================================= | |
| # | |
| # 1. DISABLE A TEST JOB (to isolate a specific job): | |
| # Change the job's `if:` clause to `if: false` | |
| # Example: | |
| # test-isaaclab-tasks: | |
| # ... | |
| # if: false # TEMP: Disabled for debugging | |
| # | |
| # 2. RUN ONLY SPECIFIC TEST FILES (within a job): | |
| # Add `include-files:` parameter to run-package-tests action | |
| # Example: | |
| # - uses: ./.github/actions/run-package-tests | |
| # with: | |
| # ... | |
| # include-files: "test_rigid_object_collection.py" # Comma-separated | |
| # | |
| # 3. SKIP CONCURRENCY WAIT (run immediately without waiting for other runs): | |
| # Comment out the concurrency block: | |
| # # concurrency: | |
| # # group: ${{ github.workflow }}-${{ github.ref }} | |
| # # cancel-in-progress: true | |
| # | |
| # 4. TEST LOCALLY LIKE CI: | |
| # docker run -it --rm --gpus all --network=host --entrypoint bash \ | |
| # -e OMNI_KIT_ACCEPT_EULA=yes -e ACCEPT_EULA=Y -e ISAAC_SIM_HEADLESS=1 \ | |
| # -e TEST_FILTER_PATTERN="isaaclab_physx" \ | |
| # -e TEST_INCLUDE_FILES="test_rigid_object_collection.py" \ | |
| # -v "$PWD":/workspace/isaaclab isaac-lab-base:latest \ | |
| # -c 'cd /workspace/isaaclab && /isaac-sim/python.sh -m pytest tools -v' | |
| # | |
| # Remember to REVERT all temporary changes before merging! | |
| # ============================================================================= | |
| #endregion | |
| name: Docker + Tests | |
| on: | |
| pull_request: | |
| types: [opened, synchronize, reopened] | |
| branches: | |
| - main | |
| - develop | |
| - 'release/**' | |
| workflow_dispatch: | |
| # Concurrency control to prevent parallel runs on the same PR | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} | |
| cancel-in-progress: ${{ github.event_name == 'pull_request' }} | |
| permissions: | |
| contents: read | |
| pull-requests: write | |
| checks: write | |
| issues: read | |
| env: | |
| NGC_API_KEY: ${{ secrets.NGC_API_KEY }} | |
| CI_IMAGE_TAG: isaac-lab-ci:${{ github.event_name == 'pull_request' && format('pr-{0}', github.event.pull_request.number) || github.ref_name }}-${{ github.sha }} | |
| jobs: | |
| changes: | |
| name: Detect Changes | |
| runs-on: ubuntu-latest | |
| outputs: | |
| run_docker_tests: ${{ steps.detect.outputs.run_docker_tests }} | |
| steps: | |
| - id: detect | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| PR_NUMBER: ${{ github.event.pull_request.number }} | |
| EVENT_NAME: ${{ github.event_name }} | |
| REPO: ${{ github.repository }} | |
| run: | | |
| set -euo pipefail | |
| # Docker test jobs run only when paths in the patterns table change. | |
| # Otherwise they skip via `if:` and report green to branch protection, | |
| # which is why we don't use a workflow-level `paths:` filter (a | |
| # not-triggered required check would block the PR forever). | |
| # config.yaml is included because it controls the base image names and | |
| # tags consumed by the Docker build jobs. | |
| patterns=( | |
| $'^source/\tLibrary source code' | |
| $'^docker/\tContainer build inputs' | |
| $'^tools/\tBuild tooling' | |
| $'^apps/\tStandalone apps' | |
| $'^scripts/\tStandalone scripts' | |
| $'^\\.github/workflows/build\\.yaml$\tThis workflow file' | |
| $'^\\.github/workflows/config\\.yaml$\tBase image config' | |
| $'^\\.github/actions/\tCI actions' | |
| ) | |
| triggered_jobs="Docker build jobs + all test-* matrix jobs" | |
| render_table() { | |
| local files="$1" entry regex desc count sample shown | |
| echo "| Pattern | What it covers | Matched files |" | |
| echo "|---|---|---|" | |
| for entry in "${patterns[@]}"; do | |
| IFS=$'\t' read -r regex desc <<< "$entry" | |
| # escape | so it doesn't end the markdown table cell mid-regex | |
| shown="${regex//|/\\|}" | |
| count=$(grep -cE "$regex" <<< "$files" || true) | |
| if [ "$count" -gt 0 ]; then | |
| sample=$(grep -m 3 -E "$regex" <<< "$files" | paste -sd ', ' -) | |
| [ "$count" -gt 3 ] && sample="$sample (and $((count - 3)) more)" | |
| echo "| \`$shown\` | $desc | $sample |" | |
| else | |
| echo "| \`$shown\` | $desc | - |" | |
| fi | |
| done | |
| } | |
| any_match() { | |
| local files="$1" entry regex | |
| for entry in "${patterns[@]}"; do | |
| IFS=$'\t' read -r regex _ <<< "$entry" | |
| if grep -qE "$regex" <<< "$files"; then | |
| return 0 | |
| fi | |
| done | |
| return 1 | |
| } | |
| decide() { | |
| local decision="$1" reason="$2" files="${3:-}" | |
| echo "Decision: run_docker_tests=$decision ($reason)" | |
| echo "run_docker_tests=$decision" >> "$GITHUB_OUTPUT" | |
| { | |
| echo "## Docker test gating" | |
| echo "" | |
| if [ "$decision" = "true" ]; then | |
| echo "Docker tests will **run**: $reason." | |
| else | |
| echo "Docker tests will be **skipped**: $reason." | |
| fi | |
| echo "" | |
| echo "Triggered jobs: $triggered_jobs." | |
| if [ -n "$files" ]; then | |
| echo "" | |
| render_table "$files" | |
| fi | |
| } >> "$GITHUB_STEP_SUMMARY" | |
| } | |
| if [ "$EVENT_NAME" != "pull_request" ]; then | |
| decide true "non-PR event ($EVENT_NAME)" | |
| exit 0 | |
| fi | |
| if ! changed_files="$(gh api --paginate "repos/$REPO/pulls/$PR_NUMBER/files" --jq '.[].filename')"; then | |
| # Fail-safe: a transient API error must not block merge. Default to running. | |
| echo "::warning::Could not list changed files; defaulting to running tests" | |
| decide true "fail-safe (could not list changed files)" | |
| exit 0 | |
| fi | |
| printf '%s\n' "$changed_files" | |
| if any_match "$changed_files"; then | |
| decide true "relevant paths changed" "$changed_files" | |
| else | |
| decide false "no relevant paths changed" "$changed_files" | |
| fi | |
| config: | |
| name: Load Config | |
| runs-on: ubuntu-latest | |
| outputs: | |
| isaacsim_image_name: ${{ steps.load.outputs.isaacsim_image_name }} | |
| isaacsim_image_tag: ${{ steps.load.outputs.isaacsim_image_tag }} | |
| isaaclab_image_name: ${{ steps.load.outputs.isaaclab_image_name }} | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| sparse-checkout: .github/workflows/config.yaml | |
| sparse-checkout-cone-mode: false | |
| - id: load | |
| run: | | |
| set -euo pipefail | |
| f=.github/workflows/config.yaml | |
| echo "isaacsim_image_name=$(yq -r .isaacsim_image_name "$f")" >> "$GITHUB_OUTPUT" | |
| echo "isaacsim_image_tag=$(yq -r .isaacsim_image_tag "$f")" >> "$GITHUB_OUTPUT" | |
| echo "isaaclab_image_name=$(yq -r .isaaclab_image_name "$f")" >> "$GITHUB_OUTPUT" | |
| #region build jobs | |
| build: | |
| name: Build Base Docker Image | |
| runs-on: [self-hosted, gpu] | |
| needs: [changes, config] | |
| if: needs.changes.outputs.run_docker_tests == 'true' | |
| steps: | |
| - name: Checkout Code | |
| uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - name: Build and push to ECR | |
| uses: ./.github/actions/ecr-build-push-pull | |
| with: | |
| image-tag: ${{ env.CI_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }} | |
| isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }} | |
| dockerfile-path: docker/Dockerfile.base | |
| cache-tag: cache-base | |
| build-curobo: | |
| name: Build cuRobo Docker Image | |
| runs-on: [self-hosted, gpu] | |
| needs: [changes, config] | |
| if: needs.changes.outputs.run_docker_tests == 'true' | |
| steps: | |
| - name: Checkout Code | |
| uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - name: Build and push to ECR | |
| uses: ./.github/actions/ecr-build-push-pull | |
| with: | |
| image-tag: ${{ env.CI_IMAGE_TAG }}-curobo | |
| isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }} | |
| isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }} | |
| dockerfile-path: docker/Dockerfile.curobo | |
| cache-tag: cache-curobo | |
| #endregion | |
| #region test jobs | |
| test-isaaclab-tasks: | |
| name: isaaclab_tasks [1/3] | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 180 | |
| continue-on-error: true | |
| needs: [build, config] | |
| if: needs.build.result == 'success' | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.CI_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }} | |
| isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }} | |
| filter-pattern: "isaaclab_tasks" | |
| exclude-pattern: "test_rendering_" | |
| shard-index: "0" | |
| shard-count: "3" | |
| container-name: isaac-lab-tasks-1-test | |
| test-isaaclab-tasks-2: | |
| name: isaaclab_tasks [2/3] | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 180 | |
| continue-on-error: true | |
| needs: [build, config] | |
| if: needs.build.result == 'success' | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.CI_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }} | |
| isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }} | |
| filter-pattern: "isaaclab_tasks" | |
| exclude-pattern: "test_rendering_" | |
| shard-index: "1" | |
| shard-count: "3" | |
| container-name: isaac-lab-tasks-2-test | |
| test-isaaclab-tasks-3: | |
| name: isaaclab_tasks [3/3] | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 180 | |
| continue-on-error: true | |
| needs: [build, config] | |
| if: needs.build.result == 'success' | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.CI_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }} | |
| isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }} | |
| filter-pattern: "isaaclab_tasks" | |
| exclude-pattern: "test_rendering_" | |
| shard-index: "2" | |
| shard-count: "3" | |
| container-name: isaac-lab-tasks-3-test | |
| test-isaaclab-core: | |
| name: isaaclab (core) [1/3] | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 180 | |
| needs: [build, config] | |
| if: needs.build.result == 'success' | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.CI_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }} | |
| isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }} | |
| filter-pattern: "not isaaclab_" | |
| shard-index: "0" | |
| shard-count: "3" | |
| container-name: isaac-lab-core-1-test | |
| test-isaaclab-core-2: | |
| name: isaaclab (core) [2/3] | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 180 | |
| needs: [build, config] | |
| if: needs.build.result == 'success' | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.CI_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }} | |
| isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }} | |
| filter-pattern: "not isaaclab_" | |
| shard-index: "1" | |
| shard-count: "3" | |
| container-name: isaac-lab-core-2-test | |
| test-isaaclab-core-3: | |
| name: isaaclab (core) [3/3] | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 180 | |
| needs: [build, config] | |
| if: needs.build.result == 'success' | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.CI_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }} | |
| isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }} | |
| filter-pattern: "not isaaclab_" | |
| shard-index: "2" | |
| shard-count: "3" | |
| container-name: isaac-lab-core-3-test | |
| test-isaaclab-rl: | |
| name: isaaclab_rl | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 180 | |
| needs: [build, config] | |
| if: needs.build.result == 'success' | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.CI_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }} | |
| isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }} | |
| filter-pattern: "isaaclab_rl" | |
| extra-pip-packages: "leapp" | |
| container-name: isaac-lab-rl-test | |
| test-isaaclab-mimic: | |
| name: isaaclab_mimic | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 180 | |
| needs: [build, config] | |
| if: needs.build.result == 'success' | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.CI_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }} | |
| isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }} | |
| filter-pattern: "isaaclab_mimic" | |
| container-name: isaac-lab-mimic-test | |
| test-isaaclab-contrib: | |
| name: isaaclab_contrib | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 180 | |
| needs: [build, config] | |
| if: needs.build.result == 'success' | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.CI_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }} | |
| isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }} | |
| filter-pattern: "isaaclab_contrib" | |
| container-name: isaac-lab-contrib-test | |
| test-isaaclab-teleop: | |
| name: isaaclab_teleop | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 180 | |
| needs: [build, config] | |
| if: needs.build.result == 'success' | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.CI_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }} | |
| isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }} | |
| filter-pattern: "isaaclab_teleop" | |
| container-name: isaac-lab-teleop-test | |
| test-isaaclab-visualizers: | |
| name: isaaclab_visualizers | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 180 | |
| needs: [build, config] | |
| if: needs.build.result == 'success' | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.CI_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }} | |
| isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }} | |
| filter-pattern: "isaaclab_visualizers" | |
| container-name: isaac-lab-visualizers-test | |
| test-isaaclab-assets: | |
| name: isaaclab_assets | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 180 | |
| needs: [build, config] | |
| if: needs.build.result == 'success' | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.CI_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }} | |
| isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }} | |
| filter-pattern: "isaaclab_assets" | |
| container-name: isaac-lab-assets-test | |
| test-isaaclab-newton: | |
| name: isaaclab_newton | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 180 | |
| needs: [build, config] | |
| if: needs.build.result == 'success' | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.CI_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }} | |
| isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }} | |
| filter-pattern: "isaaclab_newton" | |
| container-name: isaac-lab-newton-test | |
| test-isaaclab-physx: | |
| name: isaaclab_physx | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 180 | |
| needs: [build, config] | |
| if: needs.build.result == 'success' | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.CI_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }} | |
| isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }} | |
| filter-pattern: "isaaclab_physx" | |
| container-name: isaac-lab-physx-test | |
| test-isaaclab-ov: | |
| name: isaaclab_ov | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 180 | |
| needs: [build, config] | |
| if: needs.build.result == 'success' | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.CI_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }} | |
| isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }} | |
| filter-pattern: "isaaclab_ov" | |
| extra-pip-packages: "ovrtx ovphysx" | |
| container-name: isaac-lab-ov-test | |
| # Folded from the former standalone verify-base-non-root job: reuses the | |
| # base image already pulled by run-package-tests to keep the regression | |
| # check without burning a separate runner. | |
| - name: Run Dockerfile non-root regression test | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| docker run --rm \ | |
| -v "$PWD":/workspace/isaaclab \ | |
| --entrypoint bash \ | |
| "${{ env.CI_IMAGE_TAG }}" \ | |
| -lc 'cd /workspace/isaaclab && /isaac-sim/python.sh -m pytest docker/test/test_dockerfile_nonroot.py -q' | |
| - name: Verify Base runtime user is non-root | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| runtime_identity="$(docker run --rm --entrypoint bash "${{ env.CI_IMAGE_TAG }}" \ | |
| -lc 'printf "%s %s %s\n" "$(id -u)" "$(id -g)" "$(id -un 2>/dev/null || true)"')" | |
| read -r runtime_uid runtime_gid runtime_user <<< "${runtime_identity}" | |
| echo "Base runtime identity: uid=${runtime_uid} gid=${runtime_gid} user=${runtime_user}" | |
| if [ "${runtime_uid}" = "0" ]; then | |
| echo "::error::Base Docker image must not run as root by default." | |
| exit 1 | |
| fi | |
| test-curobo: | |
| name: test-curobo | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 120 | |
| continue-on-error: true | |
| needs: [build-curobo, config] | |
| if: needs.build-curobo.result == 'success' | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.CI_IMAGE_TAG }}-curobo | |
| isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }} | |
| isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }} | |
| dockerfile-path: docker/Dockerfile.curobo | |
| cache-tag: cache-curobo | |
| include-files: "test_curobo_planner_franka.py,test_curobo_planner_cube_stack.py,test_pink_ik.py" | |
| container-name: isaac-lab-curobo-test | |
| # Folded from the former standalone verify-curobo-non-root job: reuses | |
| # the curobo image already pulled by run-package-tests to keep the | |
| # regression check without burning a separate runner. | |
| - name: Run Dockerfile non-root regression test | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| docker run --rm \ | |
| -v "$PWD":/workspace/isaaclab \ | |
| --entrypoint bash \ | |
| "${{ env.CI_IMAGE_TAG }}-curobo" \ | |
| -lc 'cd /workspace/isaaclab && /isaac-sim/python.sh -m pytest docker/test/test_dockerfile_nonroot.py -q' | |
| - name: Verify cuRobo runtime user is non-root | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| runtime_identity="$(docker run --rm --entrypoint bash "${{ env.CI_IMAGE_TAG }}-curobo" \ | |
| -lc 'printf "%s %s %s\n" "$(id -u)" "$(id -g)" "$(id -un 2>/dev/null || true)"')" | |
| read -r runtime_uid runtime_gid runtime_user <<< "${runtime_identity}" | |
| echo "cuRobo runtime identity: uid=${runtime_uid} gid=${runtime_gid} user=${runtime_user}" | |
| if [ "${runtime_uid}" = "0" ]; then | |
| echo "::error::cuRobo Docker image must not run as root by default." | |
| exit 1 | |
| fi | |
| test-skillgen: | |
| name: test-skillgen | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 120 | |
| continue-on-error: true | |
| needs: [build-curobo, config] | |
| if: needs.build-curobo.result == 'success' | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.CI_IMAGE_TAG }}-curobo | |
| isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }} | |
| isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }} | |
| dockerfile-path: docker/Dockerfile.curobo | |
| cache-tag: cache-curobo | |
| include-files: "test_generate_dataset_skillgen.py,test_environments_skillgen.py,test_environments_automate.py" | |
| container-name: isaac-lab-skillgen-test | |
| test-environments-training: | |
| name: "environments_training" | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 300 | |
| continue-on-error: true | |
| needs: [build, config] | |
| if: needs.build.result == 'success' | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.CI_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }} | |
| isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }} | |
| filter-pattern: "isaaclab_tasks" | |
| include-files: "test_environments_training.py" | |
| container-name: isaac-lab-environments-training-test | |
| test-rendering-correctness: | |
| name: "rendering-correctness" | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 120 | |
| continue-on-error: true | |
| needs: [build, config] | |
| if: needs.build.result == 'success' | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.CI_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }} | |
| isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }} | |
| filter-pattern: "isaaclab_tasks" | |
| include-files: "test_rendering_cartpole.py,test_rendering_dexsuite_kuka.py,test_rendering_registered_tasks.py,test_rendering_shadow_hand.py" | |
| container-name: isaac-lab-rendering-correctness-test | |
| test-rendering-correctness-kitless: | |
| name: "rendering-correctness-kitless" | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 120 | |
| continue-on-error: true | |
| needs: [build, config] | |
| if: needs.build.result == 'success' | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.CI_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }} | |
| isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }} | |
| filter-pattern: "isaaclab_tasks" | |
| extra-pip-packages: "ovrtx ovphysx==0.4.13" | |
| include-files: "test_rendering_cartpole_kitless.py,test_rendering_dexsuite_kuka_kitless.py,test_rendering_shadow_hand_kitless.py" | |
| container-name: isaac-lab-rendering-correctness-kitless-test | |
| #endregion | |
| #region disabled quarantined tests | |
| # test-quarantined: | |
| # name: "Quarantined Tests" | |
| # runs-on: [self-hosted, gpu] | |
| # timeout-minutes: 180 | |
| # continue-on-error: true | |
| # needs: [build, config] | |
| # if: >- | |
| # needs.build.result == 'success' && | |
| # vars.RUN_QUARANTINED_TESTS == 'true' | |
| # steps: | |
| # - uses: actions/checkout@v6 | |
| # with: | |
| # fetch-depth: 1 | |
| # lfs: true | |
| # - uses: ./.github/actions/run-package-tests | |
| # with: | |
| # image-tag: ${{ env.CI_IMAGE_TAG }} | |
| # isaacsim-base-image: ${{ needs.config.outputs.isaacsim_image_name }} | |
| # isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }} | |
| # quarantined-only: "true" | |
| # container-name: isaac-lab-quarantined-test | |
| #endregion |