Skip to content

Commit ad56b35

Browse files
committed
Merge branch 'main' of github.com:isl-org/Open3D into feature/ndt-registration
2 parents c3640f5 + cf67052 commit ad56b35

228 files changed

Lines changed: 12615 additions & 1519 deletions

File tree

Some content is hidden

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

.dockerignore

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,14 @@ docs/_out
88
.python-version
99
cmake-build-*
1010
.git
11+
12+
# CI runner artifacts (wheel job downloads the lib image next to the checkout).
13+
# Not used by Dockerfile COPY; including them blew the build context to ~20GB.
14+
open3d-lib-sycl-shared.tar.zst
15+
open3d-lib-*.tar.zst
16+
open3d-lib-*.tar.gz
17+
open3d-devel-*.tar.xz
18+
open3d-devel-*.tar.gz
19+
open3d-ci-*.tar.xz
20+
open3d-ci-*.tar.gz
21+
open3d*.whl

.github/workflows/README.md

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,49 @@ possible. For jobs that use docker, or auxiliary jobs (e.g. uploading artifacts
88
to google cloud), use ubuntu-latest to avoid changing the version on GitHub
99
actions updates. On macOS and Windows, using Ubuntu reduces CI cost.
1010

11+
## CI test layout
12+
13+
Open3D splits **C++** and **Python** testing so each configuration is exercised
14+
once, without re-running the full suite in every wheel matrix cell. Docker-based
15+
workflows use `docker/docker_test.sh`; see `docker/docker_test.sh` usage for tag
16+
names.
17+
18+
### `docker_test.sh` phases
19+
20+
Optional second argument (default `all`):
21+
22+
| Phase | Runs |
23+
|-------|------|
24+
| `cpp` | C++ gtest only (`./bin/tests --gtest_shuffle`) |
25+
| `lib` | `cpp` + command-line tools + C++ linking example + `make uninstall` |
26+
| `python` | `pytest python/test` inside the CI image |
27+
| `all` | `lib` + `python` (full suite) |
28+
29+
SYCL, CPU (`cpu-static`, `cpu-shared-ml`, …), and OpenBLAS docker tags support
30+
all phases. CUDA ML configs on GCE (`ubuntu-cuda.yml`) call `docker_test.sh`
31+
with one argument only → **`all`** on a GPU VM.
32+
33+
### Where tests run
34+
35+
| Area | C++ / integration | Python | Notes |
36+
|------|-------------------|--------|--------|
37+
| **ubuntu.yml** | `lib` per matrix leg | `python` in same image | All in Docker |
38+
| **ubuntu-sycl.yml** | `cpp` in **build-lib** (ON/OFF) | `python` in **build-wheel** after `docker_build.sh sycl-shared py*` | No duplicate bare `docker run` gtest |
39+
| **ubuntu-openblas.yml** | `lib` once on **build-lib-arm64** (reference image); amd64 `lib` in single job | `python` once per Python version in wheel job (`"${DOCKER_TAG}"`) | Wheel matrix does not re-run C++ |
40+
| **ubuntu-cuda.yml** | **`all`** on GCE per `CI_CONFIG` | same step | Only workflow with CUDA GPUs in tests |
41+
| **ubuntu-wheel.yml** | **Once** in **test-cpp** (gtest bundle from **build-lib**) | **test-wheel-cpu**: host `test_wheel` + `run_python_tests` per Python (CUDA + CPU wheel smoke); wheels built in Docker, tests on `ubuntu-22.04` runner | No GPU on GitHub |
42+
| **windows.yml** / **macos.yml** | gtest in **build-lib** | **test-wheel** on runner | Native builds, not docker |
43+
44+
GitHub-hosted runners have **no CUDA GPU**. SYCL jobs rely on SYCL-CPU / skips;
45+
Windows **test-wheel** skips pytest on the `cuda` device matrix leg.
46+
47+
### Downstream jobs when build-lib fails
48+
49+
**build-wheel** (and related jobs such as **test-wheel**, **test-cpp** on
50+
ubuntu-wheel) use `if: ${{ always() && !cancelled() }}` with `needs: build-lib`
51+
so wheel builds and tests still run when a lib job failed (e.g. flaky gtest).
52+
Steps may fail if required artifacts were never uploaded.
53+
1154
## Documentation deployment
1255

