Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 47 additions & 19 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,181 +5,209 @@
branches:
- main
- master

tags:
- 'v*' #release tags in format of 'v25.12.00' for example
- '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


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:

Check warning

Code scanning / CodeQL

Workflow does not contain permissions Medium

Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {}
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 == '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: [ubuntu-22.04, macos-14, windows-2022]
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 \
&& 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 }}
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 \
&& 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
echo ${CCACHE_BASEDIR}
ccache -s
fi


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


- name: Launch test
id: tests
################### Tests ##############
- name: Launch test
uses: sofa-framework/sofa-test-action@v1.0
with:
sofa_root: ${{ github.workspace }}/sofa
sofa_version: ${{ steps.sofa.outputs.sofa_version }}
src_dir: ${{ env.WORKSPACE_SRC_PATH }}
build_dir: ${{ env.WORKSPACE_BUILD_PATH }}
python_exe: ${{ steps.sofa.outputs.python_exe }}
output_dir: ${{ github.workspace }}/tests-results_dir
nb_parallel_threads: '4'



################### Create plugin artifacts ##############
deploy:

Check warning

Code scanning / CodeQL

Workflow does not contain permissions Medium

Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {contents: read}
name: Deploy artifacts
if: always() && startsWith(github.ref, 'refs/tags/')
if: 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
Expand All @@ -193,6 +221,7 @@
for artifact in *; do
zip $artifact.zip -r $artifact/*
done

- name: Upload release
uses: softprops/action-gh-release@v1
with:
Expand All @@ -204,4 +233,3 @@
artifacts/InfinyToolkit_*_Linux.zip
artifacts/InfinyToolkit_*_Windows.zip
artifacts/InfinyToolkit_*_macOS.zip

Loading