devbuild #1573
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: devbuild | |
| on: | |
| push: | |
| pull_request: | |
| types: [opened, reopened, synchronize, labeled, unlabeled] | |
| schedule: | |
| - cron: '34 17 * * *' | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| check_skip: | |
| uses: ./.github/workflows/check_skip_ci.yml | |
| permissions: | |
| contents: read | |
| pull-requests: read | |
| issues: read | |
| standalone_buffer: | |
| needs: [check_skip] | |
| if: | | |
| needs.check_skip.outputs.skip != 'true' && ( | |
| github.event_name == 'pull_request' || | |
| (github.event_name == 'push' && | |
| (vars.MMGH_PUSH_RUN_BRANCH == '*' || | |
| contains(vars.MMGH_PUSH_RUN_BRANCH, github.ref_name))) || | |
| (github.event_name == 'schedule' && vars.MMGH_NIGHTLY == 'enable')) | |
| name: standalone_buffer_${{ matrix.os }} | |
| runs-on: ${{ matrix.os }} | |
| timeout-minutes: ${{ fromJSON(vars.MMGH_TIMEOUT_STANDALONE_BUFFER || '10') }} | |
| strategy: | |
| matrix: | |
| os: [ubuntu-24.04] | |
| cmake_build_type: [Release] | |
| fail-fast: false | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| - name: event name | |
| run: | | |
| echo "github.event_name: ${{ github.event_name }}" | |
| - name: setup dependencies | |
| uses: ./.github/actions/setup_linux | |
| with: | |
| workflow: 'standalone_buffer' | |
| - name: ccache | |
| uses: hendrikmuhs/ccache-action@v1.2.23 | |
| with: | |
| key: ${{ runner.os }}-standalone-buffer-${{ matrix.cmake_build_type }} | |
| restore-keys: ${{ runner.os }}-standalone-buffer-${{ matrix.cmake_build_type }} | |
| create-symlink: true | |
| - name: make standalone_buffer | |
| run: | | |
| echo "::group::make standalone_buffer" | |
| make standalone_buffer_setup | |
| make standalone_buffer | |
| echo "::endgroup::" | |
| build: | |
| needs: [check_skip] | |
| if: | | |
| needs.check_skip.outputs.skip != 'true' && ( | |
| github.event_name == 'pull_request' || | |
| (github.event_name == 'push' && | |
| (vars.MMGH_PUSH_RUN_BRANCH == '*' || | |
| contains(vars.MMGH_PUSH_RUN_BRANCH, github.ref_name))) || | |
| (github.event_name == 'schedule' && | |
| vars.MMGH_NIGHTLY == 'enable')) | |
| name: build_${{ matrix.os }}_${{ matrix.cmake_build_type }} | |
| runs-on: ${{ matrix.os }} | |
| timeout-minutes: ${{ fromJSON(vars.MMGH_TIMEOUT_BUILD || '45') }} | |
| env: | |
| QT_DEBUG_PLUGINS: 1 | |
| QT_QPA_PLATFORM: offscreen # for Ubuntu runner | |
| PIP_BREAK_SYSTEM_PACKAGES: 1 # disabling PEP668 (for MacOS runner) | |
| # Fix issue: https://github.com/solvcon/modmesh/issues/366 | |
| # Use custom config for jurplel/install-qt-action@v4 | |
| AQT_CONFIG: "thirdparty/aqt_settings.ini" | |
| strategy: | |
| matrix: | |
| os: [ubuntu-24.04, macos-26] | |
| cmake_build_type: [Release] | |
| fail-fast: false | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| - name: event name | |
| run: | | |
| echo "github.event_name: ${{ github.event_name }}" | |
| - name: setup dependencies for Linux | |
| if: runner.os == 'Linux' | |
| uses: ./.github/actions/setup_linux | |
| with: | |
| workflow: 'build' | |
| - name: setup dependencies for macOS | |
| if: runner.os == 'macOS' | |
| uses: ./.github/actions/setup_macos | |
| with: | |
| workflow: 'build' | |
| - name: ccache | |
| uses: hendrikmuhs/ccache-action@v1.2.23 | |
| with: | |
| key: ${{ runner.os }}-${{ matrix.cmake_build_type }} | |
| restore-keys: ${{ runner.os }}-${{ matrix.cmake_build_type }} | |
| create-symlink: true | |
| - name: make gtest BUILD_QT=OFF | |
| run: | | |
| echo "::group::make gtest BUILD_QT=OFF" | |
| make gtest \ | |
| VERBOSE=1 USE_CLANG_TIDY=OFF \ | |
| BUILD_QT=OFF | |
| echo "::endgroup::" | |
| - name: make buildext BUILD_QT=OFF | |
| run: | | |
| echo "::group::make buildext BUILD_QT=OFF" | |
| rm -f build/*/Makefile | |
| make cmake \ | |
| VERBOSE=1 USE_CLANG_TIDY=OFF \ | |
| BUILD_QT=OFF \ | |
| CMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }} \ | |
| CMAKE_ARGS="-DPYTHON_EXECUTABLE=$(which python3)" | |
| make buildext VERBOSE=1 | |
| echo "::endgroup::" | |
| - name: make pytest BUILD_QT=OFF | |
| run: | | |
| echo "::group::make pytest BUILD_QT=OFF" | |
| python3 -c "import modmesh; assert modmesh.HAS_PILOT == False" | |
| JOB_MAKE_ARGS="${JOB_MAKE_ARGS} VERBOSE=1" | |
| if [ "${{ matrix.os }}" == "macos-26" ] ; then \ | |
| JOB_MAKE_ARGS="${JOB_MAKE_ARGS} BUILD_METAL=ON" ; \ | |
| fi | |
| make pytest ${JOB_MAKE_ARGS} | |
| echo "::endgroup::" | |
| - name: make buildext BUILD_QT=ON | |
| run: | | |
| echo "::group::make buildext BUILD_QT=ON" | |
| rm -f build/*/Makefile | |
| make cmake \ | |
| VERBOSE=1 USE_CLANG_TIDY=OFF \ | |
| BUILD_QT=ON \ | |
| CMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }} \ | |
| CMAKE_ARGS="-DPYTHON_EXECUTABLE=$(which python3)" | |
| make buildext VERBOSE=1 | |
| echo "::endgroup::" | |
| - name: make pytest BUILD_QT=ON | |
| run: | | |
| echo "::group::make pytest BUILD_QT=ON" | |
| python3 -c "import modmesh; assert modmesh.HAS_PILOT == True" | |
| JOB_MAKE_ARGS="${JOB_MAKE_ARGS} VERBOSE=1" | |
| if [ "${{ matrix.os }}" == "macos-26" ] ; then \ | |
| # PySide6 installed by pip will bundle with a prebuilt Qt, | |
| # this will cause duplicated symbol. | |
| # Solve this issue by removed PySide6 prebuilt Qt library | |
| PYSIDE6_PATH=$(python3 -c "import sys, os, PySide6; sys.stdout.write(os.path.dirname(PySide6.__file__))") | |
| echo "pyside6 path: ${PYSIDE6_PATH}" | |
| rm -rf ${PYSIDE6_PATH}/Qt/lib/*.framework | |
| # maunally add homebrew's Qt rpath to PySide6 | |
| install_name_tool -add_rpath $(qtpaths --install-prefix)/lib ${PYSIDE6_PATH}/QtWidgets.abi3.so | |
| install_name_tool -add_rpath $(qtpaths --install-prefix)/lib ${PYSIDE6_PATH}/QtGui.abi3.so | |
| install_name_tool -add_rpath $(qtpaths --install-prefix)/lib ${PYSIDE6_PATH}/QtCore.abi3.so | |
| JOB_MAKE_ARGS="${JOB_MAKE_ARGS} BUILD_METAL=ON" ; \ | |
| fi | |
| make pytest ${JOB_MAKE_ARGS} | |
| echo "::endgroup::" | |
| - name: make pilot | |
| run: | | |
| echo "::group::make pilot" | |
| rm -f build/*/Makefile | |
| make pilot \ | |
| VERBOSE=1 USE_CLANG_TIDY=OFF \ | |
| BUILD_QT=ON \ | |
| CMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }} \ | |
| CMAKE_ARGS="-DPYTHON_EXECUTABLE=$(which python3)" | |
| echo "::endgroup::" | |
| - name: make run_pilot_pytest | |
| run: | | |
| echo "::group::make run_pilot_pytest" | |
| export LD_LIBRARY_PATH=$(python3 -c "import sys, os, shiboken6; sys.stdout.write(os.path.dirname(shiboken6.__file__))") | |
| make run_pilot_pytest VERBOSE=1 | |
| echo "::endgroup::" | |
| # FIXME: turn off until all issues resolved | |
| - name: make cmake USE_SANITIZER=ON & make pytest | |
| run: | | |
| echo "::group::make cmake USE_SANITIZER=ON & make pytest" | |
| export ASAN_OPTIONS=verify_asan_link_order=0 | |
| rm -f build/*/Makefile | |
| make cmake \ | |
| VERBOSE=1 USE_CLANG_TIDY=OFF \ | |
| BUILD_QT=OFF \ | |
| CMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }} \ | |
| CMAKE_ARGS="-DPYTHON_EXECUTABLE=$(which python3) -DUSE_SANITIZER=OFF" | |
| make buildext VERBOSE=1 | |
| make pytest VERBOSE=1 | |
| echo "::endgroup::" | |
| build_windows: | |
| needs: [check_skip] | |
| if: | | |
| needs.check_skip.outputs.skip != 'true' && ( | |
| github.event_name == 'pull_request' || | |
| (github.event_name == 'push' && | |
| (vars.MMGH_PUSH_RUN_BRANCH == '*' || | |
| contains(vars.MMGH_PUSH_RUN_BRANCH, github.ref_name))) || | |
| (github.event_name == 'schedule' && | |
| vars.MMGH_NIGHTLY == 'enable')) | |
| name: build_${{ matrix.os }}_${{ matrix.cmake_build_type }} | |
| runs-on: ${{ matrix.os }} | |
| timeout-minutes: ${{ fromJSON(vars.MMGH_TIMEOUT_BUILD || '45') }} | |
| env: | |
| QT_DEBUG_PLUGINS: 1 | |
| # Fix issue: https://github.com/solvcon/modmesh/issues/366 | |
| # Use custom config for jurplel/install-qt-action@v4 | |
| AQT_CONFIG: "thirdparty/aqt_settings.ini" | |
| strategy: | |
| matrix: | |
| os: [windows-2022] | |
| # Build Debug because there is not a job for windows in lint.yml (which uses the Debug build type) | |
| cmake_build_type: [Release, Debug] | |
| fail-fast: false | |
| steps: | |
| - uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 1 | |
| - name: event name | |
| run: | | |
| echo "github.event_name: ${{ github.event_name }}" | |
| - uses: TheMrMilchmann/setup-msvc-dev@v4 | |
| with: | |
| arch: 'x64' | |
| # CMake version in windows-2022 runner-image is 3.31.6, so we install CMake>=4.0.1 from github marketplace. | |
| # Reference: https://github.com/actions/runner-images/blob/main/images/windows/Windows2022-Readme.md | |
| - name: install CMake>4.0.1 | |
| uses: lukka/get-cmake@latest | |
| - name: install qt | |
| uses: jurplel/install-qt-action@v4 | |
| with: | |
| version: '6.8.1' | |
| host: 'windows' | |
| target: 'desktop' | |
| arch: 'win64_msvc2022_64' | |
| modules: 'qt3d' | |
| cache: true | |
| - uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.12' | |
| - name: install BLAS and LAPACK | |
| run: | | |
| echo "::group::install BLAS and LAPACK" | |
| vcpkg install openblas:x64-windows lapack:x64-windows | |
| $vcpkg_bin_path = @( | |
| "C:\vcpkg\installed\x64-windows\bin", | |
| "C:\vcpkg\installed\x64-windows\debug\bin" | |
| ) -join ";" | |
| echo "$vcpkg_bin_path" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append | |
| echo "::endgroup::" | |
| - name: dependency by pip | |
| run: | | |
| echo "::group::dependency by pip" | |
| pip3 install -U numpy matplotlib pytest jsonschema flake8 pybind11 pyside6==$(qmake -query QT_VERSION) | |
| # Add PySide6 and Shiboken6 path into system path, that allow exe file can find | |
| # dll during runtime | |
| # If user needs to modified system path in github actions container | |
| # user should use GITHUB_PATH | |
| # ref: https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#adding-a-system-path | |
| # But the way of update GITHUB_PATH in github action document does not work, there is a other way to update it. | |
| # ref: https://stackoverflow.com/questions/60169752/how-to-update-the-path-in-a-github-action-workflow-file-for-a-windows-latest-hos | |
| $pyside6_path = $(python3 -c "import sys, os, PySide6; sys.stdout.write(os.path.dirname(PySide6.__file__))") | |
| $shiboken6_path = $(python3 -c "import sys, os, shiboken6; sys.stdout.write(os.path.dirname(shiboken6.__file__))") | |
| echo "$pyside6_path;$shiboken6_path" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append | |
| echo "::endgroup::" | |
| - name: show dependency | |
| run: | | |
| echo "::group::show dependency" | |
| Get-Command cl | |
| Get-Command cmake | |
| Get-Command python3 | |
| Get-Command pip3 | |
| python3 -c 'import numpy as np; print("np.__version__:", np.__version__, np.get_include())' | |
| python3 -c "import pybind11 ; print('pybind11.__version__:', pybind11.__version__)" | |
| pybind11-config --cmakedir | |
| Get-Command pytest | |
| Get-Command clang-tidy | |
| Get-Command flake8 | |
| echo "::endgroup::" | |
| - name: cmake ALL_BUILD | |
| run: | | |
| echo "::group::cmake ALL_BUILD" | |
| cmake ` | |
| -DCMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }} ` | |
| -DCMAKE_TOOLCHAIN_FILE="$env:VCPKG_INSTALLATION_ROOT/scripts/buildsystems/vcpkg.cmake" ` | |
| -DVCPKG_TARGET_TRIPLET="x64-windows" ` | |
| -Dpybind11_DIR="$(pybind11-config --cmakedir)" ` | |
| -S${{ github.workspace }} ` | |
| -B${{ github.workspace }}/build | |
| cmake --build ${{ github.workspace }}/build ` | |
| --config ${{ matrix.cmake_build_type }} ` | |
| --target ALL_BUILD | |
| echo "::endgroup::" | |
| - name: cmake run_gtest | |
| run: | | |
| echo "::group::cmake run_gtest" | |
| cmake --build ${{ github.workspace }}/build ` | |
| --config ${{ matrix.cmake_build_type }} ` | |
| --target run_gtest | |
| echo "::endgroup::" | |
| - name: cmake run_pilot_pytest | |
| run: | | |
| echo "::group::cmake run_pilot_pytest" | |
| cmake --build ${{ github.workspace }}/build ` | |
| --config ${{ matrix.cmake_build_type }} ` | |
| --target run_pilot_pytest | |
| echo "::endgroup::" | |
| - name: generate portable | |
| if: ${{ matrix.cmake_build_type == 'Release' }} | |
| run: | | |
| echo "::group::generate portable" | |
| # Get the Python version installed and extract the major+minor version components | |
| $py_ver=$(python3 -V | awk '{print $2}') | |
| $py_main_ver=$(echo $py_ver | awk -F. '{print $1$2}') | |
| $destination=".\modmesh-pilot-win64\modmesh-pilot-win64" | |
| $py_exec="$destination\python.exe" | |
| # Create the destination directory | |
| New-Item -ItemType Directory -Path $destination | |
| # Download and extract the Python embeddable package | |
| $pyembed_url="https://www.python.org/ftp/python/$py_ver/python-$py_ver-embed-amd64.zip" | |
| $pyembed_dl="python-$py_ver-embed-amd64.zip" | |
| Invoke-WebRequest -Uri $pyembed_url -OutFile $pyembed_dl | |
| Expand-Archive -Path $pyembed_dl -DestinationPath $destination | |
| # Patch the .pth file to enable 'site' package (required for using pip) | |
| $pth_file="$destination\python$py_main_ver._pth" | |
| (Get-Content $pth_file) -replace '#import site', 'import site' | Set-Content $pth_file | |
| # Download and setup pip installation script | |
| $get_pip_url="https://bootstrap.pypa.io/get-pip.py" | |
| $get_pip_script="$destination\get-pip.py" | |
| Invoke-WebRequest -Uri $get_pip_url -OutFile $get_pip_script | |
| & $py_exec $get_pip_script | |
| # Install necessary packages for the pilot | |
| $qt_ver=$(qmake -query QT_VERSION) | |
| & $py_exec -m pip install numpy matplotlib PySide6==$qt_ver shiboken6-generator==$qt_ver | |
| # Copy pyside6 and shiboken6 DLLs alongside the pilot executable | |
| $pyside6_path=$(& $py_exec -c "import sys, os, PySide6; sys.stdout.write(os.path.dirname(PySide6.__file__))") | |
| $shiboken6_path=$(& $py_exec -c "import sys, os, shiboken6; sys.stdout.write(os.path.dirname(shiboken6.__file__))") | |
| copy "$pyside6_path\pyside6.abi3.dll" $destination | |
| copy "$shiboken6_path\shiboken6.abi3.dll" $destination | |
| # Remove redundant Qt DLLs from PySide6 | |
| Remove-Item -Path $pyside6_path\Qt*.dll | |
| # Configure and build the pilot | |
| cmake -Dpybind11_DIR="$(pybind11-config --cmakedir)" -S . -B build | |
| cmake --build build --config Release --target pilot | |
| # Deploy the Qt environment for the pilot executable and copy necessary files | |
| Copy-Item -Path ".\build\cpp\binary\pilot\Release\pilot.exe" -Destination $destination | |
| windeployqt --release "$destination\pilot.exe" | |
| Copy-Item -Path ".\modmesh" -Destination $destination -Recurse | |
| # Also include potential thirdparty | |
| Copy-Item -Path ".\thirdparty" -Destination $destination -Recurse | |
| echo "::endgroup::" | |
| - name: archive portable artifacts | |
| if: ${{ matrix.cmake_build_type == 'Release' }} | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: modmesh-pilot-win64 | |
| path: modmesh-pilot-win64/ | |
| send_email_on_failure: | |
| needs: [standalone_buffer, build, build_windows] | |
| # Run if any of the dependencies failed in master branch | |
| if: ${{ always() && contains(needs.*.result, 'failure') && github.ref_name == 'master' && github.event.repository.fork == false }} | |
| uses: ./.github/workflows/send_email_on_fail.yml | |
| with: | |
| job_results: | | |
| - standalone_buffer: ${{ needs.standalone_buffer.result }} | |
| - build: ${{ needs.build.result }} | |
| secrets: | |
| EMAIL_USERNAME: ${{ secrets.EMAIL_USERNAME }} | |
| EMAIL_PASSWORD: ${{ secrets.EMAIL_PASSWORD }} |