Add back all build matrices + build in release mode #354
This file contains 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: build-and-test | |
on: | |
push: | |
branches: | |
- "**" | |
pull_request: | |
branches: | |
- "**" | |
#schedule: | |
# - cron: '*/120 8-18 * * *' # every 2 hours from 8:00 to 18:00 every day | |
jobs: | |
############################################################################## | |
# JOB 1 | |
############################################################################## | |
build: # current job name | |
timeout-minutes: 30 | |
# current job matrix. if modified, remember to UPDATE the strategy in the next job | |
strategy: | |
fail-fast: false | |
matrix: | |
os: [ubuntu-24.04, windows-2022, macos-12, macos-14] # [ubuntu-22.04, windows-2022, macos-13, flyci-macos-14-m2] | |
toolchain: | |
- { exe: gfortran, compiler: gcc, version: 13 } | |
- { exe: ifort, compiler: intel-classic, version: "2021.10" } | |
- { exe: ifx, compiler: intel, version: "2023.2" } | |
exclude: | |
- os: macos-12 | |
toolchain: { exe: ifx, compiler: intel, version: "2023.2" } # no support for macOS | |
- os: macos-14 | |
toolchain: { exe: ifx, compiler: intel, version: "2023.2" } # no support for macOS on arm64 | |
- os: macos-14 | |
toolchain: { exe: ifort, compiler: intel-classic, version: "2021.10" } # no support for macOS on arm64 | |
runs-on: ${{ matrix.os }} | |
steps: # job steps | |
- name: Check-out repository | |
uses: actions/checkout@v4 | |
- name: Set up Fortran compiler (FC) [all except Windows + gfortran] # except: use pre-installed gfortran | |
if: runner.os != 'Windows' || matrix.toolchain.exe != 'gfortran' | |
uses: fortran-lang/setup-fortran@v1 | |
id: setup-fortran | |
with: | |
compiler: ${{ matrix.toolchain.compiler }} | |
version: ${{ matrix.toolchain.version }} | |
- name: Set up NMake build tool [Windows] | |
if: runner.os == 'Windows' | |
uses: ilammy/msvc-dev-cmd@v1 | |
- name: Set up Python environment | |
uses: actions/setup-python@v5 | |
with: | |
python-version: '3.11' | |
- name: Upgrade package installer for Python | |
shell: bash | |
run: pip install --upgrade pip | |
- name: Install Python dependences | |
shell: bash | |
run: pip install '.[ci,test]' # 'ci' and 'test' extras from pyproject.toml | |
- name: Fix reinstalling gcc [macOS] # needed because of `brew reinstall gcc` | |
if: runner.os == 'macOS' | |
shell: bash | |
run: echo "MACOSX_DEPLOYMENT_TARGET=$(sw_vers -productVersion)" >> $GITHUB_ENV | |
- name: Create build scripts in scripts/scripts | |
shell: bash | |
run: > | |
python3 pybuild.py | |
--create-scripts | |
--platform ${{ runner.os }} | |
--compiler ${{ matrix.toolchain.exe }} | |
--mode debug | |
--bash-syntax | |
--enable-backslash-escapes | |
- name: Print build-specific variables | |
shell: bash | |
run: scripts/print_build_variables.sh # bash -x scripts/print_build_variables.sh for printing commands | |
- name: Create CFML and pyCFML directories | |
shell: bash | |
run: | | |
scripts/create_cfml_repo_dir.sh | |
scripts/create_cfml_build_dir.sh | |
scripts/create_cfml_dist_dir.sh | |
scripts/create_pycfml_src_dir.sh | |
scripts/create_pycfml_build_dir.sh | |
scripts/create_pycfml_dist_dir.sh | |
- name: Download CFML repository | |
shell: bash | |
run: scripts/download_cfml_repo.sh | |
- name: Build CFML modules | |
shell: bash | |
run: | | |
scripts/rename_global_deps_file.sh | |
scripts/build_cfml_modules_obj.sh | |
scripts/delete_renamed_global_deps_file.sh | |
- name: Build CFML static library | |
shell: bash | |
run: scripts/build_cfml_static_lib.sh | |
- name: Make CFML distribution | |
shell: bash | |
run: scripts/move_built_to_cfml_dist.sh | |
- name: Build und run CFML functional test programs (incl. benchmarks) | |
# 1st combination: this always fails with 'Undefined symbols...' error | |
# 2nd combination: this randomly fails with test__Simple_calc_powder__SrTiO3s 'forrtl: severe (157): Program Exception - access violation' | |
if: | | |
(runner.os != 'macOS' || matrix.toolchain.exe != 'ifort') | |
&& | |
(runner.os != 'Windows' || matrix.toolchain.exe != 'ifx') | |
shell: bash | |
run: | | |
scripts/build_cfml_test_programs.sh | |
scripts/copy_cfml_test_programs_to_tests_dir.sh | |
scripts/run_cfml_functional_tests_no_benchmarks.sh | |
# # scripts/run_cfml_functional_tests_with_benchmarks.sh | |
#- name: Push benchmark results to repository | |
# uses: EndBug/add-and-commit@v9 | |
# with: | |
# add: '.benchmarks' | |
# message: 'Auto push benchmark results by GitHub Action for ${{ runner.os }} + ${{ matrix.toolchain.exe }}' | |
# pull: '--rebase --autostash' | |
#- name: Copy powder_mod from CFML to pyCFML | |
# shell: bash | |
# run: scripts/copy_powder_mod_to_pycfml_repo.sh | |
- name: Create pyCFML source code | |
shell: bash | |
run: scripts/create_pycfml_src.sh | |
- name: Build pyCFML modules | |
shell: bash | |
run: scripts/build_pycfml_modules_obj.sh | |
- name: Build pyCFML shared obj / dynamic library | |
shell: bash | |
run: | | |
#export LD_LIBRARY_PATH=/opt/homebrew/opt/python@3.11/Frameworks/Python.framework/Versions/3.11/lib/python3.11/config-3.11-darwin:$LD_LIBRARY_PATH | |
#export LD_LIBRARY_PATH=/opt/homebrew/opt/python@3.11/Frameworks/Python.framework/Versions/3.11/lib:$LD_LIBRARY_PATH | |
export LIBRARY_PATH="/opt/homebrew/opt/python@3.11/Frameworks/Python.framework/Versions/3.11/lib/python3.11/config-3.11-darwin:/opt/homebrew/opt/python@3.11/Frameworks/Python.framework/Versions/3.11/lib:/opt/homebrew/opt/python@3.11/Frameworks/Python.framework/Versions/3.11" | |
export LD_LIBRARY_PATH="/opt/homebrew/opt/python@3.11/Frameworks/Python.framework/Versions/3.11/lib/python3.11/config-3.11-darwin:/opt/homebrew/opt/python@3.11/Frameworks/Python.framework/Versions/3.11/lib:/opt/homebrew/opt/python@3.11/Frameworks/Python.framework/Versions/3.11" | |
export DYLD_LIBRARY_PATH="/opt/homebrew/opt/python@3.11/Frameworks/Python.framework/Versions/3.11/lib/python3.11/config-3.11-darwin:/opt/homebrew/opt/python@3.11/Frameworks/Python.framework/Versions/3.11/lib:/opt/homebrew/opt/python@3.11/Frameworks/Python.framework/Versions/3.11" | |
export DYLD_FALLBACK_LIBRARY_PATH="/opt/homebrew/opt/python@3.11/Frameworks/Python.framework/Versions/3.11/lib/python3.11/config-3.11-darwin:/opt/homebrew/opt/python@3.11/Frameworks/Python.framework/Versions/3.11/lib:/opt/homebrew/opt/python@3.11/Frameworks/Python.framework/Versions/3.11" | |
export DYLD_FALLBACK_FRAMEWORK_PATH="/opt/homebrew/opt/python@3.11/Frameworks/Python.framework/Versions/3.11/lib/python3.11/config-3.11-darwin:/opt/homebrew/opt/python@3.11/Frameworks/Python.framework/Versions/3.11/lib:/opt/homebrew/opt/python@3.11/Frameworks/Python.framework/Versions/3.11" | |
scripts/build_pycfml_lib_obj.sh | |
scripts/build_pycfml_shared_obj_or_dynamic_lib.sh | |
- name: Make pyCFML distribution | |
shell: bash | |
run: | | |
scripts/copy_built_to_pycfml_dist.sh | |
scripts/change_runpath_for_built_pycfml.sh | |
scripts/copy_extra_libs_to_pycfml_dist.sh | |
scripts/copy_py_api_files_to_pycfml_dist.sh | |
scripts/copy_init_file_to_pycfml_dist.sh | |
scripts/copy_cfml_databases_to_pycfml_dist.sh | |
- name: Create Python package wheel of pyCFML | |
shell: bash | |
run: | | |
scripts/validate_pyproject_toml.sh | |
scripts/create_pycfml_python_wheel.sh | |
scripts/rename_pycfml_python_wheel.sh | |
scripts/detect_abi3_violations.sh | |
scripts/check_wheel_contents.sh | |
- name: Prepare for uploading Python package wheel of pyCFML | |
shell: bash | |
run: echo "WHEEL_DIR=$(python3 pybuild.py --print-wheel-dir)" >> $GITHUB_ENV | |
- name: Upload zipped Python package wheel of pyCFML for next job | |
uses: actions/upload-artifact@v4 | |
with: # if name or path modified, remember to UPDATE those in the download step of the next job | |
name: pycfml-wheel_${{ matrix.os }}_${{ matrix.toolchain.exe }} # name (without .zip) of the zip file to be uploaded | |
path: ${{ env.WHEEL_DIR }} # all files from this directory are zipped | |
if-no-files-found: "error" | |
compression-level: 0 | |
############################################################################## | |
# JOB 2 | |
############################################################################## | |
tests: # current job name | |
needs: build # previous job 'build' need to be finished first | |
if: always() # start this job even if the previous job failed | |
timeout-minutes: 30 | |
strategy: | |
fail-fast: false | |
matrix: | |
os: [ubuntu-24.04, windows-2022, macos-12, macos-14] # [ubuntu-22.04, windows-2022, macos-13, flyci-macos-14-m2] | |
toolchain: | |
- { exe: gfortran, compiler: gcc, version: 13 } | |
- { exe: ifort, compiler: intel-classic, version: "2021.10" } | |
- { exe: ifx, compiler: intel, version: "2023.2" } | |
exclude: | |
- os: macos-12 | |
toolchain: { exe: ifx, compiler: intel, version: "2023.2" } # no support for macOS | |
- os: macos-14 | |
toolchain: { exe: ifx, compiler: intel, version: "2023.2" } # no support for macOS on arm64 | |
- os: macos-14 | |
toolchain: { exe: ifort, compiler: intel-classic, version: "2021.10" } # no support for macOS on arm64 | |
runs-on: ${{ matrix.os }} | |
steps: # job steps | |
- name: Check-out repository | |
uses: actions/checkout@v4 | |
- name: Set up python environment | |
uses: actions/setup-python@v5 | |
with: | |
python-version: '3.11' | |
- name: Upgrade package installer for Python | |
shell: bash | |
run: python3 -m pip install --upgrade pip | |
- name: Install Python dependences | |
shell: bash | |
run: pip install '.[ci,test]' # 'ci' and 'test' extras from pyproject.toml | |
- name: Create job step scripts | |
shell: bash | |
run: > | |
python3 pybuild.py | |
--create-scripts | |
--platform ${{ runner.os }} | |
--compiler ${{ matrix.toolchain.exe }} | |
--mode debug | |
--bash-syntax | |
--enable-backslash-escapes | |
- name: Prepare for downloading Python package wheel of pyCFML | |
shell: bash | |
run: echo "WHEEL_DIR=$(python3 pybuild.py --print-wheel-dir)" >> $GITHUB_ENV | |
- name: Download zipped pyCFML wheel from previous job | |
uses: actions/download-artifact@v4 | |
with: # name or path are taken from the upload step of the previous job | |
name: pycfml-wheel_${{ matrix.os }}_${{ matrix.toolchain.exe }} # name (without .zip) of the zipped artifact uploaded on the previous jobs | |
path: ${{ env.WHEEL_DIR }} # directory to extract downloaded zipped artifacts | |
- name: Install pyCFML from downloaded Python package wheel (with dev extras) | |
shell: bash | |
run: scripts/install_pycfml_from_wheel.sh | |
- name: Run pyCFML unit tests | |
shell: bash | |
run: scripts/run_pycfml_unit_tests.sh | |
- name: Run pyCFML functional tests | |
shell: bash | |
run: scripts/run_pycfml_functional_tests_no_benchmarks.sh | |
############################################################################## | |
# JOB 3 | |
############################################################################## | |
publish: # current job name | |
needs: tests # previous job 'tests' need to be finished first | |
if: always() # start this job even if the previous job failed | |
timeout-minutes: 30 | |
strategy: | |
fail-fast: false | |
matrix: | |
os: [ubuntu-24.04, windows-2022, macos-12, macos-14] # [ubuntu-22.04, windows-2022, macos-13, flyci-macos-14-m2] | |
python-version: ['3.10', '3.11', '3.12'] | |
toolchain: | |
- { exe: gfortran, compiler: gcc, version: 13 } | |
runs-on: ${{ matrix.os }} | |
steps: # job steps | |
- name: Check-out repository | |
uses: actions/checkout@v4 | |
- name: Declare env variables on push only | |
if: github.event_name == 'push' | |
shell: bash | |
run: echo "BRANCH_NAME=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV | |
- name: Declare env variables on pull_request only | |
if: github.event_name == 'pull_request' | |
shell: bash | |
run: echo "BRANCH_NAME=$GITHUB_HEAD_REF" >> $GITHUB_ENV | |
- name: Set up Fortran compiler (FC) [all except Windows + gfortran] # except: use pre-installed gfortran | |
if: runner.os != 'Windows' || matrix.toolchain.exe != 'gfortran' | |
uses: fortran-lang/setup-fortran@v1 | |
id: setup-fortran | |
with: | |
compiler: ${{ matrix.toolchain.compiler }} | |
version: ${{ matrix.toolchain.version }} | |
- name: Set up NMake build tool [Windows] | |
if: runner.os == 'Windows' | |
uses: ilammy/msvc-dev-cmd@v1 | |
- name: Set up Python environment | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ matrix.python-version }} | |
- name: Upgrade package installer for Python | |
shell: bash | |
run: pip install --upgrade pip | |
- name: Install Python dependences | |
shell: bash | |
run: pip install '.[ci,test]' # 'ci' and 'test' extras from pyproject.toml | |
- name: Fix reinstalling gcc [macOS] # needed because of `brew reinstall gcc` | |
if: runner.os == 'macOS' | |
shell: bash | |
run: echo "MACOSX_DEPLOYMENT_TARGET=$(sw_vers -productVersion)" >> $GITHUB_ENV | |
- name: Create build scripts in scripts/scripts | |
shell: bash | |
run: > | |
python3 pybuild.py | |
--create-scripts | |
--platform ${{ runner.os }} | |
--compiler ${{ matrix.toolchain.exe }} | |
--mode release | |
--bash-syntax | |
--enable-backslash-escapes | |
- name: Print some build-specific variables | |
shell: bash | |
run: scripts/print_build_variables.sh # bash -x scripts/print_build_variables.sh for printing commands | |
- name: Create scripts, CFML and pyCFML directories | |
shell: bash | |
run: | | |
scripts/create_cfml_repo_dir.sh | |
scripts/create_cfml_build_dir.sh | |
scripts/create_cfml_dist_dir.sh | |
scripts/create_pycfml_src_dir.sh | |
scripts/create_pycfml_build_dir.sh | |
scripts/create_pycfml_dist_dir.sh | |
- name: Download CFML repository | |
shell: bash | |
run: scripts/download_cfml_repo.sh | |
- name: Build CFML modules | |
shell: bash | |
run: | | |
scripts/rename_global_deps_file.sh | |
scripts/build_cfml_modules_obj.sh | |
scripts/delete_renamed_global_deps_file.sh | |
- name: Build CFML static library | |
shell: bash | |
run: scripts/build_cfml_static_lib.sh | |
- name: Make CFML distribution | |
shell: bash | |
run: scripts/move_built_to_cfml_dist.sh | |
- name: Create pyCFML source code | |
shell: bash | |
run: scripts/create_pycfml_src.sh | |
- name: Build pyCFML modules | |
shell: bash | |
run: scripts/build_pycfml_modules_obj.sh | |
- name: Build pyCFML shared obj / dynamic library | |
shell: bash | |
run: | | |
scripts/build_pycfml_lib_obj.sh | |
scripts/build_pycfml_shared_obj_or_dynamic_lib.sh | |
- name: Make pyCFML distribution | |
shell: bash | |
run: | | |
scripts/copy_built_to_pycfml_dist.sh | |
scripts/change_runpath_for_built_pycfml.sh | |
scripts/copy_extra_libs_to_pycfml_dist.sh | |
scripts/copy_py_api_files_to_pycfml_dist.sh | |
scripts/copy_init_file_to_pycfml_dist.sh | |
scripts/copy_cfml_databases_to_pycfml_dist.sh | |
- name: Create Python package wheel of pyCFML | |
shell: bash | |
run: | | |
scripts/validate_pyproject_toml.sh | |
scripts/create_pycfml_python_wheel.sh | |
scripts/rename_pycfml_python_wheel.sh | |
- name: Prepare for uploading Python package wheel of pyCFML | |
shell: bash | |
run: | | |
echo "WHEEL_DIR=$(python3 pybuild.py --print-wheel-dir)" >> $GITHUB_ENV | |
echo "RELEASE_VERSION=$(python3 pybuild.py --print-release-version)" >> $GITHUB_ENV | |
echo "RELEASE_TITLE=$(python3 pybuild.py --print-release-title)" >> $GITHUB_ENV | |
- name: Upload Python package wheel to releases (non-master branch) | |
if: github.event_name == 'push' && env.BRANCH_NAME != 'master' | |
uses: ncipollo/release-action@v1 | |
with: | |
draft: true | |
prerelease: true | |
allowUpdates: true | |
replacesArtifacts: true | |
token: ${{ secrets.GITHUB_TOKEN }} | |
artifacts: "${{ env.WHEEL_DIR }}/*.whl" | |
tag: ${{ env.BRANCH_NAME }} | |
name: ${{ env.BRANCH_NAME }} | |
bodyFile: "RELEASE.md" | |
- name: Upload Python package wheel to releases (master branch) | |
if: github.event_name == 'push' && env.BRANCH_NAME == 'master' | |
uses: ncipollo/release-action@v1 | |
with: | |
draft: true | |
prerelease: true | |
allowUpdates: true | |
replacesArtifacts: true | |
token: ${{ secrets.GITHUB_TOKEN }} | |
artifacts: "${{ env.WHEEL_DIR }}/*.whl" | |
tag: ${{ env.RELEASE_VERSION }} | |
name: ${{ env.RELEASE_TITLE }} | |
bodyFile: "RELEASE.md" |