name: Build on: push: pull_request: jobs: build: strategy: fail-fast: false matrix: include: - name: Ubuntu 18.04 (gcc) os: ubuntu-18.04 cmake_args: >- -DWARNINGS_FATAL=ON -DFAAD=ON -DLOCALECOMPARE=ON -DMAD=ON -DMODPLUG=ON -DWAVPACK=ON -INSTALL_USER_UDEV_RULES=OFF cmake_generator: Unix Makefiles cmake_build_type: RelWithDebInfo ctest_args: compiler_cache: ccache compiler_cache_path: ~/.ccache cpack_generator: DEB buildenv_basepath: /home/runner/buildenv buildenv_script: tools/debian_buildenv.sh artifacts_name: Ubuntu 18.04 DEB artifacts_path: build/*.deb qt_qpa_platform: offscreen - name: Ubuntu 20.04 (gcc) os: ubuntu-20.04 cmake_args: >- -DWARNINGS_FATAL=ON -DFFMPEG=ON -DKEYFINDER=ON -DLOCALECOMPARE=ON -DMAD=ON -DMODPLUG=ON -DWAVPACK=ON -INSTALL_USER_UDEV_RULES=OFF cmake_generator: Unix Makefiles cmake_build_type: RelWithDebInfo ctest_args: compiler_cache: ccache compiler_cache_path: ~/.ccache cpack_generator: DEB buildenv_basepath: /home/runner/buildenv buildenv_script: tools/debian_buildenv.sh artifacts_name: Ubuntu 20.04 DEB artifacts_path: build/*.deb qt_qpa_platform: offscreen - name: macOS 10.15 os: macos-10.15 cmake_args: >- -DCOREAUDIO=ON -DHSS1394=ON -DMACOS_BUNDLE=ON cmake_generator: Unix Makefiles cmake_build_type: RelWithDebInfo # TODO: Fix this broken test on macOS ctest_args: --exclude-regex DirectoryDAOTest.relocateDirectory cpack_generator: DragNDrop compiler_cache: ccache compiler_cache_path: /Users/runner/Library/Caches/ccache buildenv_basepath: /Users/runner/buildenv buildenv_script: tools/macos_buildenv.sh artifacts_name: macOS DMG artifacts_path: build/*.dmg qt_qpa_platform: offscreen - name: Windows 2019 (MSVC) os: windows-2019 cmake_args: >- -DHSS1394=ON -DKEYFINDER=OFF -DLOCALECOMPARE=ON -DMAD=ON -DMEDIAFOUNDATION=ON cc: cl cxx: cl cmake_generator: Ninja cmake_build_type: RelWithDebInfo # TODO: Fix these broken tests on Windows ctest_args: --exclude-regex '^AutoDJProcessorTest.*$' cpack_generator: WIX compiler_cache: clcache compiler_cache_path: ${{ github.workspace }}\clcache buildenv_basepath: C:\buildenv buildenv_script: tools/windows_buildenv.bat artifacts_name: Windows Installer artifacts_path: build/*.msi qt_qpa_platform: windows env: # macOS codesigning APPLE_CODESIGN_IDENTITY: 2C2B5D3EDCE82BA55E22E9A67F16F8D03E390870 MACOS_CODESIGN_OPENSSL_PASSWORD: ${{ secrets.MACOS_CODESIGN_OPENSSL_PASSWORD }} MACOS_CODESIGN_CERTIFICATE_PASSWORD: ${{ secrets.MACOS_CODESIGN_CERTIFICATE_PASSWORD }} runs-on: ${{ matrix.os }} name: ${{ matrix.name }} steps: - name: "Check out repository" uses: actions/checkout@v2 with: fetch-depth: 0 - name: "Set up cmake" uses: jwlawson/actions-setup-cmake@v1.4 with: # This should always match the mininum required version in # our CMakeLists.txt cmake-version: '3.13.x' - name: "[Windows] Install additional build tools" if: runner.os == 'Windows' # TODO: Add ninja, clcache and rsync to the windows buildenv run: | python -m pip install ninja git+https://github.com/frerich/clcache.git $Env:PATH="C:\msys64\usr\bin;$Env:PATH" pacman -S --noconfirm coreutils bash rsync openssh Add-Content -Path "$Env:GITHUB_ENV" -Value "PATH=$Env:PATH" - name: "[Windows] Set up MSVC Developer Command Prompt" if: runner.os == 'Windows' uses: seanmiddleditch/gha-setup-vsdevenv@v3 - name: "[macOS/Windows] Get build environment name" if: runner.os != 'Linux' id: buildenv_name run: ${{ matrix.buildenv_script }} name - name: "[macOS/Windows] Set up build environment cache" if: runner.os != 'Linux' uses: actions/cache@v2 with: path: ${{ matrix.buildenv_basepath }} key: ${{ runner.os }}-buildenv-${{ env.BUILDENV_NAME }} - name: "[macOS] Import Apple code signing identity" id: apple_codesign if: runner.os == 'macOS' && env.MACOS_CODESIGN_OPENSSL_PASSWORD != null && env.MACOS_CODESIGN_CERTIFICATE_PASSWORD != null run: | # Decrypt the certificate openssl enc -aes-256-cbc -d -md sha512 \ -k "${MACOS_CODESIGN_OPENSSL_PASSWORD}" \ -in /Users/runner/work/mixxx/mixxx/packaging/certificates/macos_developer_id_codesign_certificate.p12.enc \ -out ~/certificate.p12 # Create a temporary keychain for the certificate and import it. security create-keychain -p mixxx Mixxx.keychain security unlock-keychain -p mixxx Mixxx.keychain security import ~/certificate.p12 -k Mixxx.keychain \ -P "${MACOS_CODESIGN_CERTIFICATE_PASSWORD}" -A security set-key-partition-list -S "apple-tool:,apple:" -k mixxx Mixxx.keychain # Add keychain to search list security list-keychains -s Mixxx.keychain # Prevent keychain access from timing out security set-keychain-settings Mixxx.keychain echo "CMAKE_ARGS_EXTRA=${CMAKE_ARGS_EXTRA} -DAPPLE_CODESIGN_IDENTITY=${APPLE_CODESIGN_IDENTITY}" >> "${GITHUB_ENV}" - name: "[Windows] Set up Windows code signing" env: WINDOWS_CODESIGN_CERTIFICATE_PATH: ${{ github.workspace }}\packaging\certificates\windows_sectigo_codesign_certificate.pfx WINDOWS_CODESIGN_CERTIFICATE_PASSWORD: ${{ secrets.WINDOWS_CODESIGN_CERTIFICATE_PASSWORD }} WINDOWS_CODESIGN_SECURE_FILE_SALT: ${{ secrets.WINDOWS_CODESIGN_SECURE_FILE_SALT }} WINDOWS_CODESIGN_SECURE_FILE_SECRET: ${{ secrets.WINDOWS_CODESIGN_SECURE_FILE_SECRET }} if: runner.os == 'Windows' && env.WINDOWS_CODESIGN_SECURE_FILE_SALT != null && env.WINDOWS_CODESIGN_SECURE_FILE_SECRET != null run: | iex ((New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/appveyor/secure-file/master/install.ps1')) appveyor-tools/secure-file -decrypt "$Env:WINDOWS_CODESIGN_CERTIFICATE_PATH.enc" -secret "$Env:WINDOWS_CODESIGN_SECURE_FILE_SECRET" -salt "$Env:WINDOWS_CODESIGN_SECURE_FILE_SALT" Add-Content -Path "$Env:GITHUB_ENV" -Value "WINDOWS_CODESIGN_CERTIFICATE_PATH=$Env:WINDOWS_CODESIGN_CERTIFICATE_PATH" Add-Content -Path "$Env:GITHUB_ENV" -Value "WINDOWS_CODESIGN_CERTIFICATE_PASSWORD=$Env:WINDOWS_CODESIGN_CERTIFICATE_PASSWORD" Add-Content -Path "$Env:GITHUB_ENV" -Value "CMAKE_ARGS_EXTRA=-DWINDOWS_CODESIGN=ON" - name: "Set up build environment" id: buildenv run: ${{ matrix.buildenv_script }} setup env: BUILDENV_BASEPATH: ${{ matrix.buildenv_basepath }} - name: "Set compiler cache size limit" # Set size to 2 GiB run: ${{ matrix.compiler_cache }} -M 2097152 - name: "Set up compiler cache" uses: actions/cache@v2 with: path: ${{ matrix.compiler_cache_path }} key: ${{ matrix.os }}-${{ matrix.compiler_cache }}-${{ github.head_ref }}-${{ github.run_number }} restore-keys: | ${{ matrix.os }}-${{ matrix.compiler_cache }}-${{ github.head_ref }} ${{ matrix.os }}-${{ matrix.compiler_cache }} - name: "Create build directory" run: mkdir build - name: "Configure" run: >- cmake -G "${{ matrix.cmake_generator }}" -DCMAKE_BUILD_TYPE=${{ matrix.cmake_build_type }} "-DCMAKE_PREFIX_PATH=${{ env.CMAKE_PREFIX_PATH }}" -DDEBUG_ASSERTIONS_FATAL=ON -DQt5_DIR=${{ env.QT_PATH }} ${{ matrix.cmake_args }} ${{ env.CMAKE_ARGS_EXTRA }} -DBATTERY=ON -DBROADCAST=ON -DBULK=ON -DHID=ON -DLILV=ON -DOPUS=ON -DQTKEYCHAIN=ON -DVINYLCONTROL=ON -DCMAKE_VERBOSE_MAKEFILE=OFF .. working-directory: build env: CC: ${{ matrix.cc }} CXX: ${{ matrix.cxx }} - name: "[Ubuntu/macOS] Set up gcc/clang problem matcher" if: runner.os != 'Windows' uses: ammaraskar/gcc-problem-matcher@master - name: "[Windows] Set up MSVC problem matcher" if: runner.os == 'Windows' uses: ammaraskar/msvc-problem-matcher@master - name: "Build" run: cmake --build . --config ${{ matrix.cmake_build_type }} working-directory: build env: CC: ${{ matrix.cc }} CXX: ${{ matrix.cxx }} CMAKE_BUILD_PARALLEL_LEVEL: 2 # GitHub Actions automatically zstd compresses caches CCACHE_NOCOMPRESS: true CLCACHE_COMPRESS: false CLCACHE_HARDLINK: true - name: "Print compiler cache stats" run: ${{ matrix.compiler_cache }} -s - name: "Test" run: ctest --timeout 45 ${{ matrix.ctest_args }} working-directory: build env: # Render analyzer waveform tests to an offscreen buffer QT_QPA_PLATFORM: ${{ matrix.qt_qpa_platform }} GTEST_COLOR: 1 # Windows tests fail randomly if run in parallel CTEST_PARALLEL_LEVEL: 1 CTEST_OUTPUT_ON_FAILURE: 1 - name: Benchmark run: cmake --build . --target mixxx-benchmark --config ${{ matrix.cmake_build_type }} working-directory: build env: # Render analyzer waveform tests to an offscreen buffer QT_QPA_PLATFORM: ${{ matrix.qt_qpa_platform }} - name: "Package" run: cpack -G ${{ matrix.cpack_generator }} -V working-directory: build - name: "[Ubuntu] Import PPA GPG key" if: startsWith(matrix.os, 'ubuntu') && env.RRYAN_AT_MIXXX_DOT_ORG_GPG_PRIVATE_KEY != null run: gpg --import <(echo "${{ secrets.RRYAN_AT_MIXXX_DOT_ORG_GPG_PRIVATE_KEY }}") env: RRYAN_AT_MIXXX_DOT_ORG_GPG_PRIVATE_KEY: ${{ secrets.RRYAN_AT_MIXXX_DOT_ORG_GPG_PRIVATE_KEY }} - name: "Package for PPA" # No need to do the PPA build for both Ubuntu versions if: matrix.os == 'ubuntu-20.04' run: | if [[ "${{ github.ref }}" == "refs/heads/2.3" ]] && [[ "${{ github.repository }}" == "mixxxdj/mixxx" ]]; then CPACK_ARGS="-D DEB_UPLOAD_PPA=ppa:mixxx/mixxxbetas" else # only build the source DEB, do not upload CPACK_ARGS="-D DEB_SOURCEPKG=ON" fi cpack -G External $CPACK_ARGS working-directory: build - name: "[macOS] Sign, Notarize, and Staple Package" if: runner.os == 'macOS' && env.MACOS_CODESIGN_OPENSSL_PASSWORD != null && env.MACOS_CODESIGN_CERTIFICATE_PASSWORD != null run: packaging/macos/sign_notarize_staple.sh build/*.dmg env: APPLE_ID_USERNAME: rryan@mixxx.org APPLE_BUNDLE_ID: org.mixxx.mixxx APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.MACOS_NOTARIZATION_APP_SPECIFIC_PASSWORD }} ASC_PROVIDER: FLYL4D545V - name: "[Windows] Sign Package" if: runner.os == 'Windows' && env.WINDOWS_CODESIGN_CERTIFICATE_PATH != null && env.WINDOWS_CODESIGN_CERTIFICATE_PASSWORD != null run: signtool sign /f $Env:WINDOWS_CODESIGN_CERTIFICATE_PATH /p $Env:WINDOWS_CODESIGN_CERTIFICATE_PASSWORD *.msi working-directory: build - name: "[macOS/Windows] Upload build to downloads.mixxx.org" # skip deploying Ubuntu builds to downloads.mixxx.org because these are deployed to the PPA if: runner.os != 'Linux' && github.event_name == 'push' && env.SSH_PASSWORD != null run: bash tools/deploy.sh ${{ matrix.artifacts_path }} env: DESTDIR: public_html/downloads/builds OS: ${{ runner.os }} SSH_HOST: downloads-hostgator.mixxx.org SSH_KEY: packaging/certificates/downloads-hostgator.mixxx.org.key SSH_PASSWORD: ${{ secrets.DOWNLOADS_HOSTGATOR_DOT_MIXXX_DOT_ORG_KEY_PASSWORD }} SSH_USER: mixxx UPLOAD_ID: ${{ github.run_id }} - name: "Upload GitHub Actions artifacts" uses: actions/upload-artifact@v2 with: name: ${{ matrix.artifacts_name }} path: ${{ matrix.artifacts_path }}