Repository navigation
[Doc](ai) Add example scenes and full user doc readme for MeshRefinement usage #432
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
| name: CI | |
| on: | |
| push: | |
| branches: | |
| - main | |
| - master | |
| tags: | |
| - 'v*' #release tags in format of e.g: 'v25.12.00' | |
| pull_request: | |
| types: [opened, synchronize, reopened, labeled] | |
| workflow_dispatch: | |
| inputs: | |
| full_build: | |
| description: "Run full build (including macOS)" | |
| required: false | |
| default: false | |
| type: boolean | |
| env: | |
| REGRESSION_REPO: sofa-framework/Regression | |
| REGRESSION_BRANCH: master | |
| jobs: | |
| prepare: | |
| runs-on: ubuntu-latest | |
| outputs: | |
| os_list: ${{ steps.set.outputs.os_list }} | |
| steps: | |
| - id: set | |
| run: | | |
| if [[ "${{ github.event_name }}" == "pull_request" ]] || | |
| [[ "${{ github.event_name }}" == "push" && "${{ github.ref }}" != refs/tags/v* ]] || | |
| [[ "${{ github.event_name }}" == "workflow_dispatch" && "${{ inputs.full_build }}" != "true" ]]; then | |
| echo 'os_list=["ubuntu-22.04","windows-2022"]' >> $GITHUB_OUTPUT | |
| else | |
| echo 'os_list=["ubuntu-22.04","windows-2022","macos-14"]' >> $GITHUB_OUTPUT | |
| fi | |
| - name: Debug | |
| run: echo '${{ steps.set.outputs.os_list }}' | |
| build-and-test: | |
| needs: prepare | |
| name: Run on ${{ matrix.os }} with SOFA ${{ matrix.sofa_branch }} / MeshRefinement=${{ matrix.with_mesh_refinement }} | |
| if: > | |
| github.event_name == 'push' || github.event_name == 'workflow_dispatch' || startsWith(github.ref, 'refs/tags/v') || | |
| ( | |
| github.event_name == 'pull_request' && | |
| ( | |
| contains(github.event.pull_request.labels.*.name, 'pr: run ci') && | |
| ( | |
| github.event.action != 'labeled' || | |
| github.event.label.name == 'pr: run ci' | |
| ) | |
| ) | |
| ) | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: ${{ fromJSON(needs.prepare.outputs.os_list) }} | |
| sofa_branch: [master] | |
| with_mesh_refinement: [ON, OFF] | |
| steps: | |
| ####################### Setup SOFA ####################### | |
| - name: Setup SOFA and environment | |
| id: sofa | |
| uses: sofa-framework/sofa-setup-action@v5 | |
| with: | |
| sofa_root: ${{ github.workspace }}/sofa | |
| sofa_version: ${{ matrix.sofa_branch }} | |
| sofa_scope: 'full' | |
| ############## Checkout MeshRefinement only if enabled ############## | |
| - name: Checkout MeshRefinement source code | |
| if: matrix.with_mesh_refinement == 'ON' | |
| uses: actions/checkout@v4 | |
| with: | |
| path: deps/MeshRefinement | |
| repository: InfinyTech3D/MeshRefinement | |
| token: ${{ secrets.MESH_REFINEMENT_DEPLOY_KEY }} | |
| ############### Build and install MeshRefinement only if enabled ############## | |
| - name: Build and install MeshRefinement | |
| if: matrix.with_mesh_refinement == 'ON' | |
| shell: bash | |
| run: | | |
| mkdir -p deps/MeshRefinement/build | |
| if [[ "$RUNNER_OS" == "Windows" ]]; then | |
| cmd //c "${{ steps.sofa.outputs.vs_vsdevcmd }} \ | |
| && cd /d %GITHUB_WORKSPACE%/deps/MeshRefinement/build \ | |
| && cmake -GNinja \ | |
| -DCMAKE_PREFIX_PATH=$SOFA_ROOT/lib/cmake \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DCMAKE_INSTALL_PREFIX=%GITHUB_WORKSPACE%/deps/MeshRefinement/install \ | |
| .. \ | |
| && ninja install" | |
| # Temp hack | |
| cp deps/MeshRefinement/install/bin/MeshRefinement.dll "$WORKSPACE_BUILD_PATH/" | |
| else | |
| cd deps/MeshRefinement/build | |
| cmake \ | |
| -GNinja \ | |
| -DCMAKE_PREFIX_PATH="$SOFA_ROOT/lib/cmake" \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DCMAKE_INSTALL_PREFIX="$GITHUB_WORKSPACE/deps/MeshRefinement/install" \ | |
| -DCMAKE_LIBRARY_OUTPUT_DIRECTORY="$WORKSPACE_BUILD_PATH/lib" \ | |
| .. | |
| ninja install | |
| fi | |
| ################# Checkout current repository ############## | |
| - name: Checkout current source code | |
| uses: actions/checkout@v4 | |
| with: | |
| path: ${{ env.WORKSPACE_SRC_PATH }} | |
| ################ Build and install current plugin ############## | |
| - name: Build and install | |
| shell: bash | |
| run: | | |
| if [[ "$RUNNER_OS" == "Windows" ]]; then | |
| cmd //c "${{ steps.sofa.outputs.vs_vsdevcmd }} \ | |
| && cd /d %GITHUB_WORKSPACE%/build \ | |
| && cmake -GNinja \ | |
| -DCMAKE_PREFIX_PATH=%SOFA_ROOT%/lib/cmake;%GITHUB_WORKSPACE%/deps/MeshRefinement/install \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DCMAKE_INSTALL_PREFIX=%GITHUB_WORKSPACE%/install \ | |
| -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=%WORKSPACE_BUILD_PATH% \ | |
| ../src \ | |
| && ninja install" | |
| else | |
| cd "$WORKSPACE_BUILD_PATH" | |
| ccache -z | |
| cmake \ | |
| -GNinja \ | |
| -DCMAKE_C_COMPILER_LAUNCHER=ccache \ | |
| -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ | |
| -DCMAKE_PREFIX_PATH="$SOFA_ROOT/lib/cmake;$GITHUB_WORKSPACE/deps/MeshRefinement/install" \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DCMAKE_INSTALL_PREFIX="$WORKSPACE_INSTALL_PATH" \ | |
| -DCMAKE_LIBRARY_OUTPUT_DIRECTORY="$WORKSPACE_BUILD_PATH/lib" \ | |
| ../src | |
| ninja install | |
| ccache -s | |
| fi | |
| - name: Deploy plugins into SOFA install tree | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| mkdir -p "$SOFA_ROOT/plugins" | |
| cp -r "$WORKSPACE_INSTALL_PATH" "$SOFA_ROOT/plugins/InfinyToolkit" | |
| if [[ "${{ matrix.with_mesh_refinement }}" == "ON" ]]; then | |
| cp -r "$GITHUB_WORKSPACE/deps/MeshRefinement/install" "$SOFA_ROOT/plugins/MeshRefinement" | |
| if [[ "$RUNNER_OS" == "Windows" ]]; then | |
| # Windows resolves dependent DLLs from the loading module's own | |
| # directory, not from sibling plugin directories. | |
| cp "$SOFA_ROOT/plugins/MeshRefinement/bin/"*.dll \ | |
| "$SOFA_ROOT/plugins/InfinyToolkit/bin/" 2>/dev/null || true | |
| else | |
| # Linux/macOS resolve via RPATH / LD_LIBRARY_PATH instead. | |
| echo "LD_LIBRARY_PATH=$SOFA_ROOT/plugins/MeshRefinement/lib:${LD_LIBRARY_PATH:-}" >> $GITHUB_ENV | |
| fi | |
| fi | |
| - name: Configure runtime library path | |
| if: runner.os == 'Linux' | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| LP="$SOFA_ROOT/lib" | |
| [[ -d "$LP" ]] || { echo "::error::$LP not found"; exit 1; } | |
| echo "libSofa.Component.Controller: $(ls "$LP"/libSofa.Component.Controller.so* 2>/dev/null || echo MISSING)" | |
| echo "LD_LIBRARY_PATH=$LP:${LD_LIBRARY_PATH:-}" >> $GITHUB_ENV | |
| ####################### Setup Python ####################### | |
| - name: Setup Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.10' | |
| - name: Install dependencies | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| python -m pip install --upgrade pip | |
| python -m pip install numpy tqdm | |
| - name: Configure python environment | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| SP3="$SOFA_ROOT/plugins/SofaPython3" | |
| SP="$SP3/lib/python3/site-packages" | |
| [[ -d "$SP/Sofa" ]] || { echo "::error::Sofa package not found in $SP"; exit 1; } | |
| if [[ "$RUNNER_OS" == "Windows" ]]; then | |
| echo "PYTHONPATH=$(cygpath -w "$SP")" >> $GITHUB_ENV | |
| echo "SOFAPYTHON3_ROOT=$(cygpath -w "$SP3")" >> $GITHUB_ENV | |
| else | |
| echo "PYTHONPATH=$SP" >> $GITHUB_ENV | |
| echo "SOFAPYTHON3_ROOT=$SP3" >> $GITHUB_ENV | |
| fi | |
| ################### Regression tests ################### | |
| - name: Fetch SofaRegressionProgram | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| cd "$GITHUB_WORKSPACE" | |
| curl -fSL "https://github.com/${REGRESSION_REPO}/archive/refs/heads/${REGRESSION_BRANCH}.zip" -o regression.zip | |
| python -c "import zipfile;zipfile.ZipFile('regression.zip').extractall('.')" | |
| rm -rf Regression && mv Regression-* Regression | |
| SCRIPT=$(find "$GITHUB_WORKSPACE/Regression" -name 'SofaRegressionProgram.py' | head -n1) | |
| [[ -f "$SCRIPT" ]] || { echo "::error::SofaRegressionProgram.py not found"; exit 1; } | |
| echo "resolved: $SCRIPT" | |
| echo "REGRESSION_SCRIPT=$SCRIPT" >> $GITHUB_ENV | |
| - name: Run regression | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| cd "$WORKSPACE_SRC_PATH" | |
| python "$REGRESSION_SCRIPT" --input ./examples | |
| ################### Artifact naming ############## | |
| - name: Sanitize artifact name | |
| id: sanitize | |
| # This step removes special characters from the artifact name to ensure compatibility with upload-artifact | |
| # Characters removed: " : < > | * ? \r \n \ / | |
| # Spaces are replaced with underscores | |
| # This sanitization prevents errors in artifact creation and retrieval | |
| shell: pwsh | |
| run: | | |
| if ("${{ matrix.with_mesh_refinement }}" -eq "ON") { | |
| $dependency = "with_meshrefinement" | |
| } | |
| else { | |
| $dependency = "standalone" | |
| } | |
| $originalName = "InfinyToolkit_${dependency}_${{ steps.sofa.outputs.run_branch }}_for-SOFA-${{ steps.sofa.outputs.sofa_version }}_${{ runner.os }}" | |
| $artifact_name = $originalName -replace '[":;<>|*?\r\n\\/]', '' -replace ' ', '_' | |
| echo "artifact_name=$artifact_name" >> $env:GITHUB_OUTPUT | |
| ################### Create and upload artifact ############## | |
| - name: Create artifact | |
| id: create-artifact | |
| uses: actions/upload-artifact@v4.4.0 | |
| with: | |
| name: ${{ steps.sanitize.outputs.artifact_name }} | |
| path: ${{ env.WORKSPACE_INSTALL_PATH }} | |
| - name: Install artifact | |
| uses: actions/download-artifact@v4.1.7 | |
| with: | |
| name: ${{ steps.sanitize.outputs.artifact_name }} | |
| path: ${{ env.WORKSPACE_ARTIFACT_PATH }} | |
| ################### Create plugin artifacts ############## | |
| deploy: | |
| name: Deploy artifacts | |
| if: always() && startsWith(github.ref, 'refs/tags/v') | |
| needs: [build-and-test] | |
| runs-on: ubuntu-latest | |
| continue-on-error: true | |
| steps: | |
| - name: Get artifacts | |
| uses: actions/download-artifact@v4.1.7 | |
| with: | |
| path: artifacts | |
| - name: Zip artifacts | |
| shell: bash | |
| run: | | |
| cd $GITHUB_WORKSPACE/artifacts | |
| for artifact in *; do | |
| zip $artifact.zip -r $artifact/* | |
| done | |
| - name: Upload release | |
| uses: softprops/action-gh-release@v1 | |
| with: | |
| name: ${{ github.ref_name }} | |
| tag_name: release-${{ github.ref_name }} | |
| fail_on_unmatched_files: false | |
| target_commitish: ${{ github.sha }} | |
| files: | | |
| artifacts/InfinyToolkit_*_Linux.zip | |
| artifacts/InfinyToolkit_*_Windows.zip | |
| artifacts/InfinyToolkit_*_macOS.zip |