Skip to content

Splits Tests More Evenly, Only Runs Relevant Ones, Improves Job Cancellation, Adds Reporting #743

Splits Tests More Evenly, Only Runs Relevant Ones, Improves Job Cancellation, Adds Reporting

Splits Tests More Evenly, Only Runs Relevant Ones, Improves Job Cancellation, Adds Reporting #743

Workflow file for this run

# 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 }}"