1356
### Directory structure
@@ -83,7 +126,7 @@ Now `~/open3d-ci-sa-key.json` should have been created.
83126

84127
### CI Procedure
85128

86-
The GCE CI workflow `.github/workflows/gce-ubuntu-docker.yml` performs these steps:
129+
The GCE CI workflow `.github/workflows/ubuntu-cuda.yml` performs these steps:
87130

88131
- Clone the repository
89132
- Build docker image, starting with a an NVIDIA base devel image with CUDA and
@@ -92,10 +135,8 @@ The GCE CI workflow `.github/workflows/gce-ubuntu-docker.yml` performs these ste
92135
- On Google Compute Engine (GCE), in parallel (up to GPU quota limit - currently
93136
4):
94137
- Create a new VM instance with a custom OS image
95-
- Run docker image on GCE (Google Compute Engine) with environment variables
96-
set for specific build config.
97-
- The docker image entrypoint is the `run-ci.sh` script: build, install, run
98-
tests and uninstall.
138+
- Build the docker image on the VM, then run `docker/docker_test.sh` for the
139+
config (full `all` phase: C++ gtest, Python pytest, linking, uninstall).
99140
- Delete the VM instance.
100141

101142
A separate VM instance is created for each commit and build option. The VM

.github/workflows/macos.yml

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ jobs:
143143
144144
build-wheel:
145145
needs: build-lib
146+
if: ${{ always() && !cancelled() }}
146147
name: Build wheel
147148
permissions:
148149
contents: write # upload
@@ -171,7 +172,7 @@ jobs:
171172
env:
172173
# TensorFlow v2.20 only supports macOS-14 (Apple Silicon) and python 3.9-3.13
173174
BUILD_TENSORFLOW_OPS: ${{ matrix.python_version >= '3.14' && 'OFF' || 'ON' }}
174-
# PyTorch 2.10 only supports macOS-14 (Apple Silicon) and python 3.10-3.14
175+
# PyTorch 2.13 only supports macOS-14 (Apple Silicon) and python 3.10-3.14
175176
BUILD_PYTORCH_OPS: 'ON'
176177
OPEN3D_ML_ROOT: ${{ github.workspace }}/Open3D-ML
177178
steps:
@@ -182,7 +183,9 @@ jobs:
182183
uses: actions/checkout@v4
183184
with:
184185
repository: isl-org/Open3D-ML
185-
ref: main
186+
# TODO(ss/sycl-mlops): switch back to main once the torch 2.13
187+
# requirements-torch.txt bump on ss/xpu is merged upstream.
188+
ref: ss/xpu
186189
path: ${{ env.OPEN3D_ML_ROOT }}
187190

188191
- name: Download build artifact
@@ -264,6 +267,7 @@ jobs:
264267
contents: read
265268
runs-on: ${{ matrix.os }}
266269
needs: [build-wheel]
270+
if: ${{ always() && !cancelled() }}
267271
strategy:
268272
fail-fast: false
269273
matrix:
@@ -284,7 +288,7 @@ jobs:
284288
env:
285289
# TensorFlow v2.20 only supports macOS-14 (Apple Silicon) and python 3.9-3.13
286290
BUILD_TENSORFLOW_OPS: ${{ matrix.python_version >= '3.14' && 'OFF' || 'ON' }}
287-
# PyTorch 2.10 only supports macOS-14 (Apple Silicon) and python 3.10-3.14
291+
# PyTorch 2.13 only supports macOS-14 (Apple Silicon) and python 3.10-3.14
288292
BUILD_PYTORCH_OPS: 'ON'
289293
OPEN3D_ML_ROOT: ${{ github.workspace }}/Open3D-ML
290294
steps:
@@ -295,7 +299,9 @@ jobs:
295299
uses: actions/checkout@v4
296300
with:
297301
repository: isl-org/Open3D-ML
298-
ref: main
302+
# TODO(ss/sycl-mlops): switch back to main once the torch 2.13
303+
# requirements-torch.txt bump on ss/xpu is merged upstream.
304+
ref: ss/xpu
299305
path: ${{ env.OPEN3D_ML_ROOT }}
300306

