# SPDX-License-Identifier: LGPL-2.1-or-later # *************************************************************************** # * * # * Copyright (c) 2024 0penBrain, Lorenz Lechner and Jacob Oursland. * # * * # * This file is part of FreeCAD. * # * * # * FreeCAD is free software: you can redistribute it and/or modify it * # * under the terms of the GNU Lesser General Public License as * # * published by the Free Software Foundation, either version 2.1 of the * # * License, or (at your option) any later version. * # * * # * FreeCAD is distributed in the hope that it will be useful, but * # * WITHOUT ANY WARRANTY; without even the implied warranty of * # * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * # * Lesser General Public License for more details. * # * * # * You should have received a copy of the GNU Lesser General Public * # * License along with FreeCAD. If not, see * # * . * # * * # *************************************************************************** # This is a build and test workflow for CI of FreeCAD. # This workflow aims at building and testing FreeCAD on a Conda environment on macOS. name: Pixi Builds on: workflow_call: inputs: artifactBasename: type: string required: true testOnBuildDir: default: false type: boolean required: false allowedToFail: default: false type: boolean required: false outputs: reportFile: value: ${{ jobs.Build.outputs.reportFile }} jobs: build_with_pixi: runs-on: ${{ matrix.os }} continue-on-error: ${{ inputs.allowedToFail }} env: CCACHE_COMPRESS: true CCACHE_COMPRESSLEVEL: 5 CCACHE_CONFIGPATH: ${{ github.workspace }}/ccache/config CCACHE_DIR: ${{ github.workspace }}/ccache CCACHE_MAXSIZE: 1G CCACHE_NODIRECT: true CCACHE_NOHASHDIR: true CCACHE_NOINODECACHE: true CCACHE_SLOPPINESS: "include_file_ctime,include_file_mtime,pch_defines,time_macros" builddir: ${{ github.workspace }}/build/release/ cacheKey: pixi-${{ matrix.os }} config: release logdir: ${{ github.workspace }}/logs/ reportdir: ${{ github.workspace }}/report/ reportfilename: ${{ inputs.artifactBasename }}-${{ matrix.os }}-report.md outputs: reportFile: ${{ steps.Init.outputs.reportFile }} strategy: max-parallel: 6 fail-fast: false matrix: os: [windows-latest, ubuntu-latest, macos-latest] steps: - name: Harden the runner (Audit all outbound calls) uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - name: Set Platform Environment Variables shell: bash -l {0} env: OPERATING_SYSTEM: ${{ runner.os }} run: | if [[ $OPERATING_SYSTEM == 'Windows' ]]; then echo 'CCACHE_COMPILERCHECK=%compiler%' >> "$GITHUB_ENV" else echo 'CCACHE_COMPILERCHECK=%compiler% -dumpfullversion -dumpversion' >> "$GITHUB_ENV" fi - name: Checkout uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Add GCC Problem Matcher if: runner.os == 'Linux' run: | echo "::add-matcher::${{ runner.workspace }}/FreeCAD/.github/problemMatcher/gcc.json" - name: Add Clang Problem Matcher if: runner.os == 'macOS' run: | echo "::add-matcher::${{ runner.workspace }}/FreeCAD/.github/problemMatcher/clang.json" - name: Add MSVC++ Problem Matcher if: runner.os == 'Windows' run: | echo "::add-matcher::${{ runner.workspace }}/FreeCAD/.github/problemMatcher/msvc.json" - name: Make needed directories, files and initializations id: Init run: | mkdir -p ${{ env.builddir }} mkdir -p ${{ env.logdir }} mkdir -p ${{ env.reportdir }} echo "reportFile=${{ env.reportfilename }}" >> $GITHUB_OUTPUT - uses: prefix-dev/setup-pixi@a0af7a228712d6121d37aba47adf55c1332c9c2e # v0.9.4 with: pixi-version: v0.59.0 cache: false - name: Restore Compiler Cache id: cache-restore if: always() uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: ${{ env.CCACHE_DIR }} key: FC-${{ env.cacheKey }}-${{ github.ref }}-${{ github.run_id }} restore-keys: | FC-${{ env.cacheKey }}-${{ github.ref }}- FC-${{ env.cacheKey }}- - name: Print CCache statistics before build, reset stats and print config run: | pixi run ccache -s pixi run ccache -z pixi run ccache -p - name: CMake Configure run: | pixi run configure-${{ env.config }} - name: CMake Build run: | pixi run build-${{ env.config }} - name: Print ccache statistics after Build if: always() run: | pixi run ccache -s - name: FreeCAD CLI tests on build dir if: inputs.testOnBuildDir timeout-minutes: 10 uses: ./.github/workflows/actions/runPythonTests with: testDescription: "CLI tests on build dir" testCommand: pixi run ${{ env.builddir }}/bin/FreeCADCmd -t 0 logFile: ${{ env.logdir }}TestCLIBuild.log reportFile: ${{env.reportdir}}${{ env.reportfilename }} - name: FreeCAD GUI tests on build dir if: runner.os == 'Linux' && inputs.testOnBuildDir timeout-minutes: 15 uses: ./.github/workflows/actions/runPythonTests with: testDescription: "GUI tests on build dir" testCommand: pixi run xvfb-run ${{ env.builddir }}/bin/FreeCAD -t 0 logFile: ${{ env.logdir }}TestGUIBuild.log reportFile: ${{env.reportdir}}${{ env.reportfilename }} - name: C++ tests timeout-minutes: 10 if: runner.os != 'Windows' uses: ./.github/workflows/actions/runCPPTests/runAllTests with: reportdir: ${{ env.reportdir }} builddir: ${{ env.builddir }} reportFile: ${{ env.reportdir }}${{ env.reportfilename }} - name: CMake Install run: | pixi run install-${{ env.config }} - name: FreeCAD CLI tests on install if: runner.os != 'Windows' timeout-minutes: 10 uses: ./.github/workflows/actions/runPythonTests with: testDescription: "CLI tests on install" testCommand: pixi run FreeCADCmd -t 0 logFile: ${{ env.logdir }}TestCLIInstall.log reportFile: ${{env.reportdir}}${{ env.reportfilename }} - name: FreeCAD GUI tests on install # if: runner.os == 'Linux' # currently broken on Qt6 builds if: false timeout-minutes: 15 uses: ./.github/workflows/actions/runPythonTests with: testDescription: "GUI tests on install" testCommand: pixi run xvfb-run FreeCAD -t 0 logFile: ${{ env.logdir }}TestGUIInstall.log reportFile: ${{env.reportdir}}${{ env.reportfilename }} - name: Save Compiler Cache id: cache-save if: always() uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: ${{ env.CCACHE_DIR }} key: FC-${{ env.cacheKey }}-${{ github.ref }}-${{ github.run_id }} - name: Upload logs if: always() uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: ${{ inputs.artifactBasename }}-${{ matrix.os }}-Logs path: | ${{ env.logdir }} /var/crash/*FreeCAD* - name: Upload report if: always() uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: ${{ env.reportfilename }} path: | ${{env.reportdir}}${{ env.reportfilename }}