Skip to content

Build

Build #1289

Workflow file for this run

name: Build
on:
push:
# Only run on branches (not tags)
branches:
- '*'
workflow_dispatch:
workflow_run:
workflows: ['Update Mixxx']
types: [completed]
env:
VCPKG_ROOT: '${{ github.workspace }}/vcpkg'
MIXXX_ROOT: '${{ github.workspace }}/mixxx'
SCRIPTS_ROOT: '${{ github.workspace }}/scripts'
XCODE_ROOT: /Applications/Xcode_15.2.app
jobs:
build:
strategy:
matrix:
include:
- name: macOS (arm64)
os: macos-13
suffix: ''
triplet: arm64-osx-min1100-release
host_triplet: x64-osx-min1100-release
ccache_path: ~/Library/Caches/ccache
cpack_generator: DragNDrop
package_extension: dmg
cmake_args: >-
-DMACOS_BUNDLE=ON
- name: macOS (x86_64)
os: macos-13
suffix: ''
triplet: x64-osx-min1100-release
host_triplet: x64-osx-min1100-release
ccache_path: ~/Library/Caches/ccache
cpack_generator: DragNDrop
package_extension: dmg
cmake_args: >-
-DMACOS_BUNDLE=ON
- name: macOS (arm64, Debug Assertions)
os: macos-13
suffix: '-debugasserts'
triplet: arm64-osx-min1100-release
host_triplet: x64-osx-min1100-release
ccache_path: ~/Library/Caches/ccache
cpack_generator: DragNDrop
package_extension: dmg
cmake_args: >-
-DDEBUG_ASSERTIONS_FATAL=ON
-DMACOS_BUNDLE=ON
- name: macOS (x86_64, Debug Assertions)
os: macos-13
suffix: '-debugasserts'
triplet: x64-osx-min1100-release
host_triplet: x64-osx-min1100-release
ccache_path: ~/Library/Caches/ccache
cpack_generator: DragNDrop
package_extension: dmg
cmake_args: >-
-DDEBUG_ASSERTIONS_FATAL=ON
-DMACOS_BUNDLE=ON
- name: Linux (x86_64)
os: ubuntu-latest
suffix: ''
triplet: x64-linux-release
host_triplet: x64-linux-release
ccache_path: ~/.ccache
cpack_generator: TGZ
package_extension: tar.gz
# On Linux we build without battery support since this pulls in a
# dependency on GLib which is tricky to get right in a static linking scenario.
# See https://github.com/fwcd/m1xxx/pull/48#issuecomment-1807378063
cmake_args: >-
-DBATTERY=OFF
- name: Linux (x86_64, Debug Assertions)
os: ubuntu-latest
suffix: '-debugasserts'
triplet: x64-linux-release
host_triplet: x64-linux-release
ccache_path: ~/.ccache
cpack_generator: TGZ
package_extension: tar.gz
cmake_args: >-
-DDEBUG_ASSERTIONS_FATAL=ON
-DBATTERY=OFF
name: '${{ matrix.name }}'
runs-on: '${{ matrix.os }}'
env:
DEPS_BASE_NAME: 'deps-${{ matrix.triplet }}'
ARTIFACT_BASE_NAME: 'mixxx-${{ matrix.triplet }}${{ matrix.suffix }}'
VCPKG_DEFAULT_TRIPLET: '${{ matrix.triplet }}'
VCPKG_DEFAULT_HOST_TRIPLET: '${{ matrix.host_triplet }}'
steps:
- uses: actions/checkout@v4
with:
fetch-depth: '0' # to compute the monotonic version correctly
submodules: true
- name: Output runner info
run: uname -a
- name: Fetch versions and paths
run: |
for mod in "${{ env.VCPKG_ROOT }}" "${{ env.MIXXX_ROOT }}"; do
echo "$(basename "$mod")_commit=$(cd $mod && git rev-parse HEAD)" >> "$GITHUB_ENV"
echo "$(basename "$mod")_commit_short=$(cd $mod && git rev-parse --short HEAD)" >> "$GITHUB_ENV"
done
echo "mixxx_version=$(scripts/mixxx-version)" >> "$GITHUB_ENV"
shell: bash
- name: Set up Linux build environment
if: runner.os == 'Linux'
run: ${{ env.SCRIPTS_ROOT }}/install-ubuntu-deps
- name: Set up macOS build environment
if: runner.os == 'macOS'
run: |
${{ env.SCRIPTS_ROOT }}/install-macos-deps
sudo xcode-select -s "${{ env.XCODE_ROOT }}"
echo "==> Build environment"
xcode-select -p
xcrun --show-sdk-version
# TODO: Remove this workaround once CMake in GitHub's runner image is
# updated to 3.29.2, i.e. the `PACKAGE_PREFIX_DIR` issue is fixed again (the
# breaking change was reverted). See
# - https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2204-Readme.md (the image)
# - https://gitlab.kitware.com/cmake/cmake/-/commit/0e4db177647e29b5f4a99ec220e38b5dbbf01361 (the revert)
# - https://github.com/microsoft/vcpkg/pull/38088 (related discussion)
# - https://bugreports.qt.io/browse/QTBUG-124186 (related Qt bug)
- name: Pin CMake to 3.29.2
uses: jwlawson/actions-setup-cmake@v2
with:
cmake-version: '3.29.2'
# Build dependencies
- name: Bootstrap vcpkg
run: ${{ env.SCRIPTS_ROOT }}/bootstrap-vcpkg
- name: Set up vcpkg cache
uses: actions/cache@v4
with:
path: ${{ env.VCPKG_ROOT }}/installed
# TODO: Include hashed list of installed packages in key?
key: vcpkg-installed-${{ matrix.os }}-${{ env.VCPKG_DEFAULT_TRIPLET }}-${{ env.vcpkg_commit }}-${{ github.ref }}-${{ github.run_number }}
restore-keys: |
vcpkg-installed-${{ matrix.os }}-${{ env.VCPKG_DEFAULT_TRIPLET }}-${{ env.vcpkg_commit }}-${{ github.ref }}-
vcpkg-installed-${{ matrix.os }}-${{ env.VCPKG_DEFAULT_TRIPLET }}-${{ env.vcpkg_commit }}-
- name: Check disk space
run: df -h
- name: Output vcpkg dependency graph
run: ${{ env.SCRIPTS_ROOT }}/install-vcpkg-deps --graph --no-install --no-remove
- name: Install vcpkg packages
run: ${{ env.SCRIPTS_ROOT }}/install-vcpkg-deps --clean-after-build
- name: Upload vcpkg build logs
if: always()
uses: actions/upload-artifact@v4
with:
name: 'vcpkg-buildlogs-${{ matrix.triplet }}${{ matrix.suffix }}'
path: ${{ env.VCPKG_ROOT }}/buildtrees/**/*.log
- name: Save vcpkg cache
uses: actions/cache/save@v4
with:
# TODO: Share the key and the path with the previous step
path: ${{ env.VCPKG_ROOT }}/installed
key: vcpkg-installed-${{ matrix.os }}-${{ env.VCPKG_DEFAULT_TRIPLET }}-${{ env.vcpkg_commit }}-${{ github.ref }}-${{ github.run_number }}
# Export dependency archive to artifacts
- name: Export vcpkg archive
if: matrix.suffix == ''
working-directory: ${{ env.VCPKG_ROOT }}
run: >-
${{ env.SCRIPTS_ROOT }}/vcpkg export
--x-all-installed
--x-install-root="${{ env.VCPKG_ROOT }}/installed"
--zip
--output="${{ env.DEPS_BASE_NAME }}-${{ env.vcpkg_commit_short }}"
--output-dir="${{ env.VCPKG_ROOT }}"
- name: Upload vcpkg archive
if: matrix.suffix == ''
uses: actions/upload-artifact@v4
with:
name: ${{ env.DEPS_BASE_NAME }}-${{ env.vcpkg_commit_short }}
path: ${{ env.VCPKG_ROOT }}/${{ env.DEPS_BASE_NAME }}-${{ env.vcpkg_commit_short }}.zip
# Build Mixxx
- name: Configure build cache size
run: ccache -M 500M
- name: Set up build cache
uses: actions/cache@v4
with:
path: ${{ matrix.ccache_path }}
key: ccache-${{ matrix.triplet }}-${{ env.mixxx_commit }}-${{ github.ref }}-${{ github.run_number }}
restore-keys: |
ccache-${{ matrix.triplet }}-${{ env.mixxx_commit }}-${{ github.ref }}-
ccache-${{ matrix.triplet }}-${{ env.mixxx_commit }}-
ccache-${{ matrix.triplet }}-
- name: Configure Mixxx build
run: ${{ env.SCRIPTS_ROOT }}/configure-mixxx -- ${{ matrix.cmake_args }}
working-directory: ${{ env.MIXXX_ROOT }}
- name: Upload Mixxx configuration logs
if: always()
uses: actions/upload-artifact@v4
with:
name: configurelogs
path: ${{ env.MIXXX_ROOT }}/build/CMakeFiles/*.log
- name: Build Mixxx
run: ${{ env.SCRIPTS_ROOT }}/build-mixxx
working-directory: ${{ env.MIXXX_ROOT }}
- name: Save build cache
if: always()
uses: actions/cache/save@v4
with:
# TODO: Share the key with the setup step
path: ${{ matrix.ccache_path }}
key: ccache-${{ matrix.triplet }}-${{ env.mixxx_commit }}-${{ github.ref }}-${{ github.run_number }}
# Work around 'Resource busy' errors likely caused by a race condition
# between hdiutil and CPack by killing XProtect. Unfortunately this does
# not work reliably either, so we try a few times.
# We should replace this with a better solution once fixed upstream.
# See https://github.com/actions/runner-images/issues/7522
- name: Package Mixxx
if: matrix.package_extension && matrix.cpack_generator
uses: nick-fields/retry@v3
with:
timeout_minutes: 30
max_attempts: 8
retry_wait_seconds: 1
command: |
set -e
echo Killing XProtect...; sudo pkill -9 XProtect >/dev/null || true;
echo Waiting for XProtect...; while pgrep XProtect; do sleep 3; done;
cd "${{ env.MIXXX_ROOT }}/build"
cpack -G ${{ matrix.cpack_generator }} -V
mv *.${{ matrix.package_extension }} \
"mixxx-${{ env.mixxx_version }}-${{ matrix.triplet }}${{ matrix.suffix }}.${{ matrix.package_extension }}"
- name: Upload packaged Mixxx binaries
if: matrix.package_extension && matrix.cpack_generator
uses: actions/upload-artifact@v4
with:
name: ${{ env.ARTIFACT_BASE_NAME }}
path: ${{ env.MIXXX_ROOT }}/build/*.${{ matrix.package_extension }}
release:
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
needs: [build]
env:
PACKAGE_GLOB: 'mixxx-*/*'
steps:
- uses: actions/checkout@v4
with:
fetch-depth: '0' # to compute the monotonic version correctly
submodules: true
- name: Fetch versions and paths
run: echo "mixxx_version=$(scripts/mixxx-version)" >> "$GITHUB_ENV"
shell: bash
- name: Download artifacts for all builds
uses: actions/download-artifact@v4
with:
# TODO: Only download artifacts starting with 'mixxx-' to avoid needlessly downloading the dependency archives
path: '${{ env.MIXXX_ROOT }}/build'
- name: Create a release
env:
GH_TOKEN: ${{ github.token }}
run: |
version='${{ env.mixxx_version }}'
tag="v$version"
gh release create --title "$tag" "$tag" || true
gh release upload "$tag" '${{ env.MIXXX_ROOT }}'/build/${{ env.PACKAGE_GLOB }} || true