Issue #347: go to cycle on composites #1832
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: [ "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 |