Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
0ef7126
Optimize heterogeneous bin-packing view (#7333)
rebeccazhang0707 Aug 29, 2026
44141a2
Add PhysX-only heterogeneous multitask manipulation environment (#7375)
rebeccazhang0707 Sep 2, 2026
3a917ca
Makes DataGenConfig.max_num_failures actually bound a Mimic generatio…
2047767028-lang Sep 4, 2026
4171326
Remove solver-specific velocity task tuning (#7607)
ooctipus Sep 7, 2026
b337b96
[Tests] Skip DrLegs-Walk in the contrib environment test (#7623)
StafaH Sep 7, 2026
36ba549
Use default ground planes in MPM demos (#7639)
maxkra15 Sep 9, 2026
77b77b6
test: Add all-environment perspective golden (#7550)
nvsekkin Sep 4, 2026
94e7ba2
Report why fetching a pre-trained checkpoint failed (#7535)
AntoineRichard Sep 4, 2026
cba808b
Fix OVRTX clone-plan test import (#7582)
kellyguo11 Sep 4, 2026
54a2e7b
Add issue audit and backlog triage skills (#7359)
AntoineRichard Sep 5, 2026
84f8384
Setup IsaacRTX Minimal mode (#7377)
pbarejko Sep 4, 2026
9119495
[Newton] Delegate homogeneous world prefix generation to `ModelBuilde…
camevor Sep 4, 2026
9b2a852
[Bump] Bump Newton to 1.6.0rc1 for newton#4017 (#7445)
hujc7 Sep 5, 2026
46fac18
Support OVPhysX 0.5.11 and 0.6 lifecycle APIs (#7551)
kellyguo11 Sep 5, 2026
62405cc
Publish clone plans before scene construction (#7570)
ooctipus Sep 6, 2026
ca206ed
[Odin] Fix multi-agent play benchmark environment creation (#7360)
AntoineRichard Sep 10, 2026
9889e93
[Task Clean-up][Assets] Drop the Newton 1.5 tendon-adapter shim (#7468)
hujc7 Sep 10, 2026
54e1d78
Refresh PhysX and OVPhysX contact sensor buffers on every physics ste…
AntoineRichard Sep 11, 2026
9d31152
Support OvPhysX 0.6 while retaining public 0.5.11 compatibility (#7738)
AntoineRichard Sep 11, 2026
d1afc48
Avoid continuous rendering between video captures (#7642)
AntoineRichard Sep 15, 2026
3afc855
Fix implicit effort submission in ovphysx (#7782)
marcodiiga Sep 15, 2026
cfd6596
[Wheel] Support self-contained package and Git-source installs (#7438)
StafaH Sep 4, 2026
4747f33
Gate checkout-only tests with a root fixture (#7389)
diegoferigo-rai Sep 4, 2026
e6d88c5
Pin ovrtx-cache-warm to exact rendering node IDs (#7683)
mataylor-nvidia Sep 9, 2026
0359cda
[Changelog] Discover release branches for nightly compilation (#7736)
kellyguo11 Sep 10, 2026
30a63fe
[RL] Update RSL-RL to 5.5.1 (#7825)
StafaH Sep 16, 2026
098442a
Pin the published PyTorch stack to the supported versions (#7821)
StafaH Sep 16, 2026
a6a3b6f
Fix OVPhysX re-reading static joint and body properties every step (#…
AntoineRichard Sep 16, 2026
32f8c1e
Combine missing runtime and dependency backports
kellyguo11 Sep 16, 2026
f95bdc5
Fixed locomanipulation NuRec SDG generation (#7756)
dengyuchenkit Sep 11, 2026
4f70bc9
Added Rendering Benchmark (#7702)
daniela-hase Sep 11, 2026
46f23f7
Fix Newton joint positions in DOF space, and enable the Digit velocit…
Double7sBurger Sep 16, 2026
f9013c4
Add Newton MPM surface rendering to the teapot demo (#7640)
maxkra15 Sep 10, 2026
c860820
Refresh lockfile for combined backports
kellyguo11 Sep 16, 2026
fda5b92
Align checkout-gated metadata tests with release extras
kellyguo11 Sep 16, 2026
743b329
Add OvStage compat for GPU_INCREMENTAL in OvStage 0.2.0 (#7855)
r-schmitt Sep 16, 2026
35c6cff
Avoid Newton VBD graph coloring hangs (#7826)
maxkra15 Sep 16, 2026
d88120a
[Bump] Bump Newton to 1.6.0 (#7842)
kellyguo11 Sep 16, 2026
053c45a
Route clone backends through ClonePlan (#7462)
ooctipus Sep 4, 2026
5ada221
Merge remote-tracking branch 'upstream/release/3.0.0' into codex/back…
kellyguo11 Sep 17, 2026
f4c78e4
Refresh lockfile after release version bump
kellyguo11 Sep 17, 2026
cd77b51
Merge remote-tracking branch 'upstream/release/3.0.0' into codex/back…
kellyguo11 Sep 17, 2026
901ff40
Merge remote-tracking branch 'upstream/release/3.0.0' into codex/back…
kellyguo11 Sep 17, 2026
7f484cb
Preserve OVRTX clone-plan test dependency
kellyguo11 Sep 17, 2026
4c5c9ba
Add optional support for ovrtx-0.5 (#7351)
pbarejko Aug 29, 2026
866f0ab
Add animated Isaac Lab 3 greetings to the loading screen (#7020)
AntoineRichard Aug 21, 2026
1f9fb7e
[Docker] Install the Docker images from uv.lock (#7405)
hujc7 Sep 3, 2026
58b928b
[CI] Skip the image invariants on a deps-cache hit and link _isaac_si…
hujc7 Sep 4, 2026
599cfe9
[Fix] Restore Shadow Hand tendon controls and select simplified colli…
hujc7 Sep 10, 2026
dada6f7
Align Newton import test with ClonePlan arrays
kellyguo11 Sep 17, 2026
13754a5
Align multitask config imports with configclass export
kellyguo11 Sep 17, 2026
6dd71b3
Restore installed package regression coverage
kellyguo11 Sep 17, 2026
4f4e565
Align cuRobo security test with uv image install
kellyguo11 Sep 17, 2026
cd29594
Remove backported task preview from repository
kellyguo11 Sep 17, 2026
21b813d
Update nightly image pull request automation (#7867)
kellyguo11 Sep 17, 2026
34f0521
Fix Franka Pour collider variant (#7866)
maxkra15 Sep 17, 2026
a32b6e8
Let standalone demos complete the health check after startup (#7869)
ooctipus Sep 17, 2026
df2a21f
Fix operational-space feedback and task-frame consistency (#7868)
ooctipus Sep 17, 2026
71ad92a
Fix Franka Lift reset sampling after the collider default changed (#7…
ooctipus Sep 17, 2026
5771fd4
Fix Franka Pour collider variant (#7866)
maxkra15 Sep 17, 2026
ada0941
Fix Franka Pour collider variant (#7866)
maxkra15 Sep 17, 2026
c06495a
Fix Franka Lift reset sampling after the collider default changed (#7…
ooctipus Sep 17, 2026
bb7d75e
Fix Franka Lift reset sampling after the collider default changed (#7…
ooctipus Sep 17, 2026
7189927
Fix operational-space feedback and task-frame consistency (#7868)
ooctipus Sep 17, 2026
48a6090
Fix operational-space feedback and task-frame consistency (#7868)
ooctipus Sep 17, 2026
7f2b7d1
Merge branch 'codex/backport-missing-tasks-demos-release-3.0.0' into …
kellyguo11 Sep 17, 2026
9a9da2f
Merge branch 'codex/backport-missing-tooling-tests-release-3.0.0' int…
kellyguo11 Sep 17, 2026
4a0e70b
Run release CI against the latest develop image
kellyguo11 Sep 17, 2026
1b22248
Preserve instanced visuals when cloning active OVRTX sources
ooctipus Sep 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .agents/skills/isaaclab-auditing-an-issue
1 change: 1 addition & 0 deletions .agents/skills/isaaclab-triaging-issue-backlog
2 changes: 2 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ docker/.container.cfg
recordings/
# ignore __pycache__
**/__pycache__/
**/.pytest_cache/
**/.ruff_cache/
**/*.egg-info/
# ignore isaac sim symlink
_isaac_sim
Expand Down
13 changes: 13 additions & 0 deletions .github/actions/ecr-build-push-pull/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,19 @@ ECR is also used as the BuildKit layer cache.
ecr-url: (optional, complete url for ECR storage)
```

## Verifying a freshly built image

Pass `verify-test-path` to assert against the image before it is published:

```yaml
verify-test-path: docker/test/test_image_invariants.py
```

The tests run only on a full build, with `IMAGE_TAG` set, so the caller's job needs `uv`
(`astral-sh/setup-uv`). A failure fails the action with nothing pushed, so the next run
rebuilds rather than serving the bad image from the deps cache. Exact-tag and deps-cache hits skip
them: that image passed when it was built.

## ECR URL resolution order

1. `ecr-url` input
Expand Down
27 changes: 27 additions & 0 deletions .github/actions/ecr-build-push-pull/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,16 @@ inputs:
description: Tag used for the ECR layer cache image (e.g. "cache-base", "cache-curobo").
required: false
default: 'cache'
verify-test-path:
description: >
Path to a test file or directory asserted against a freshly built image, before it is
tagged or pushed. Tests run with IMAGE_TAG set; a failure fails the action with nothing
published, so the next run rebuilds instead of inheriting the bad image from the cache.

Not run on an exact-tag or deps-cache hit: those serve an image that already passed when it
was built.
required: false
default: ''
pull-on-deps-hit:
description: >
Pull the image locally after a deps-cache hit. Needed by jobs that run
Expand Down Expand Up @@ -244,6 +254,23 @@ runs:
cache-to: ${{ steps.resolve-ecr.outputs.available == 'true' && format('type=registry,ref={0},mode=max', env.CACHE_IMAGE) || '' }}
deps-hash: ${{ steps.deps-hash.outputs.hash }}

# Assert against the image while it is only local: the push steps below publish under both
# the commit tag and the deps tag, and a deps-cache hit later serves that image without
# rebuilding it, so anything published unverified stays unverified.
- name: Verify freshly built image
if: >
inputs.verify-test-path != '' &&
steps.pull-exact.outputs.hit != 'true' &&
steps.deps-cache.outputs.deps-cache-hit != 'true'
shell: bash
env:
IMAGE_TAG: ${{ inputs.image-tag }}
TEST_PATH: ${{ inputs.verify-test-path }}
run: |
set -euo pipefail
uv run --no-project --with pytest \
python -m pytest -q "${TEST_PATH}"

- name: Tag built image with ECR-prefixed name
if: >
steps.resolve-ecr.outputs.available == 'true' &&
Expand Down
20 changes: 13 additions & 7 deletions .github/actions/run-tests/run_tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -413,13 +413,19 @@ run_tests() {
fi
if [ -n \"\${TEST_EXTRA_UV_PACKAGES:-}\" ]; then
echo \"Installing extra packages with uv: \${TEST_EXTRA_UV_PACKAGES}\"
# isaaclab.sh prints an informational line before command output, and pip
# installs scripts into the user base when Isaac Sim site-packages is read-only.
isaac_python=\"\$(./isaaclab.sh -p -c 'import sys; print(sys.executable)' | tail -n 1)\"
isaac_user_site=\"\$(./isaaclab.sh -p -c 'import site; print(site.getusersitepackages())' | tail -n 1)\"
uv_executable=\"\$(./isaaclab.sh -p -c 'import pathlib, site; print(pathlib.Path(site.getuserbase()) / \"bin\" / \"uv\")' | tail -n 1)\"
if [ ! -x \"\${uv_executable}\" ]; then
bash /with-python-package-retries.sh ./isaaclab.sh -p -m pip install uv
# isaaclab.sh prints an [INFO] banner on stdout around the command output, so the
# banner is filtered rather than positionally skipped.
isaac_python=\"\$(./isaaclab.sh -p -c 'import sys; print(sys.executable)' | grep -v '^\[INFO\]' | tail -n 1)\"
isaac_user_site=\"\$(./isaaclab.sh -p -c 'import site; print(site.getusersitepackages())' | grep -v '^\[INFO\]' | tail -n 1)\"
# The image ships uv on PATH. Fall back to the user base only for images that do
# not: pip installs into the venv, not the user base, when the interpreter is a venv,
# so the user-base path is never created there.
uv_executable=\"\$(command -v uv || true)\"
if [ -z \"\${uv_executable}\" ]; then
uv_executable=\"\$(./isaaclab.sh -p -c 'import pathlib, site; print(pathlib.Path(site.getuserbase()) / \"bin\" / \"uv\")' | grep -v '^\[INFO\]' | tail -n 1)\"
if [ ! -x \"\${uv_executable}\" ]; then
bash /with-python-package-retries.sh ./isaaclab.sh -p -m pip install uv
fi
fi
bash /with-python-package-retries.sh \"\${uv_executable}\" pip install --python \"\${isaac_python}\" --target \"\${isaac_user_site}\" \${TEST_EXTRA_UV_PACKAGES}
# Isaac Sim puts bundled packages ahead of the user site. Overlay only
Expand Down
14 changes: 14 additions & 0 deletions .github/test-subsets/postmerge-rendering.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,17 @@ rendering-correctness-kitless-ovstage = [
"source/isaaclab_tasks/test/core/test_rendering_cartpole_kitless.py::test_rendering_cartpole_kitless[ovstage-newton-ovrtx_renderer-static]",
"source/isaaclab_tasks/test/core/test_rendering_cartpole_kitless.py::test_rendering_cartpole_kitless[ovstage-ovphysx-ovrtx_renderer-static]",
]

# Nodes the shader-cache warmer runs: the RTX-renderer subset of the lists above,
# which are the only ones that compile PSO blobs. isaacsim_rtx fills kit/ and ovrtx
# fills kitless/; the newton_renderer nodes drive the Warp rasterizer and populate
# neither tree. Exact node IDs rather than a -k expression so a parametrize-ID
# rename fails collection instead of silently selecting nothing.
ovrtx-cache-warm = [
"source/isaaclab_tasks/test/core/test_rendering_cartpole.py::test_rendering_cartpole[newton-isaacsim_rtx_renderer-static]",
"source/isaaclab_tasks/test/core/test_rendering_cartpole.py::test_rendering_cartpole[physx-isaacsim_rtx_renderer-static]",
"source/isaaclab_tasks/test/core/test_rendering_cartpole_kitless.py::test_rendering_cartpole_kitless[legacy-newton-ovrtx_renderer-static]",
"source/isaaclab_tasks/test/core/test_rendering_cartpole_kitless.py::test_rendering_cartpole_kitless[legacy-ovphysx-ovrtx_renderer-static]",
"source/isaaclab_tasks/test/core/test_rendering_cartpole_kitless.py::test_rendering_cartpole_kitless[ovstage-newton-ovrtx_renderer-static]",
"source/isaaclab_tasks/test/core/test_rendering_cartpole_kitless.py::test_rendering_cartpole_kitless[ovstage-ovphysx-ovrtx_renderer-static]",
]
31 changes: 7 additions & 24 deletions .github/workflows/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
# -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'
# -c 'cd /workspace/isaaclab && ./isaaclab.sh -p -m pytest tools -v'
#
# Remember to REVERT all temporary changes before merging!
# =============================================================================
Expand Down Expand Up @@ -223,6 +223,7 @@ jobs:
isaacsim-version: ${{ needs.config.outputs.isaacsim_image_tag }}
dockerfile-path: docker/Dockerfile.base
cache-tag: cache-base
verify-test-path: docker/test/test_image_invariants.py

build-curobo:
name: Build cuRobo Docker Image
Expand Down Expand Up @@ -697,16 +698,6 @@ jobs:
# 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 \
"${{ needs.config.outputs.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: |
Expand Down Expand Up @@ -747,16 +738,6 @@ jobs:
# 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 \
"${{ needs.config.outputs.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: |
Expand Down Expand Up @@ -1044,9 +1025,11 @@ jobs:
test_rendering_cartpole_kitless.py
# Only the two RTX paths compile PSO blobs: isaacsim_rtx fills kit/ and
# ovrtx fills kitless/. newton_warp would exercise the Warp rasterizer,
# which populates neither tree.
test-k-expr: >-
(isaacsim_rtx or ovrtx) and (rgb or depth)
# which populates neither tree. The nodes are pinned by exact ID rather
# than a -k expression, so a parametrize-ID rename fails collection here
# instead of quietly leaving the warmer with nothing to run.
test-node-ids-file: .github/test-subsets/postmerge-rendering.toml
test-node-ids-key: ovrtx-cache-warm
ovrtx-shader-cache: ${{ env.PUBLISHES_OVRTX_CACHE == 'true' && 'save' || 'restore' }}
container-name: isaac-lab-ovrtx-cache-warm
omni-github-test-type: ovrtx-cache-warm
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
# (frozen at 6.1.0-alpha.2). Both images use Isaac Sim's NGC org, which is current and
# which the CI credential can reach.
isaacsim_image_name: nvcr.io/0947644777160149/internal/isaac-sim
# Test the release/3.0.0 branch against the latest Isaac Sim 6.1 release image.
isaacsim_image_tag: latest-release-6-1
# Isaac Sim 6.1.0-alpha.50 (b86cf6ce) includes Kit 110.3.0-360924's fix for NVBug 6566677.
isaacsim_image_tag: latest-develop@sha256:223adbb0a6f1897ed78d40597dac2efc740843e8051779ffdcbb021a9edc1217
isaaclab_image_name: nvcr.io/0947644777160149/internal/isaac-lab
ovphysx_wheelhouse_image: ""
4 changes: 2 additions & 2 deletions .github/workflows/docs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ jobs:

- name: Install docs dependencies
run: |
bash "$GITHUB_WORKSPACE/.github/actions/_lib/with-python-package-retries.sh" uv sync --extra test
bash "$GITHUB_WORKSPACE/.github/actions/_lib/with-python-package-retries.sh" uv sync --extra dev
echo "$PWD/.venv/bin" >> "$GITHUB_PATH"

- name: Build current version docs
Expand Down Expand Up @@ -98,7 +98,7 @@ jobs:

- name: Install docs dependencies
run: |
bash "$GITHUB_WORKSPACE/.github/actions/_lib/with-python-package-retries.sh" uv sync --extra test
bash "$GITHUB_WORKSPACE/.github/actions/_lib/with-python-package-retries.sh" uv sync --extra dev
echo "$PWD/.venv/bin" >> "$GITHUB_PATH"

- name: Generate multi-version docs
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/license-check.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ jobs:
ISAACSIM_ACCEPT_EULA: YES
run: |
bash "$GITHUB_WORKSPACE/.github/actions/_lib/with-python-package-retries.sh" \
uv sync --extra all --extra isaacsim --extra test --extra rlinf --extra mimic
uv sync --extra all --extra isaacsim --extra dev --extra rlinf --extra mimic
# ``[tool.uv.pip] prerelease = "allow"`` lets unpinned tools float onto
# prereleases. pip-licenses 6.0.0a1 reports an empty License where 5.x reports
# ``UNKNOWN``, which license-exceptions.json keys on, and joins multi-license
Expand Down
66 changes: 41 additions & 25 deletions .github/workflows/nightly-changelog.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@
# Scheduled workflow — must live on the default branch (``main``) for the
# cron to register. See ``.github/workflows/README.md``.
#
# Adding a branch to the nightly set is a one-line edit to ``env.CRON_BRANCHES``
# below. Each target branch uses its own ``tools/changelog/cli.py`` (the
# same copy the PR gate already runs), so the nightly compile honours the
# same rules that validated the fragments.
# Scheduled runs combine ``env.CRON_BRANCHES`` with every remote
# ``release/*`` branch that carries ``tools/changelog/cli.py``. This picks up
# new compiler-enabled release branches automatically while leaving historical
# branches that predate the fragment system untouched.
#
# The push uses a short-lived GitHub App installation token minted from
# ``CHANGELOG_APP_ID`` + ``CHANGELOG_APP_PRIVATE_KEY`` (repo secrets). The
Expand All @@ -30,13 +30,11 @@

name: Nightly Changelog Compilation

# Branches the nightly cron compiles. Single source of truth — append a
# ref here to extend the nightly set (the active release branch belongs
# here). Each branch must carry ``tools/changelog/cli.py`` and the
# isaaclab-bot App must be in its branch-ruleset bypass list.
# Surrounding whitespace per entry is stripped by the resolver below.
# Static branches the nightly cron compiles. The resolver also discovers every
# remote ``release/*`` branch that carries ``tools/changelog/cli.py``. Every
# resolved branch must allow the isaaclab-bot App to bypass its ruleset.
env:
CRON_BRANCHES: develop,release/3.0.0-beta2
CRON_BRANCHES: develop

on:
schedule:
Expand All @@ -51,7 +49,7 @@ on:
# develop) without needing to update the workflow. A branch
# that lacks ``tools/changelog/cli.py`` fails the verify step
# below with a clear error, which is the desired failure mode.
description: 'Branch to compile (e.g. develop, release/3.0.0-beta2). Must carry tools/changelog/cli.py.'
description: 'Branch to compile (e.g. develop, release/3.0.0). Must carry tools/changelog/cli.py.'
required: true
type: string
dry_run:
Expand All @@ -67,10 +65,8 @@ permissions:

jobs:
resolve-branches:
# CSV → JSON array bridge. ``workflow_dispatch`` inputs can only be
# string / bool / choice, so the branch list arrives as a comma-
# separated string; the matrix below needs a JSON list to fan out.
# Mirrors the ``setup-versions`` job in ``daily-compatibility.yml``.
# Static/manual branches plus supported ``release/*`` refs → JSON array.
# ``workflow_dispatch`` remains exactly one explicitly requested branch.
name: Resolve branch list
runs-on: ubuntu-latest
timeout-minutes: 1
Expand All @@ -79,18 +75,39 @@ jobs:
steps:
- id: b
env:
# Schedule → the CRON_BRANCHES list. Manual → the single branch
# the maintainer entered. The two paths are intentionally
# asymmetric: cron is the configured set, manual is exactly one
# branch (required input).
# Schedule → static branches plus supported remote ``release/*``
# refs. Manual → exactly the branch the maintainer entered.
BRANCHES: ${{ github.event_name == 'schedule' && env.CRON_BRANCHES || inputs.branch }}
# ``EVENT_NAME`` mirrors ``github.event_name`` so the guard below
# branches on it without re-interpolating into the shell.
EVENT_NAME: ${{ github.event_name }}
REPOSITORY: ${{ github.repository }}
API_TOKEN: ${{ github.token }}
run: |
# CSV → JSON array, trimming surrounding whitespace per entry.
# Manual produces a 1-element array; cron produces N elements.
arr=$(echo "$BRANCHES" | tr ',' '\n' | xargs -n1 | jq -R . | jq -s -c .)
branches=$(echo "$BRANCHES" | tr ',' '\n' | xargs -n1)
if [ "$EVENT_NAME" = "schedule" ]; then
release_branches=$(git ls-remote --heads "https://github.com/$REPOSITORY.git" 'refs/heads/release/*' \
| awk '{sub(/^refs\/heads\//, "", $2); print $2}')
while IFS= read -r branch; do
[ -z "$branch" ] && continue
encoded_branch=$(jq -rn --arg branch "$branch" '$branch | @uri')
http_status=$(curl --silent --show-error --output /dev/null --write-out '%{http_code}' \
--header "Authorization: Bearer $API_TOKEN" \
--header 'Accept: application/vnd.github+json' \
--header 'X-GitHub-Api-Version: 2022-11-28' \
"https://api.github.com/repos/$REPOSITORY/contents/tools/changelog/cli.py?ref=$encoded_branch")
case "$http_status" in
200) branches=$(printf '%s\n%s\n' "$branches" "$branch") ;;
404) echo "::notice::Skipping $branch because it predates the changelog compiler." ;;
*)
echo "::error::GitHub Contents API returned HTTP $http_status for $branch."
exit 1
;;
esac
done <<< "$release_branches"
fi
# Trim, de-duplicate, and convert the resolved branches to a JSON array.
arr=$(printf '%s\n' "$branches" | sed '/^$/d' | sort -u | jq -R . | jq -s -c .)
# Manual trigger contract: exactly one branch. A maintainer who
# pastes a comma-separated list into the dispatch form should
# see a clear error, not a silent multi-branch fan-out.
Expand All @@ -109,9 +126,8 @@ jobs:
strategy:
# Independent branches: one failing shouldn't cancel the others.
# Each matrix entry shows up as a separate job tile in the Actions
# UI, so ``release/3.0.0-beta2`` failing doesn't hide ``develop``'s
# success (and ``gh run rerun --failed`` re-runs only the failed
# entry). Mirrors ``daily-compatibility.yml``'s matrix style.
# UI, so one release ref failing doesn't hide another ref's success
# (and ``gh run rerun --failed`` re-runs only the failed entry).
fail-fast: false
matrix:
branch: ${{ fromJson(needs.resolve-branches.outputs.branches) }}
Expand Down
Loading
Loading