301307
- name: Download wheels

.github/workflows/ubuntu-openblas.yml

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,11 @@ jobs:
3131
- name: Docker build
3232
run: docker/docker_build.sh openblas-amd64-py312-dev
3333

34-
- name: Docker test
35-
run: docker/docker_test.sh openblas-amd64-py312-dev
34+
- name: Docker test (C++ and integration)
35+
run: docker/docker_test.sh openblas-amd64-py312-dev lib
36+
37+
- name: Docker test (Python)
38+
run: docker/docker_test.sh openblas-amd64-py312-dev python
3639

3740
build-lib-arm64:
3841
name: Build Lib ARM64
@@ -68,6 +71,9 @@ jobs:
6871
path: open3d-lib-arm64.tar.gz
6972
retention-days: 1
7073

74+
- name: Docker test (C++ and integration)
75+
run: docker/docker_test.sh openblas-arm64-py310-dev lib
76+
7177
build-wheel-arm64:
7278
name: Build Wheel ARM64
7379
permissions:
@@ -76,6 +82,7 @@ jobs:
7682
attestations: write
7783
runs-on: ubuntu-24.04-arm
7884
needs: build-lib-arm64
85+
if: ${{ always() && !cancelled() }}
7986
strategy:
8087
fail-fast: false
8188
matrix:
@@ -148,6 +155,5 @@ jobs:
148155
run: |
149156
.github/workflows/update_release.sh ${{ env.PIP_PKG_NAME }}
150157
151-
# Move after artifact upload, so failing / flaky C++ tests don't block the uploads.
152-
- name: Docker test
153-
run: docker/docker_test.sh "${DOCKER_TAG}"
158+
- name: Docker test (Python)
159+
run: docker/docker_test.sh "${DOCKER_TAG}" python

.github/workflows/ubuntu-sycl.yml

Lines changed: 17 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,16 @@ jobs:
7474
path: open3d-devel-*.tar.xz
7575
if-no-files-found: error
7676

77+
- name: Remove lib image tarball from workspace
78+
# Multi-GB and no longer needed once uploaded; frees runner disk for the
79+
# C++ tests. The devel / wheel / ccache tarballs stay: the main-branch
80+
# release and ccache upload steps below still read them.
81+
if: ${{ matrix.BUILD_SHARED_LIBS == 'ON' }}
82+
run: rm -f open3d-lib-sycl-shared.tar.zst
83+
7784
- name: Docker test (C++)
78-
# Only the C++ phase runs here; Python tests run later in the
79-
# build-wheel job against the actual per-Python-version wheel
80-
# (see docker/docker_test.sh's cpp_test()/python_test() split),
81-
# so we avoid testing Python twice.
85+
# C++ only here; Python runs in build-wheel via docker_test.sh python
86+
# inside the per-Python-version image (see docker/docker_test.sh).
8287
run: |
8388
if [ "${{ matrix.BUILD_SHARED_LIBS }}" = "ON" ]; then
8489
docker/docker_test.sh sycl-shared cpp
@@ -119,6 +124,8 @@ jobs:
119124
artifact-metadata: write
120125
runs-on: ubuntu-latest
121126
needs: build-lib
127+
# Run even when build-lib failed (e.g. flaky C++ tests) so wheel jobs still execute.
128+
if: ${{ always() && !cancelled() }}
122129
strategy:
123130
fail-fast: false
124131
matrix:
@@ -136,7 +143,6 @@ jobs:
136143
python_version: '3.13'
137144
env:
138145
PYTHON_VERSION: ${{ matrix.python_version }}
139-
OPEN3D_ML_ROOT: ${{ github.workspace }}/open3d_ml
140146
# TensorFlow v2.20 only supports python 3.9-3.13
141147
BUILD_TENSORFLOW_OPS: ${{ matrix.python_version >= '3.14' && 'OFF' || 'ON' }}
142148
steps:
@@ -154,21 +160,19 @@ jobs:
154160
path: .
155161

