Skip to content

Issue #347: go to cycle on composites #1832

Issue #347: go to cycle on composites

Issue #347: go to cycle on composites #1832

name: Build and test
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
workflow_dispatch:
env:
BUILD_TYPE: Release
PIP_BREAK_SYSTEM_PACKAGES: 1
permissions:
contents: read
checks: write
jobs:
##############################################################
## Linux
##############################################################
build_linux:
strategy:
fail-fast: false
matrix:
kind:
- name: linux_release
build_type: 'Release'
pyinstaller: true
package_kind: linuxes
- name: linux_debug
build_type: 'Debug'
- name: linux_barebones
build_type: 'Release'
cmake_opts: '"BACKEND_JACK" = "Off", "HAVE_LV2" = "Off"'
- name: linux_asan
# Note: ASAN build does not have a test because it is not trivial to deploy
# an asan-built program on another system. The build is here to ensure the
# build process still works. To use ASAN, compile like this natively.
build_type: 'Debug'
cmake_opts: '"ENABLE_ASAN" = "On"'
- name: linux_coverage
build_type: 'Debug'
cmake_opts: '"ENABLE_COVERAGE" = "On"'
coverage: true
runs-on: ubuntu-latest
container:
image: sandervocke/shoopdaloop_base_manylinux_2_28:latest
options: --user root --workdir /
#if: false
steps:
- name: Checkout
uses: actions/checkout@v3
with:
submodules: recursive
- name: Build
uses: ./.github/actions/build_toplevel
with:
name: ${{ matrix.kind.name }}
cmake_build_type: ${{ matrix.kind.build_type }}
cmake_opts: ${{ matrix.kind.cmake_opts }}
prepare_kind: 'manylinux_2_28'
python: python3.8
rename_wheel_sed: "'s/([^\\.]+)[\\.]+whl/\\1.whl/g'" # remove double dot
pyinstaller: ${{ matrix.kind.pyinstaller }}
pyinstaller_python: /usr/bin/python3.8 # pyinstaller uses the official AlmaLinux Python because it has shared libs
package_kind: ${{ matrix.kind.package_kind }}
coverage: ${{ matrix.kind.coverage }}
test_linux:
strategy:
fail-fast: false
matrix:
kind:
- name: release_wheel_debian_stable
python: python3
pip: python3 -m pip
pytest: python3 -m pytest
container: sandervocke/shoopdaloop_run_base_debian_stable:latest
package: wheel_linux_release
- name: barebones_debian_stable
python: python3
pip: python3 -m pip
pytest: python3 -m pytest
container: sandervocke/shoopdaloop_run_base_debian_stable:latest
package: wheel_linux_barebones
- name: release_deb_ubuntu_latest
python: python3
pip: python3 -m pip
pytest: python3 -m pytest
container: sandervocke/shoopdaloop_run_base_ubuntu_latest:latest
package: package_linux_release_deb
- name: release_pyinst_ubuntu_latest
python: python3
pip: python3 -m pip
pytest: python3 -m pytest
container: sandervocke/shoopdaloop_run_base_ubuntu_latest:latest
package: pyinstaller_linux_release
- name: release_pacman_arch
python: python
pip: python -m pip
pytest: python -m pytest
container: sandervocke/shoopdaloop_run_base_arch:latest
package: package_linux_release_pacman
- name: release_rpm_manylinux
python: python3.8
pip: python3.8 -m pip
pytest: python3.8 -m pytest
container: sandervocke/shoopdaloop_base_manylinux_2_28:latest
package: package_linux_release_rpm
- name: coverage_manylinux_2_28
python: python3.8 -m coverage run --source=shoopdaloop
pip: python3.8 -m pip
pytest: python3.8 -m coverage run --source=shoopdaloop -m pytest
container: sandervocke/shoopdaloop_base_manylinux_2_28:latest
package: wheel_linux_coverage
coverage: true
run_cmd_prefix: >-
BASEDIR=$(pwd)
EXCLUDE='/*/third_party/* /*/catch2/*'
REPORTDIR=coverage_reports
BUILDDIR=$(realpath build/cp*/)
ORI_BUILD_DIR=$(cat ori_build_dir.txt)
DO_GENHTML=0
SHOOP_LOG=QoverageCollectorFactory=debug
QML_IMPORT_PATH=$(~/.local/bin/qoverage --importpath)
scripts/run_and_generate_coverage.sh
runs-on: ubuntu-latest
needs: build_linux
#if: false
container:
image: ${{ matrix.kind.container }}
options: --user root --workdir / # Note: this gets disregarded if container is null
steps:
- name: Checkout
uses: actions/checkout@v3
with:
submodules: recursive
- name: Test
uses: ./.github/actions/test_toplevel
with:
name: ${{ matrix.kind.name }}
package: ${{ matrix.kind.package }}
asan: ${{ matrix.kind.asan }}
coverage: ${{ matrix.kind.coverage }}
pip: ${{ matrix.kind.pip }}
python: ${{ matrix.kind.python }}
run_cmd_prefix: ${{ matrix.kind.run_cmd_prefix }}
pytest: ${{ matrix.kind.pytest }}
qpa_platform: vnc
pyinstaller: ${{ matrix.kind.pyinstaller }}
codecov_token: ${{ secrets.CODECOV_TOKEN }}
##############################################################
## MacOS
##############################################################
build_macos:
strategy:
fail-fast: false
matrix:
kind:
- name: macos_release
build_type: 'Release'
appbundle: true
package_kind: dmg
- name: macos_debug
build_type: 'Debug'
- name: macos_barebones
build_type: 'Debug'
cmake_opts: '"BACKEND_JACK" = "Off", "HAVE_LV2" = "Off"'
runs-on: macos-11
#if: false
steps:
- name: Checkout
uses: actions/checkout@v3
with:
submodules: recursive
- name: Build
uses: ./.github/actions/build_toplevel
with:
name: ${{ matrix.kind.name }}
cmake_build_type: ${{ matrix.kind.build_type }}
cmake_opts: ${{ matrix.kind.cmake_opts }}
prepare_kind: 'macos'
python: python3.8
pyinstaller: ${{ matrix.kind.pyinstaller }}
appbundle: ${{ matrix.kind.appbundle }}
pyinstaller_python: ${{ matrix.kind.pyinstaller_python }}
package_kind: ${{ matrix.kind.package_kind }}
coverage: ${{ matrix.kind.coverage }}
# Note: for some reason, an incorrect MacOS identifier is generated (macos_11 instead of macos_11_0).
# Also remove the double dot if any.
rename_wheel_sed: "'s/(.*-macosx_[1-9]+_)(x86_64|arm64|universal2)[\\.]*whl/\\10_\\2.whl/g'"
test_macos:
strategy:
fail-fast: false
matrix:
kind:
- name: release_whl_macos11
python: python3
pip: python3 -m pip
pytest: python3 -m pytest
container: null
os: macos-11
package: wheel_macos_release
qpa_platform: offscreen
- name: release_whl_macos12
python: python3
pip: python3 -m pip
pytest: python3 -m pytest
container: null
os: macos-12
package: wheel_macos_release
qpa_platform: offscreen
- name: release_whl_macos13
python: python3
pip: python3 -m pip
pytest: python3 -m pytest
container: null
os: macos-13
package: wheel_macos_release
qpa_platform: offscreen
- name: debug_whl_macos13
python: python3
pip: python3 -m pip
pytest: python3 -m pytest
container: null
os: macos-13
package: wheel_macos_debug
qpa_platform: offscreen
- name: release_dmg_macos13
python: python3
pip: python3 -m pip
pytest: python3 -m pytest
container: null
os: macos-13
package: package_macos_release
qpa_platform: offscreen
runs-on: ${{ matrix.kind.os }}
needs: build_macos
#if: false
container:
image: ${{ matrix.kind.container }}
options: --user root --workdir / # Note: this gets disregarded if container is null
steps:
- name: Checkout
uses: actions/checkout@v3
with:
submodules: recursive
- name: Test
uses: ./.github/actions/test_toplevel
with:
name: ${{ matrix.kind.name }}
package: ${{ matrix.kind.package }}
asan: ${{ matrix.kind.asan }}
coverage: ${{ matrix.kind.coverage }}
pip: ${{ matrix.kind.pip }}
python: ${{ matrix.kind.python }}
run_cmd_prefix: ${{ matrix.kind.run_cmd_prefix }}
pytest: ${{ matrix.kind.pytest }}
qpa_platform: ${{ matrix.kind.qpa_platform }}
pyinstaller: ${{ matrix.kind.pyinstaller }}
codecov_token: ${{ secrets.CODECOV_TOKEN }}
##############################################################
## Windows
##############################################################
build_windows:
strategy:
fail-fast: false
matrix:
kind:
- name: windows_release
os: windows-2022
python: python.exe
pip: python.exe -m pip
container_image: null
prepare: 'windows'
build_type: 'Release'
pyinstaller: true
package_kind: innosetup
rename_wheel_sed: "'s/([^\\.]+)[\\.]+whl/\\1.whl/g'" # remove double dot
- name: windows_barebones
os: windows-2022
python: python.exe
pip: python.exe -m pip
container_image: null
prepare: 'windows'
build_type: 'Release'
cmake_opts: '"BACKEND_JACK" = "Off", "HAVE_LV2" = "Off"'
rename_wheel_sed: "'s/([^\\.]+)[\\.]+whl/\\1.whl/g'" # remove double dot
- name: windows_debug
os: windows-2022
python: python.exe
pip: python.exe -m pip
container_image: null
prepare: 'windows'
build_type: 'Debug'
rename_wheel_sed: "'s/([^\\.]+)[\\.]+whl/\\1.whl/g'" # remove double dot
runs-on: ${{ matrix.kind.os}}
container:
image: ${{ matrix.kind.container_image }}
options: --user root --workdir /
#if: false
steps:
- name: Checkout
uses: actions/checkout@v3
with:
submodules: recursive
- name: Build
uses: ./.github/actions/build_toplevel
with:
name: ${{ matrix.kind.name }}
cmake_build_type: ${{ matrix.kind.build_type }}
cmake_opts: ${{ matrix.kind.cmake_opts }}
prepare_kind: ${{ matrix.kind.prepare }}
python: ${{ matrix.kind.python }}
rename_wheel_sed: ${{ matrix.kind.rename_wheel_sed }}
pyinstaller: ${{ matrix.kind.pyinstaller }}
pyinstaller_python: ${{ matrix.kind.pyinstaller_python }}
package_kind: ${{ matrix.kind.package_kind }}
coverage: ${{ matrix.kind.coverage }}
test_windows:
strategy:
fail-fast: false
matrix:
kind:
- name: release_windows
python: python.exe
pip: python.exe -m pip
pytest: python.exe -m pytest
container: null
os: windows-2022
package: wheel_windows_release
qpa_platform: offscreen
pathconvert: "| cygpath -u -f -"
- name: release_windows_innosetup
python: python.exe
pip: python.exe -m pip
pytest: python.exe -m pytest
container: null
os: windows-2022
package: package_windows_release
qpa_platform: offscreen
pathconvert: "| cygpath -u -f -"
- name: debug_windows
python: python.exe
pip: python.exe -m pip
pytest: python.exe -m pytest
container: null
os: windows-2022
package: wheel_windows_debug
qpa_platform: offscreen
pathconvert: "| cygpath -u -f -"
runs-on: ${{ matrix.kind.os }}
needs: build_windows
#if: false
container:
image: ${{ matrix.kind.container }}
options: --user root --workdir / # Note: this gets disregarded if container is null
steps:
- name: Checkout
uses: actions/checkout@v3
with:
submodules: recursive
- name: Test
uses: ./.github/actions/test_toplevel
with:
name: ${{ matrix.kind.name }}
package: ${{ matrix.kind.package }}
asan: ${{ matrix.kind.asan }}
coverage: ${{ matrix.kind.coverage }}
pip: ${{ matrix.kind.pip }}
python: ${{ matrix.kind.python }}
run_cmd_prefix: ${{ matrix.kind.run_cmd_prefix }}
pytest: ${{ matrix.kind.pytest }}
qpa_platform: ${{ matrix.kind.qpa_platform }}
pyinstaller: ${{ matrix.kind.pyinstaller }}
codecov_token: ${{ secrets.CODECOV_TOKEN }}
##############################################################
## Crash collection
##############################################################
collect_crashes:
runs-on: ubuntu-latest
needs:
- build_linux
- test_linux
- build_macos
- test_macos
- build_windows
- test_windows
if: ${{ always() }}
container:
image: archlinux:latest
options: --user root --workdir /
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Download artifacts
uses: actions/download-artifact@v4
with:
pattern: crashdumps_*_${{ github.run_number }}
path: crashdumps
- name: Count crash dumps
id: count
shell: bash
run: |
mkdir -p crashdumps
echo "crashdumps=$(ls crashdumps/crashdumps_* | wc -l)" | tee -a $GITHUB_OUTPUT
pacman --noconfirm -Syy
pacman --noconfirm -S --needed tree git
- name: Download debug information
uses: actions/download-artifact@v4
if: ${{ steps.count.outputs.crashdumps != 0 }}
with:
path: debuginfo
pattern: debuginfo_*
merge-multiple: true
- name: Cache minidump-stackwalk
id: cache-minidump
uses: actions/cache@v4
with:
path: minidump-stackwalk
key: minidump-stackwalk-1
- name: Get minidump package sources
if: ${{ steps.count.outputs.crashdumps != 0 && steps.cache-minidump.outputs.cache-hit != 'true' }}
shell: bash
run: |
pacman --noconfirm -Syy
pacman --noconfirm -S --needed git base-devel && git clone https://aur.archlinux.org/minidump-stackwalk.git
- name: Makepkg Build
id: makepkg
if: ${{ steps.count.outputs.crashdumps != 0 && steps.cache-minidump.outputs.cache-hit != 'true' }}
uses: edlanglois/pkgbuild-action@v1
with:
pkgdir: minidump-stackwalk
- name: Install minidump package
if: ${{ steps.count.outputs.crashdumps != 0 }}
shell: bash
run: |
pacman --noconfirm -U minidump-stackwalk/minidump-stackwalk*.pkg*
- name: Process dumps
if: ${{ steps.count.outputs.crashdumps != 0 }}
shell: bash
run: |
tree crashdumps
cp -r debuginfo crashdumps/debuginfo
for dump in $(find crashdumps -name "*.dmp"); do
echo ""
echo "================================================="
echo "Processing $dump..."
echo "================================================="
minidump-stackwalk $dump debuginfo/breakpad_symbols || true | tee $dump.stackwalk
done
- name: Upload crash dumps to Bugsplat
if: ${{ (success() || failure()) && steps.count.outputs.crashdumps != 0 }}
shell: bash
run: |
for dump in $(find crashdumps -name "*.dmp"); do
echo ""
echo "================================================="
echo "Uploading $dump..."
echo "================================================="
bash ./scripts/upload_crash_info.sh $dump git-${{ github.sha }} "[email protected]" "Found on GitHub Actions run: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" ${dump}.moreinfo
done
- uses: actions/setup-node@v4
if: ${{ (success() || failure()) && steps.count.outputs.crashdumps != 0 }}
with:
node-version: 19
- name: Upload BugSplat debug symbols
if: ${{ (success() || failure()) && steps.count.outputs.crashdumps != 0 }}
uses: SanderVocke/symbol-upload@test_action
with:
clientId: "${{ secrets.BUGSPLAT_CLIENT_ID }}"
clientSecret: "${{ secrets.BUGSPLAT_CLIENT_SECRET }}"
database: shoopdaloop
application: shoopdaloop
version: git-${{ github.sha }}
files: "**/*.sym"
directory: crashdumps/debuginfo
- name: Upload crash dumps as artifact
if: ${{ (success() || failure()) && steps.count.outputs.crashdumps != 0 }}
uses: actions/upload-artifact@v4
with:
name: crashdumps_summary
path: crashdumps