Splits Tests More Evenly, Only Runs Relevant Ones, Improves Job Cancellation, Adds Reporting #743
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 | |
| # Test job gating summary | |
| # | |
| # +------------------------------------+-----------------------------------------------------+ | |
| # | Job | Gate (any match triggers the job) | | |
| # +------------------------------------+-----------------------------------------------------+ | |
| # | test-isaaclab-tasks (x3 shards) | isaaclab-tasks | isaaclab-core | infra | | |
| # | test-isaaclab-core (x3 shards) | isaaclab-core | infra | | |
| # | test-isaaclab-rl | isaaclab-rl | isaaclab-core | infra | | |
| # | test-isaaclab-mimic | isaaclab-mimic | isaaclab-core | infra | | |
| # | test-isaaclab-contrib | isaaclab-contrib | isaaclab-core | infra | | |
| # | test-isaaclab-teleop | isaaclab-teleop | isaaclab-core | infra | | |
| # | test-isaaclab-visualizers | isaaclab-visualizers | isaaclab-core | infra | | |
| # | test-isaaclab-assets | isaaclab-assets | isaaclab-core | infra | | |
| # | test-isaaclab-newton | isaaclab-newton | isaaclab-core | infra | | |
| # | test-isaaclab-physx | isaaclab-physx | isaaclab-core | infra | | |
| # | test-environments-training | isaaclab-tasks | isaaclab-core | infra | | |
| # | test-curobo (needs build-curobo) | isaaclab-mimic | isaaclab-core | infra | | |
| # | test-skillgen (needs build-curobo) | isaaclab-mimic | isaaclab-tasks | isaaclab-core | | |
| # | | | infra | | |
| # | test-quarantined | vars.RUN_QUARANTINED_TESTS == "true" | | |
| # | build-curobo | isaaclab-mimic | isaaclab-tasks | isaaclab-core | | |
| # | | | infra | | |
| # +------------------------------------+-----------------------------------------------------+ | |
| name: Docker + Tests | |
| on: | |
| pull_request: | |
| types: [opened, synchronize, reopened] | |
| paths: | |
| - 'source/**' | |
| - 'docker/**' | |
| - 'tools/**' | |
| - 'apps/**' | |
| - '.github/workflows/build.yaml' | |
| - '.github/actions/**' | |
| branches: | |
| - main | |
| - develop | |
| - 'release/**' | |
| workflow_dispatch: | |
| # Concurrency control to prevent parallel runs on the same PR | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| permissions: | |
| contents: read | |
| pull-requests: write | |
| checks: write | |
| issues: read | |
| env: | |
| NGC_API_KEY: ${{ secrets.NGC_API_KEY }} | |
| # On merge to main defaults will point to "nvcr.io/nvidia/isaac-sim:6.0.0" | |
| ISAACSIM_BASE_IMAGE: 'nvcr.io/nvidian/isaac-sim' # ${{ vars.ISAACSIM_BASE_IMAGE || 'nvcr.io/nvidia/isaac-sim' }} | |
| ISAACSIM_BASE_VERSION: 'latest-develop' # ${{ vars.ISAACSIM_BASE_VERSION || '6.0.0' }} | |
| DOCKER_IMAGE_TAG: isaac-lab-dev:${{ github.event_name == 'pull_request' && format('pr-{0}', github.event.pull_request.number) || github.ref_name }}-${{ github.sha }} | |
| # To run quarantined tests, create a GitHub repo variable named | |
| # RUN_QUARANTINED_TESTS and set it to 'true'. The test-quarantined | |
| # job is skipped when the variable is absent or not 'true'. | |
| jobs: | |
| detect-changes: | |
| name: Detect Changes | |
| runs-on: ubuntu-latest | |
| outputs: | |
| isaaclab-core: ${{ steps.check.outputs.isaaclab-core }} | |
| isaaclab-physx: ${{ steps.check.outputs.isaaclab-physx }} | |
| isaaclab-newton: ${{ steps.check.outputs.isaaclab-newton }} | |
| isaaclab-tasks: ${{ steps.check.outputs.isaaclab-tasks }} | |
| isaaclab-rl: ${{ steps.check.outputs.isaaclab-rl }} | |
| isaaclab-mimic: ${{ steps.check.outputs.isaaclab-mimic }} | |
| isaaclab-contrib: ${{ steps.check.outputs.isaaclab-contrib }} | |
| isaaclab-teleop: ${{ steps.check.outputs.isaaclab-teleop }} | |
| isaaclab-visualizers: ${{ steps.check.outputs.isaaclab-visualizers }} | |
| isaaclab-assets: ${{ steps.check.outputs.isaaclab-assets }} | |
| infra: ${{ steps.check.outputs.infra }} | |
| steps: | |
| - name: Checkout Code | |
| uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| - name: Detect changed files and packages | |
| id: check | |
| run: | | |
| set -euo pipefail | |
| # For non-PR events, run all tests | |
| if [ "${{ github.event_name }}" != "pull_request" ]; then | |
| for pkg in isaaclab-core isaaclab-physx isaaclab-newton isaaclab-tasks \ | |
| isaaclab-rl isaaclab-mimic isaaclab-contrib isaaclab-teleop \ | |
| isaaclab-visualizers isaaclab-assets infra; do | |
| echo "$pkg=true" >> "$GITHUB_OUTPUT" | |
| done | |
| exit 0 | |
| fi | |
| # Fetch the PR base branch tip to diff against | |
| git fetch --depth=1 origin "${{ github.event.pull_request.base.ref }}" | |
| changed=$(git diff --name-only FETCH_HEAD HEAD) | |
| has() { echo "$changed" | grep -qE "$1" && echo true || echo false; } | |
| echo "isaaclab-core=$(has '^source/isaaclab/')" >> "$GITHUB_OUTPUT" | |
| echo "isaaclab-physx=$(has '^source/isaaclab_physx/')" >> "$GITHUB_OUTPUT" | |
| echo "isaaclab-newton=$(has '^source/isaaclab_newton/')" >> "$GITHUB_OUTPUT" | |
| echo "isaaclab-tasks=$(has '^source/isaaclab_tasks/')" >> "$GITHUB_OUTPUT" | |
| echo "isaaclab-rl=$(has '^source/isaaclab_rl/')" >> "$GITHUB_OUTPUT" | |
| echo "isaaclab-mimic=$(has '^source/isaaclab_mimic/')" >> "$GITHUB_OUTPUT" | |
| echo "isaaclab-contrib=$(has '^source/isaaclab_contrib/')" >> "$GITHUB_OUTPUT" | |
| echo "isaaclab-teleop=$(has '^source/isaaclab_teleop/')" >> "$GITHUB_OUTPUT" | |
| echo "isaaclab-visualizers=$(has '^source/isaaclab_visualizers/')" >> "$GITHUB_OUTPUT" | |
| echo "isaaclab-assets=$(has '^source/isaaclab_assets/')" >> "$GITHUB_OUTPUT" | |
| echo "infra=$(has '^(\.github/|docker/|tools/|scripts/)')" >> "$GITHUB_OUTPUT" | |
| echo "" | |
| echo "" | |
| echo "CHANGED FILES:" | |
| echo "$changed" | while IFS= read -r f; do | |
| case "$f" in | |
| source/isaaclab/*) echo "$f (isaaclab-core)" ;; | |
| source/isaaclab_physx/*) echo "$f (isaaclab-physx)" ;; | |
| source/isaaclab_newton/*) echo "$f (isaaclab-newton)" ;; | |
| source/isaaclab_tasks/*) echo "$f (isaaclab-tasks)" ;; | |
| source/isaaclab_rl/*) echo "$f (isaaclab-rl)" ;; | |
| source/isaaclab_mimic/*) echo "$f (isaaclab-mimic)" ;; | |
| source/isaaclab_contrib/*) echo "$f (isaaclab-contrib)" ;; | |
| source/isaaclab_teleop/*) echo "$f (isaaclab-teleop)" ;; | |
| source/isaaclab_visualizers/*) echo "$f (isaaclab-visualizers)" ;; | |
| source/isaaclab_assets/*) echo "$f (isaaclab-assets)" ;; | |
| .github/*|docker/*|tools/*|scripts/*) echo "$f (infra)" ;; | |
| *) echo "$f" ;; | |
| esac | |
| done | |
| echo "" | |
| echo "" | |
| echo "CHANGED PACKAGES:" | |
| cat "$GITHUB_OUTPUT" | |
| # Write job summary visible on the GH Actions UI | |
| { | |
| echo "#### Changed Files / Packages" | |
| echo "" | |
| echo "| File | Package |" | |
| echo "|------|---------|" | |
| echo "$changed" | while IFS= read -r f; do | |
| case "$f" in | |
| source/isaaclab/*) echo "| \`$f\` | isaaclab-core |" ;; | |
| source/isaaclab_physx/*) echo "| \`$f\` | isaaclab-physx |" ;; | |
| source/isaaclab_newton/*) echo "| \`$f\` | isaaclab-newton |" ;; | |
| source/isaaclab_tasks/*) echo "| \`$f\` | isaaclab-tasks |" ;; | |
| source/isaaclab_rl/*) echo "| \`$f\` | isaaclab-rl |" ;; | |
| source/isaaclab_mimic/*) echo "| \`$f\` | isaaclab-mimic |" ;; | |
| source/isaaclab_contrib/*) echo "| \`$f\` | isaaclab-contrib |" ;; | |
| source/isaaclab_teleop/*) echo "| \`$f\` | isaaclab-teleop |" ;; | |
| source/isaaclab_visualizers/*) echo "| \`$f\` | isaaclab-visualizers |" ;; | |
| source/isaaclab_assets/*) echo "| \`$f\` | isaaclab-assets |" ;; | |
| .github/*|docker/*|tools/*|scripts/*) echo "| \`$f\` | infra |" ;; | |
| *) echo "| \`$f\` | - |" ;; | |
| esac | |
| done | |
| } >> "$GITHUB_STEP_SUMMARY" | |
| build: | |
| name: Build Base Docker Image | |
| runs-on: [self-hosted, gpu] | |
| needs: [detect-changes] | |
| 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.DOCKER_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }} | |
| isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }} | |
| dockerfile-path: docker/Dockerfile.base | |
| cache-tag: cache-base | |
| build-curobo: | |
| name: Build cuRobo Docker Image | |
| runs-on: [self-hosted, gpu] | |
| needs: [detect-changes] | |
| if: >- | |
| needs.detect-changes.outputs.isaaclab-mimic == 'true' || | |
| needs.detect-changes.outputs.isaaclab-tasks == 'true' || | |
| needs.detect-changes.outputs.isaaclab-core == 'true' || | |
| needs.detect-changes.outputs.infra == '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.DOCKER_IMAGE_TAG }}-curobo | |
| isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }} | |
| isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }} | |
| dockerfile-path: docker/Dockerfile.curobo | |
| cache-tag: cache-curobo | |
| # Each test job checks out code, then calls run-package-tests which handles | |
| # ECR pull, pytest in Docker, artifact upload, and fork-PR checks. | |
| test-isaaclab-tasks: | |
| name: isaaclab_tasks [1/3] | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 180 | |
| continue-on-error: true | |
| needs: [build, detect-changes] | |
| if: >- | |
| always() && needs.build.result == 'success' && ( | |
| needs.detect-changes.outputs.isaaclab-tasks == 'true' || | |
| needs.detect-changes.outputs.isaaclab-core == 'true' || | |
| needs.detect-changes.outputs.infra == 'true' | |
| ) | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.DOCKER_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }} | |
| isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }} | |
| filter-pattern: "isaaclab_tasks" | |
| shard-index: "0" | |
| shard-count: "3" | |
| artifact-name: isaaclab-tasks-1-test-results | |
| 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, detect-changes] | |
| if: >- | |
| always() && needs.build.result == 'success' && ( | |
| needs.detect-changes.outputs.isaaclab-tasks == 'true' || | |
| needs.detect-changes.outputs.isaaclab-core == 'true' || | |
| needs.detect-changes.outputs.infra == 'true' | |
| ) | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.DOCKER_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }} | |
| isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }} | |
| filter-pattern: "isaaclab_tasks" | |
| include-files: >- | |
| test_teleop_environments_with_stage_in_memory.py, | |
| test_lift_teddy_bear.py, | |
| test_environment_determinism.py, | |
| test_hydra.py, | |
| test_rl_device_separation.py, | |
| test_cartpole_showcase_environments_with_stage_in_memory.py, | |
| test_environments_with_stage_in_memory.py, | |
| test_rendering_correctness.py | |
| shard-index: "1" | |
| shard-count: "3" | |
| artifact-name: isaaclab-tasks-2-test-results | |
| 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, detect-changes] | |
| if: >- | |
| always() && needs.build.result == 'success' && ( | |
| needs.detect-changes.outputs.isaaclab-tasks == 'true' || | |
| needs.detect-changes.outputs.isaaclab-core == 'true' || | |
| needs.detect-changes.outputs.infra == 'true' | |
| ) | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.DOCKER_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }} | |
| isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }} | |
| filter-pattern: "isaaclab_tasks" | |
| shard-index: "2" | |
| shard-count: "3" | |
| artifact-name: isaaclab-tasks-3-test-results | |
| 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, detect-changes] | |
| if: >- | |
| always() && needs.build.result == 'success' && ( | |
| needs.detect-changes.outputs.isaaclab-core == 'true' || | |
| needs.detect-changes.outputs.infra == 'true' | |
| ) | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.DOCKER_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }} | |
| isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }} | |
| filter-pattern: "not isaaclab_" | |
| shard-index: "0" | |
| shard-count: "3" | |
| artifact-name: isaaclab-core-1-test-results | |
| 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, detect-changes] | |
| if: >- | |
| always() && needs.build.result == 'success' && ( | |
| needs.detect-changes.outputs.isaaclab-core == 'true' || | |
| needs.detect-changes.outputs.infra == 'true' | |
| ) | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.DOCKER_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }} | |
| isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }} | |
| filter-pattern: "not isaaclab_" | |
| shard-index: "1" | |
| shard-count: "3" | |
| artifact-name: isaaclab-core-2-test-results | |
| 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, detect-changes] | |
| if: >- | |
| always() && needs.build.result == 'success' && ( | |
| needs.detect-changes.outputs.isaaclab-core == 'true' || | |
| needs.detect-changes.outputs.infra == 'true' | |
| ) | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.DOCKER_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }} | |
| isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }} | |
| filter-pattern: "not isaaclab_" | |
| shard-index: "2" | |
| shard-count: "3" | |
| artifact-name: isaaclab-core-3-test-results | |
| container-name: isaac-lab-core-3-test | |
| test-isaaclab-rl: | |
| name: isaaclab_rl | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 180 | |
| needs: [build, detect-changes] | |
| if: >- | |
| always() && needs.build.result == 'success' && ( | |
| needs.detect-changes.outputs.isaaclab-rl == 'true' || | |
| needs.detect-changes.outputs.isaaclab-core == 'true' || | |
| needs.detect-changes.outputs.infra == 'true' | |
| ) | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.DOCKER_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }} | |
| isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }} | |
| filter-pattern: "isaaclab_rl" | |
| artifact-name: isaaclab-rl-test-results | |
| container-name: isaac-lab-rl-test | |
| test-isaaclab-mimic: | |
| name: isaaclab_mimic | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 180 | |
| needs: [build, detect-changes] | |
| if: >- | |
| always() && needs.build.result == 'success' && ( | |
| needs.detect-changes.outputs.isaaclab-mimic == 'true' || | |
| needs.detect-changes.outputs.isaaclab-core == 'true' || | |
| needs.detect-changes.outputs.infra == 'true' | |
| ) | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.DOCKER_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }} | |
| isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }} | |
| filter-pattern: "isaaclab_mimic" | |
| artifact-name: isaaclab-mimic-test-results | |
| container-name: isaac-lab-mimic-test | |
| test-isaaclab-contrib: | |
| name: isaaclab_contrib | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 180 | |
| needs: [build, detect-changes] | |
| if: >- | |
| always() && needs.build.result == 'success' && ( | |
| needs.detect-changes.outputs.isaaclab-contrib == 'true' || | |
| needs.detect-changes.outputs.isaaclab-core == 'true' || | |
| needs.detect-changes.outputs.infra == 'true' | |
| ) | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.DOCKER_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }} | |
| isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }} | |
| filter-pattern: "isaaclab_contrib" | |
| artifact-name: isaaclab-contrib-test-results | |
| container-name: isaac-lab-contrib-test | |
| test-isaaclab-teleop: | |
| name: isaaclab_teleop | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 180 | |
| needs: [build, detect-changes] | |
| if: >- | |
| always() && needs.build.result == 'success' && ( | |
| needs.detect-changes.outputs.isaaclab-teleop == 'true' || | |
| needs.detect-changes.outputs.isaaclab-core == 'true' || | |
| needs.detect-changes.outputs.infra == 'true' | |
| ) | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.DOCKER_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }} | |
| isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }} | |
| filter-pattern: "isaaclab_teleop" | |
| artifact-name: isaaclab-teleop-test-results | |
| container-name: isaac-lab-teleop-test | |
| test-isaaclab-visualizers: | |
| name: isaaclab_visualizers | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 180 | |
| needs: [build, detect-changes] | |
| if: >- | |
| always() && needs.build.result == 'success' && ( | |
| needs.detect-changes.outputs.isaaclab-visualizers == 'true' || | |
| needs.detect-changes.outputs.isaaclab-core == 'true' || | |
| needs.detect-changes.outputs.infra == 'true' | |
| ) | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.DOCKER_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }} | |
| isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }} | |
| filter-pattern: "isaaclab_visualizers" | |
| artifact-name: isaaclab-visualizers-test-results | |
| container-name: isaac-lab-visualizers-test | |
| test-isaaclab-assets: | |
| name: isaaclab_assets | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 180 | |
| needs: [build, detect-changes] | |
| if: >- | |
| always() && needs.build.result == 'success' && ( | |
| needs.detect-changes.outputs.isaaclab-assets == 'true' || | |
| needs.detect-changes.outputs.isaaclab-core == 'true' || | |
| needs.detect-changes.outputs.infra == 'true' | |
| ) | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.DOCKER_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }} | |
| isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }} | |
| filter-pattern: "isaaclab_assets" | |
| artifact-name: isaaclab-assets-test-results | |
| container-name: isaac-lab-assets-test | |
| test-isaaclab-newton: | |
| name: isaaclab_newton | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 180 | |
| needs: [build, detect-changes] | |
| if: >- | |
| always() && needs.build.result == 'success' && ( | |
| needs.detect-changes.outputs.isaaclab-newton == 'true' || | |
| needs.detect-changes.outputs.isaaclab-core == 'true' || | |
| needs.detect-changes.outputs.infra == 'true' | |
| ) | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.DOCKER_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }} | |
| isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }} | |
| filter-pattern: "isaaclab_newton" | |
| artifact-name: isaaclab-newton-test-results | |
| container-name: isaac-lab-newton-test | |
| test-isaaclab-physx: | |
| name: isaaclab_physx | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 180 | |
| needs: [build, detect-changes] | |
| if: >- | |
| always() && needs.build.result == 'success' && ( | |
| needs.detect-changes.outputs.isaaclab-physx == 'true' || | |
| needs.detect-changes.outputs.isaaclab-core == 'true' || | |
| needs.detect-changes.outputs.infra == 'true' | |
| ) | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.DOCKER_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }} | |
| isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }} | |
| filter-pattern: "isaaclab_physx" | |
| artifact-name: isaaclab-physx-test-results | |
| container-name: isaac-lab-physx-test | |
| test-curobo: | |
| name: test-curobo | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 120 | |
| continue-on-error: true | |
| needs: [build-curobo, detect-changes] | |
| if: >- | |
| always() && needs.build-curobo.result == 'success' && ( | |
| needs.detect-changes.outputs.isaaclab-mimic == 'true' || | |
| needs.detect-changes.outputs.isaaclab-core == 'true' || | |
| needs.detect-changes.outputs.infra == 'true' | |
| ) | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.DOCKER_IMAGE_TAG }}-curobo | |
| isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }} | |
| isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }} | |
| 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" | |
| artifact-name: curobo-test-results | |
| container-name: isaac-lab-curobo-test | |
| test-skillgen: | |
| name: test-skillgen | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 120 | |
| continue-on-error: true | |
| needs: [build-curobo, detect-changes] | |
| if: >- | |
| always() && needs.build-curobo.result == 'success' && ( | |
| needs.detect-changes.outputs.isaaclab-mimic == 'true' || | |
| needs.detect-changes.outputs.isaaclab-tasks == 'true' || | |
| needs.detect-changes.outputs.isaaclab-core == 'true' || | |
| needs.detect-changes.outputs.infra == 'true' | |
| ) | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.DOCKER_IMAGE_TAG }}-curobo | |
| isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }} | |
| isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }} | |
| dockerfile-path: docker/Dockerfile.curobo | |
| cache-tag: cache-curobo | |
| include-files: "test_generate_dataset_skillgen.py,test_environments_skillgen.py,test_environments_automate.py" | |
| artifact-name: skillgen-test-results | |
| container-name: isaac-lab-skillgen-test | |
| # test-quarantined: | |
| # name: "Quarantined Tests" | |
| # runs-on: [self-hosted, gpu] | |
| # timeout-minutes: 180 | |
| # continue-on-error: true | |
| # needs: [build, detect-changes] | |
| # if: >- | |
| # always() && 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.DOCKER_IMAGE_TAG }} | |
| # isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }} | |
| # isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }} | |
| # quarantined-only: "true" | |
| # artifact-name: quarantined-test-results | |
| # container-name: isaac-lab-quarantined-test | |
| test-environments-training: | |
| name: "environments_training" | |
| runs-on: [self-hosted, gpu] | |
| timeout-minutes: 300 | |
| continue-on-error: true | |
| needs: [build, detect-changes] | |
| if: >- | |
| always() && needs.build.result == 'success' && ( | |
| needs.detect-changes.outputs.isaaclab-tasks == 'true' || | |
| needs.detect-changes.outputs.isaaclab-core == 'true' || | |
| needs.detect-changes.outputs.infra == 'true' | |
| ) | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: true | |
| - uses: ./.github/actions/run-package-tests | |
| with: | |
| image-tag: ${{ env.DOCKER_IMAGE_TAG }} | |
| isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }} | |
| isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }} | |
| filter-pattern: "isaaclab_tasks" | |
| include-files: "test_environments_training.py" | |
| artifact-name: environments-training-test-results | |
| container-name: isaac-lab-environments-training-test | |
| # Combine and report results from all test jobs | |
| combine-results: | |
| needs: [test-isaaclab-tasks, test-isaaclab-tasks-2, test-isaaclab-tasks-3, test-isaaclab-core, test-isaaclab-core-2, test-isaaclab-core-3, test-isaaclab-rl, test-isaaclab-mimic, test-isaaclab-contrib, test-isaaclab-teleop, test-isaaclab-visualizers, test-isaaclab-assets, test-isaaclab-newton, test-isaaclab-physx, test-curobo, test-skillgen, test-environments-training] | |
| runs-on: ubuntu-latest | |
| if: "!cancelled()" | |
| name: Combine Results | |
| steps: | |
| - name: Checkout Code | |
| uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| lfs: false | |
| sparse-checkout: .github/actions | |
| sparse-checkout-cone-mode: true | |
| - name: Download All Test Results | |
| uses: actions/download-artifact@v8 | |
| with: | |
| pattern: "*-test-results" | |
| path: reports/ | |
| merge-multiple: true | |
| continue-on-error: true | |
| - name: Combine All Test Results | |
| if: always() | |
| uses: ./.github/actions/combine-results | |
| with: | |
| tests-dir: "reports" | |
| output-file: "reports/combined-results.xml" | |
| - name: Upload Combined Test Results | |
| uses: actions/upload-artifact@v7 | |
| if: always() | |
| with: | |
| name: pr-${{ github.event.pull_request.number }}-combined-test-results | |
| path: reports/combined-results.xml | |
| retention-days: 7 | |
| compression-level: 9 | |
| - name: Comment on Test Results | |
| id: test-reporter | |
| if: github.event.pull_request.head.repo.full_name == github.repository | |
| uses: EnricoMi/publish-unit-test-result-action@v2 | |
| with: | |
| files: "reports/combined-results.xml" | |
| check_name: "Tests Summary" | |
| comment_mode: changes | |
| comment_title: "Test Results Summary" | |
| report_individual_runs: false | |
| deduplicate_classes_by_file_name: true | |
| compare_to_earlier_commit: true | |
| fail_on: errors | |
| action_fail_on_inconclusive: true | |
| - name: Report Test Results | |
| if: github.event.pull_request.head.repo.full_name == github.repository | |
| uses: dorny/test-reporter@3d76b34a4535afbd0600d347b09a6ee5deb3ed7f # v2.6.0 | |
| with: | |
| name: IsaacLab Build and Test Results | |
| path: reports/combined-results.xml | |
| reporter: java-junit | |
| fail-on-error: true | |
| only-summary: false | |
| max-annotations: '50' | |
| report-title: "IsaacLab Test Results - ${{ github.workflow }}" |