156162
- name: Load Lib Image
157-
run: zstd -d --stdout open3d-lib-sycl-shared.tar.zst | docker load
163+
run: |
164+
zstd -d --stdout open3d-lib-sycl-shared.tar.zst | docker load
165+
rm -f open3d-lib-sycl-shared.tar.zst
158166
159167
- name: Docker build
160168
run: |
161169
export BASE_IMAGE=open3d-lib-sycl-shared:latest
162-
170+
163171
# We execute docker buildscript with python version argument.
164172
docker/docker_build.sh sycl-shared py${{ matrix.python_version }}
165173
166-
# The loaded build-lib image contains its Python 3.12 wheel. Keep
167-
# only the wheel produced for this matrix entry before later steps
168-
# expand open3d*.whl.
169-
PYTHON_ABI="cp${PYTHON_VERSION/./}"
170-
find . -maxdepth 1 -name 'open3d*.whl' \
171-
! -name "*${PYTHON_ABI}-${PYTHON_ABI}-*.whl" -delete
174+
- name: Docker test (Python)
175+
run: docker/docker_test.sh sycl-shared python
172176

173177
- name: Generate artifact attestation
174178
if: ${{ github.ref == 'refs/heads/main' }}
@@ -184,37 +188,6 @@ jobs:
184188
path: open3d*.whl
185189
if-no-files-found: error
186190

187-
- name: Checkout Open3D-ML source code
188-
uses: actions/checkout@v4
189-
with:
190-
repository: isl-org/Open3D-ML
191-
ref: main
192-
path: ${{ env.OPEN3D_ML_ROOT }}
193-
194-
- name: Install runtime dependencies
195-
# Open3D links against EGL for GPU-accelerated offscreen rendering
196-
# (see cpp/open3d/visualization/visualizer/EGLOffscreenContext.*).
197-
# This bare runner (unlike the docker_build.sh image) does not have
198-
# it installed by default.
199-
run: sudo apt-get update && sudo apt-get install --yes libegl1
200-
201-
- name: Set up Python
202-
uses: actions/setup-python@v5
203-
with:
204-
python-version: ${{ matrix.python_version }}
205-
206-
- name: Test Python package
207-
run: |
208-
python -V
209-
source util/ci_utils.sh
210-
test_wheel open3d*.whl
211-
212-
- name: Run Python unit tests
213-
run: |
214-
source util/ci_utils.sh
215-
echo "Running Open3D python tests..."
216-
run_python_tests
217-
218191
- name: Update devel release
219192
if: ${{ github.ref == 'refs/heads/main' }}
220193
env:

.github/workflows/ubuntu-wheel.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ jobs:
6868
name: Test C++
6969
runs-on: ubuntu-22.04
7070
needs: [build-lib]
71+
if: ${{ always() && !cancelled() }}
7172
steps:
7273
- name: Checkout source code
7374
uses: actions/checkout@v4
@@ -89,6 +90,7 @@ jobs:
8990
9091
build-wheel:
9192
needs: build-lib
93+
if: ${{ always() && !cancelled() }}
9294
permissions:
9395
contents: write # Release upload
9496
id-token: write
@@ -209,6 +211,7 @@ jobs:
209211
contents: read
210212
runs-on: ubuntu-22.04
211213
needs: [build-wheel]
214+
if: ${{ always() && !cancelled() }}
212215
strategy:
213216
fail-fast: false
214217
matrix:
@@ -240,7 +243,9 @@ jobs:
240243
uses: actions/checkout@v4
241244
with:
242245
repository: isl-org/Open3D-ML
243-
ref: main
246+
# TODO(ss/sycl-mlops): switch back to main once the torch 2.13
247+
# requirements-torch.txt bump on ss/xpu is merged upstream.
248+
ref: ss/xpu
244249
path: ${{ env.OPEN3D_ML_ROOT }}
245250
- name: Download wheels
246251
uses: actions/download-artifact@v4
@@ -276,8 +281,3 @@ jobs:
276281
source util/ci_utils.sh
277282
pi_tag=$(python -c "import sys; print(f'cp{sys.version_info.major}{sys.version_info.minor}')")
278283
test_wheel open3d_cpu*-"$pi_tag"-*.whl
279-
- name: Run Python unit tests (CPU)
280-
run: |
281-
source util/ci_utils.sh
282-
echo "Running Open3D python tests (CPU wheel)..."
283-
run_python_tests

.github/workflows/ubuntu.yml

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,27 @@ jobs:
5454
elif [ "${{ matrix.BUILD_SHARED_LIBS }}" = "ON" ] && [ "${{ env.MLOPS }}" = "ON" ] && [ "${{ env.DEVELOPER_BUILD }}" = "OFF" ]; then
5555
docker/docker_build.sh cpu-shared-ml-release
5656
fi
57-
- name: Docker test
57+
- name: Docker test (C++ and integration)
5858
run: |
5959
if [ "${{ matrix.BUILD_SHARED_LIBS }}" = "OFF" ] && [ "${{ env.MLOPS }}" = "OFF" ] && [ "${{ env.DEVELOPER_BUILD }}" = "ON" ]; then
60-
docker/docker_test.sh cpu-static
60+
docker/docker_test.sh cpu-static lib
6161
elif [ "${{ matrix.BUILD_SHARED_LIBS }}" = "OFF" ] && [ "${{ env.MLOPS }}" = "OFF" ] && [ "${{ env.DEVELOPER_BUILD }}" = "OFF" ]; then
62-
docker/docker_test.sh cpu-static-release
62+
docker/docker_test.sh cpu-static-release lib
6363
elif [ "${{ matrix.BUILD_SHARED_LIBS }}" = "ON" ] && [ "${{ env.MLOPS }}" = "ON" ] && [ "${{ env.DEVELOPER_BUILD }}" = "ON" ]; then
64-
docker/docker_test.sh cpu-shared-ml
64+
docker/docker_test.sh cpu-shared-ml lib
6565
elif [ "${{ matrix.BUILD_SHARED_LIBS }}" = "ON" ] && [ "${{ env.MLOPS }}" = "ON" ] && [ "${{ env.DEVELOPER_BUILD }}" = "OFF" ]; then
66-
docker/docker_test.sh cpu-shared-ml-release
66+
docker/docker_test.sh cpu-shared-ml-release lib
67+
fi
68+
- name: Docker test (Python)
69+
run: |
70+
if [ "${{ matrix.BUILD_SHARED_LIBS }}" = "OFF" ] && [ "${{ env.MLOPS }}" = "OFF" ] && [ "${{ env.DEVELOPER_BUILD }}" = "ON" ]; then
71+
docker/docker_test.sh cpu-static python
72+
elif [ "${{ matrix.BUILD_SHARED_LIBS }}" = "OFF" ] && [ "${{ env.MLOPS }}" = "OFF" ] && [ "${{ env.DEVELOPER_BUILD }}" = "OFF" ]; then
73+
docker/docker_test.sh cpu-static-release python
74+
elif [ "${{ matrix.BUILD_SHARED_LIBS }}" = "ON" ] && [ "${{ env.MLOPS }}" = "ON" ] && [ "${{ env.DEVELOPER_BUILD }}" = "ON" ]; then
75+
docker/docker_test.sh cpu-shared-ml python
76+
elif [ "${{ matrix.BUILD_SHARED_LIBS }}" = "ON" ] && [ "${{ env.MLOPS }}" = "ON" ] && [ "${{ env.DEVELOPER_BUILD }}" = "OFF" ]; then
77+
docker/docker_test.sh cpu-shared-ml-release python
6778
fi
6879
- name: Generate package attestation
6980
if: ${{ github.ref == 'refs/heads/main' && matrix.BUILD_SHARED_LIBS == 'ON' }}
@@ -149,7 +160,9 @@ jobs:
149160
name: open3d-wheel-linux-x86_64
150161

151162
- name: Checkout Open3D-ML
152-
run: git clone --depth 1 https://github.com/isl-org/Open3D-ML.git -b main /tmp/Open3D-ML
163+
# TODO(ss/sycl-mlops): switch back to main once the torch 2.13
164+
# requirements-torch.txt bump on ss/xpu is merged upstream.
165+
run: git clone --depth 1 https://github.com/isl-org/Open3D-ML.git -b ss/xpu /tmp/Open3D-ML
153166

154167
- name: Install doc dependencies
155168
run: |

0 commit comments

Comments
 (0)