Skip to content

See which one worked #1345

See which one worked

See which one worked #1345

Workflow file for this run

name: Build and Test
on: [ push, pull_request ]
permissions:
contents: read
jobs:
linux:
if: false
runs-on: ubuntu-24.04
strategy:
fail-fast: false
matrix:
qt:
- 5
- 5.9.9
- 5.10.1
- 5.11.3
- 5.12.12
- 5.13.2
- 5.14.2
- 5.15.2
- 6
- 6.2.4
- 6.3.2
- 6.4.3
- 6.5.3
- 6.6.3
- 6.7.3
- 6.8.0
cc:
- clang
- gcc
steps:
- name: Upgrade OS
run: |
sudo apt-mark hold firefox grub-efi-amd64-signed
sudo apt update && sudo apt upgrade
sudo apt install lcov llvm
- uses: actions/setup-python@v5
with:
python-version: '>=3.9'
- name: Install Ubuntu's Qt5
if: matrix.qt == 5
run: sudo apt install qtbase5{,-doc}-dev qtconnectivity5-{dev,doc-html} qttools5-dev{,-tools}
- name: Install Ubuntu's Qt6
if: matrix.qt == 6
run: >
sudo apt install qt6-{base-{dev{,-tools},doc-dev},connectivity-{dev,doc-html},l10n-tools,tools-dev{,-tools}}
- name: Install online Qt version
if: contains(matrix.qt, '.') # ie if not using Ubuntu's Qt5/Qt6.
uses: jurplel/install-qt-action@v4
with:
version: ${{ matrix.qt }}
modules: ${{ startsWith(matrix.qt, '6') && 'qtconnectivity' || '' }}
setup-python: false
documentation: true
doc-archives: >-
${{ (startsWith(matrix.qt, '5.10.') || startsWith(matrix.qt, '5.11.')) && 'qt' ||
(startsWith(matrix.qt, '5') && 'qtcore qtbluetooth' || 'qtcore') }}
doc-modules: ${{ startsWith(matrix.qt, '6') && 'qtbluetooth' || '' }}
- name: Upload aqtinstall log file
if: failure()
uses: actions/upload-artifact@v4
with:
name: aqtinstall-log-linux-${{ matrix.cc }}-${{ matrix.qt }}
path: aqtinstall.log
if-no-files-found: error
- name: Install linuxdeploy
uses: pcolby/install-linuxdeploy@v1
with:
plugins: appimage qt
- uses: actions/checkout@v4
- name: Build
id: build
env:
CC: ${{ matrix.cc }}
CXX: ${{ matrix.cc == 'gcc' && 'g++' || 'clang++' }}
PROJECT_BUILD_ID: ${{ github.run_number }}.linux.x86-64.${{ matrix.cc }}.qt-${{ matrix.qt }}
run: |
[[ '${{ matrix.qt }}' =~ ^[56]$ ]] ||
qtInstallDocs="$RUNNER_WORKSPACE/Qt/Docs/Qt-${QT_VERSION:-${{ matrix.qt }}}"
# With coverage instrumentation.
cmake -D CMAKE_BUILD_TYPE=Release \
-D ENABLE_COVERAGE=true \
${qtInstallDocs:+-D "QT_INSTALL_DOCS=$qtInstallDocs"} \
-S "$GITHUB_WORKSPACE" -B "$RUNNER_TEMP/coverage"
# Without coverage instrumentation.
cmake -D CMAKE_BUILD_TYPE=Release \
-D ENABLE_COVERAGE=false \
${qtInstallDocs:+-D "QT_INSTALL_DOCS=$qtInstallDocs"} \
-S "$GITHUB_WORKSPACE" -B "$RUNNER_TEMP/release"
tee -a "$GITHUB_OUTPUT" <<< "dokitVersion=$(cat "$RUNNER_TEMP/release/version.txt")"
cmake --build "$RUNNER_TEMP/coverage"
cmake --build "$RUNNER_TEMP/release"
"$RUNNER_TEMP/coverage/src/cli/dokit" --version
"$RUNNER_TEMP/release/src/cli/dokit" --version
- name: Test
run: |
ctest --output-on-failure --test-dir "$RUNNER_TEMP/coverage" --verbose
ctest --output-on-failure --test-dir "$RUNNER_TEMP/release" --verbose
cmake --build "$RUNNER_TEMP/coverage" --target coverage
- name: Upload test results
uses: actions/upload-artifact@v4
with:
name: test-results-${{ steps.build.outputs.dokitVersion }}
path: |
${{ runner.temp }}/coverage/coverage.info
${{ runner.temp }}/coverage/removeHtmlDates.sh
${{ runner.temp }}/coverage/test/**/*.tap
${{ runner.temp }}/release/test/**/*.tap
if-no-files-found: error
- name: Report parallel coverage to Codacy
if: github.event_name == 'push' && github.actor != 'dependabot[bot]'
env:
CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }}
run: >
bash <(curl -Ls https://coverage.codacy.com/get.sh) report --partial \
-l CPP -r "${{ runner.temp }}/coverage/coverage.info"
- name: Report parallel coverage to Coveralls
if: github.event_name == 'push' && github.actor != 'dependabot[bot]'
uses: coverallsapp/github-action@v2
with:
file: ${{ runner.temp }}/coverage/coverage.info
format: lcov
flag-name: linux-${{ matrix.cc }}-${{ matrix.qt }}
parallel: true
- name: Build AppImage
run: cmake --build "$RUNNER_TEMP/release" --target cli-appimage
- name: Upload build artifacts
uses: actions/upload-artifact@v4
with:
name: dokit-${{ steps.build.outputs.dokitVersion }}
path: |
${{ runner.temp }}/release/src/lib/libQtPokit.so
${{ runner.temp }}/release/src/cli/dokit
if-no-files-found: error
- name: Upload AppImage
uses: actions/upload-artifact@v4
with:
name: dokit-${{ steps.build.outputs.dokitVersion }}.AppImage
path: ${{ runner.temp }}/release/dokit-${{ steps.build.outputs.dokitVersion }}.AppImage
if-no-files-found: error
mac:
if: false
runs-on: ${{ matrix.os }}
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
qt:
- 5.9.9
- 5.10.1
- 5.11.3
- 5.12.12
- 5.13.2
- 5.14.2
- 5.15.2
- 6.2.4
- 6.3.2
- 6.4.3
- 6.5.3
- 6.6.3
- 6.7.3
- 6.8.0
os:
- macos-13
- macos-14
- macos-15
cc:
- clang
- gcc
exclude:
# GitHub's macOS 14+ gcc can only target arm64, but Qt didn't add Apple arm64 support until Qt 6.2, so:
# Exclude Qt 5.x (and 6.0, 6.1) with GCC on macOS 14+. Also see the `arch` step below for more details.
- { qt: '5.9.9', os: macos-14, cc: gcc }
- { qt: '5.9.9', os: macos-15, cc: gcc }
- { qt: '5.10.1', os: macos-14, cc: gcc }
- { qt: '5.10.1', os: macos-15, cc: gcc }
- { qt: '5.11.3', os: macos-14, cc: gcc }
- { qt: '5.11.3', os: macos-15, cc: gcc }
- { qt: '5.12.12', os: macos-14, cc: gcc }
- { qt: '5.12.12', os: macos-15, cc: gcc }
- { qt: '5.13.2', os: macos-14, cc: gcc }
- { qt: '5.13.2', os: macos-15, cc: gcc }
- { qt: '5.14.2', os: macos-14, cc: gcc }
- { qt: '5.14.2', os: macos-15, cc: gcc }
- { qt: '5.15.2', os: macos-14, cc: gcc }
- { qt: '5.15.2', os: macos-15, cc: gcc }
# Exclude Qt 5.10 with GCC on macOS. See https://bugreports.qt.io/browse/QTBUG-66585
- { qt: '5.10.1', cc: gcc }
# Exclude Qt 6.x with GCC on macOS for now. See https://bugreports.qt.io/browse/QTBUG-107050
- { qt: '6.2.4', cc: gcc }
- { qt: '6.3.2', cc: gcc }
- { qt: '6.4.3', cc: gcc }
- { qt: '6.5.3', cc: gcc }
- { qt: '6.6.3', cc: gcc }
- { qt: '6.7.3', cc: gcc }
- { qt: '6.8.0', cc: gcc }
steps:
- uses: actions/checkout@v4
- name: Install lcov
run: brew install lcov
- name: Install Qt
uses: jurplel/install-qt-action@v4
with:
version: ${{ matrix.qt }}
modules: ${{ startsWith(matrix.qt, '6') && 'qtconnectivity' || '' }}
documentation: true
doc-archives: >-
${{ (startsWith(matrix.qt, '5.10.') || startsWith(matrix.qt, '5.11.')) && 'qt' ||
(startsWith(matrix.qt, '5') && 'qtcore qtbluetooth' || 'qtcore') }}
doc-modules: ${{ startsWith(matrix.qt, '6') && 'qtbluetooth' || '' }}
- name: Upload aqtinstall log file
if: failure()
uses: actions/upload-artifact@v4
with:
name: aqtinstall-log-${{ matrix.os }}-${{ matrix.cc }}-${{ matrix.qt }}
path: aqtinstall.log
if-no-files-found: error
- name: Choose target architectures
id: arch
run: |
# Qt only supports x86-64 (not arm64) prior to Qt 6.2.0. See https://www.qt.io/blog/qt-on-apple-silicon
if [[ '${{ matrix.qt }}' =~ ^(5|6\.[01])\. ]]; then arch=x86_64
# GitHub runners' (homebrew'd) gcc's only support support x86-64 prior to macos-14, and only arm64 after.
# Note: if we attempt to use multiple archs, gcc will warn, but continue, resulting in later failures.
elif [[ '${{ matrix.cc }}' == 'gcc' ]]; then
if [[ '${{ matrix.os }}' == 'macos-13' ]]; then arch='x86_64'; else arch='arm64'; fi
# Otherwise, default to universal binaries, where possible.
else arch='arm64;x86_64'; fi
tee -a "$GITHUB_ENV" <<< "CMAKE_OSX_ARCHITECTURES=${arch}"
tee -a "$GITHUB_OUTPUT" <<< "buildId=${arch//;/-}"
- name: Build
id: build
env:
CC: ${{ matrix.cc == 'gcc' && 'gcc-14' || 'clang' }}
CXX: ${{ matrix.cc == 'gcc' && 'g++-14' || 'clang++' }}
PROJECT_BUILD_ID: "${{ github.run_number }}.${{ matrix.os }}.${{ steps.arch.outputs.buildId }}.\
${{ matrix.cc }}.qt-${{ matrix.qt }}"
run: |
# With coverage instrumentation.
[[ '${{ matrix.os }}' == 'macos-13' && '${{ matrix.cc }}' == 'clang' ]] ||
cmake -D CMAKE_BUILD_TYPE=Release \
-D CODECOV_GCOV=/usr/local/bin/gcov-14 \
-D ENABLE_COVERAGE=true \
-D LLVM_COV=/Library/Developer/CommandLineTools/usr/bin/llvm-cov \
-D LLVM_PROFDATA=/Library/Developer/CommandLineTools/usr/bin/llvm-profdata \
-D QT_INSTALL_DOCS="$RUNNER_WORKSPACE/Qt/Docs/Qt-${{ matrix.qt }}" \
-S "$GITHUB_WORKSPACE" -B "$RUNNER_TEMP/coverage"
# Without coverage instrumentation.
cmake -D CMAKE_BUILD_TYPE=Release \
-D ENABLE_COVERAGE=false \
-D QT_INSTALL_DOCS="$RUNNER_WORKSPACE/Qt/Docs/Qt-${{ matrix.qt }}" \
-S "$GITHUB_WORKSPACE" -B "$RUNNER_TEMP/release"
tee -a "$GITHUB_OUTPUT" <<< "dokitVersion=$(cat "$RUNNER_TEMP/release/version.txt")"
{ echo -n 'tap='; [[ '${{ matrix.qt }}' =~ ^5\.1[2-9]|6 ]] && echo true || echo false; } |
tee -a "$GITHUB_OUTPUT"
[[ '${{ matrix.os }}' == 'macos-13' && '${{ matrix.cc }}' == 'clang' ]] ||
cmake --build "$RUNNER_TEMP/coverage" -- VERBOSE=1
cmake --build "$RUNNER_TEMP/release" -- VERBOSE=1
"$RUNNER_TEMP/release/src/cli/dokit.app/Contents/MacOS/dokit" --version
[[ '${{ matrix.os }}' == 'macos-13' && '${{ matrix.cc }}' == 'clang' ]] ||
"$RUNNER_TEMP/coverage/src/cli/dokit.app/Contents/MacOS/dokit" --version
- name: Grant Bluetooth access # Only needed for unit tests with older Qt's on newer runners.
if: matrix.os != 'macos-13' && ( startsWith(matrix.qt, '5') || startsWith(matrix.qt, '6.2.') )
run: >
sudo sqlite3 "$HOME/Library/Application Support/com.apple.TCC/TCC.db" "INSERT or REPLACE INTO access
( service, client, client_type, auth_value, auth_reason, auth_version, flags ) VALUES
( 'kTCCServiceBluetoothAlways', '/usr/local/opt/runner/provisioner/provisioner', 1, 2, 3, 1, 0 )"
- name: Test
run: |
[[ '${{ matrix.os }}' == 'macos-13' && '${{ matrix.cc }}' == 'clang' ]] ||
ctest --output-on-failure --test-dir "$RUNNER_TEMP/coverage" --verbose
ctest --output-on-failure --test-dir "$RUNNER_TEMP/release" --verbose
timeout-minutes: 1
- name: Collate test coverage
if: matrix.os != 'macos-13' || matrix.cc == 'gcc'
run: cmake --build "$RUNNER_TEMP/coverage" --target coverage
- name: Upload test results
if: matrix.os != 'macos-13' || fromJSON(steps.build.outputs.tap)
uses: actions/upload-artifact@v4
with:
name: test-results-${{ steps.build.outputs.dokitVersion }}
path: |
${{ runner.temp }}/coverage/coverage.info
${{ runner.temp }}/coverage/removeHtmlDates.sh
${{ runner.temp }}/coverage/test/**/*.tap
${{ runner.temp }}/release/test/**/*.tap
if-no-files-found: error
- name: Report parallel coverage to Codacy
if: >-
( matrix.os != 'macos-13' || matrix.cc == 'gcc' )
&& github.event_name == 'push' && github.actor != 'dependabot[bot]'
env:
CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }}
run: >
bash <(curl -Ls https://coverage.codacy.com/get.sh) report --partial \
-l CPP -r "${{ runner.temp }}/coverage/coverage.info"
- name: Report parallel coverage to Coveralls
if: >-
( matrix.os != 'macos-13' || matrix.cc == 'gcc' )
&& github.event_name == 'push' && github.actor != 'dependabot[bot]'
uses: coverallsapp/github-action@v2
with:
file: ${{ runner.temp }}/coverage/coverage.info
format: lcov
flag-name: mac-${{ matrix.cc }}-${{ matrix.qt }}
parallel: true
- name: Make app bundle
run: macdeployqt "$RUNNER_TEMP/release/src/cli/dokit.app" -dmg -verbose=2
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: dokit-${{ steps.build.outputs.dokitVersion }}
path: ${{ runner.temp }}/release/src/cli/*.app
if-no-files-found: error
win:
runs-on: windows-latest
defaults: { run: { shell: cmd } }
strategy:
fail-fast: false
matrix:
qt:
#- 5.9.9
#- 5.10.1
#- 5.11.3
#- 5.12.12
#- 5.13.2
#- 5.14.2
#- 5.15.2
#- 6.2.4
#- 6.3.2
#- 6.4.3
#- 6.5.3
#- 6.6.3
- 6.7.3
- 6.8.0
arch: [ x86, x86-64 ] #, arm64 ]
toolchain: [ llvm, mingw, msvc ]
exclude:
# Exclude arm64 builds for Qt's earlier than 6.2, since Qt only added (Windows) arm64
# 'Technology Preview' support in 6.2.
- { arch: arm64, qt: '5.9.9' }
- { arch: arm64, qt: '5.10.1' }
- { arch: arm64, qt: '5.11.3' }
- { arch: arm64, qt: '5.12.12' }
- { arch: arm64, qt: '5.13.2' }
- { arch: arm64, qt: '5.14.2' }
- { arch: arm64, qt: '5.15.2' }
# Also exclude arm64 for Qt 6.8 for now, as Qt 6.8 is moving to native-only (not cross-compiling) arm64 on
# Windows (https://www.qt.io/blog/qt-for-windows-on-arm-may21-update) and there are not compatible runners.
- { arch: arm64, qt: '6.8.0' }
# Exclude MinGW (including LLVM) builds for arm64, since Qt does not provide those binaries yet.
- { arch: arm64, toolchain: llvm }
- { arch: arm64, toolchain: mingw }
# Exclude LLVM builds for x86, since neither Qt nor GitHub runners provide 32-bit LLVM MinGW binaries.
- { arch: x86, toolchain: llvm }
# Exclude x86 (32-bit) builds for Qt 5.10.1 with MSVC. See https://bugreports.qt.io/browse/QTBUG-67259
- { arch: x86, qt: '5.10.1', toolchain: msvc }
# Exclude x86 (32-bit) builds for Qt 6.x, since the Qt online installer dropped those.
- { arch: x86, qt: '6.2.4' }
- { arch: x86, qt: '6.3.2' }
- { arch: x86, qt: '6.4.3' }
- { arch: x86, qt: '6.5.3' }
- { arch: x86, qt: '6.6.3' }
- { arch: x86, qt: '6.7.3' }
- { arch: x86, qt: '6.8.0' }
# Exclude MinGW (including LLVM) builds for x86-64 with Qt's earlier than 5.12, since the Qt online
# installer (as used by aqtinstaller) did not include x86-64 binaries until Qt 5.12.
- { arch: x86-64, qt: '5.9.9', toolchain: llvm }
- { arch: x86-64, qt: '5.9.9', toolchain: mingw }
- { arch: x86-64, qt: '5.10.1', toolchain: llvm }
- { arch: x86-64, qt: '5.10.1', toolchain: mingw }
- { arch: x86-64, qt: '5.11.3', toolchain: llvm }
- { arch: x86-64, qt: '5.11.3', toolchain: mingw }
# Exclude LLVM builds before Qt 6.7, since Qt didn't begin shipping llvm-mingw support until then.
- { toolchain: llvm, qt: '5.9.9' }
- { toolchain: llvm, qt: '5.10.1' }
- { toolchain: llvm, qt: '5.11.3' }
- { toolchain: llvm, qt: '5.12.12' }
- { toolchain: llvm, qt: '5.13.2' }
- { toolchain: llvm, qt: '5.14.2' }
- { toolchain: llvm, qt: '5.15.2' }
- { toolchain: llvm, qt: '6.2.4' }
- { toolchain: llvm, qt: '6.3.2' }
- { toolchain: llvm, qt: '6.4.3' }
- { toolchain: llvm, qt: '6.5.3' }
- { toolchain: llvm, qt: '6.6.3' }
include:
# Map the aqtinstall (aqt) architectures.
#- { qt: '5.9.9', toolchain: mingw, arch: x86, aqtArch: win32_mingw53 }
#- { qt: '5.9.9', toolchain: msvc, arch: x86, aqtArch: win32_msvc2015 }
#- { qt: '5.9.9', toolchain: msvc, arch: x86-64, aqtArch: win64_msvc2013_64 }
#- { qt: '5.9.9', toolchain: msvc, arch: x86-64, aqtArch: win64_msvc2015_64 }
#- { qt: '5.9.9', toolchain: msvc, arch: x86-64, aqtArch: win64_msvc2017_64 }
#- { qt: '5.10.1', toolchain: mingw, arch: x86, aqtArch: win32_mingw53 }
# { qt: '5.10.1', toolchain: msvc, arch: x86, aqtArch: win32_msvc2015 } # Excluded above (QTBUG-67259).
#- { qt: '5.10.1', toolchain: msvc, arch: x86-64, aqtArch: win64_msvc2013_64 }
#- { qt: '5.10.1', toolchain: msvc, arch: x86-64, aqtArch: win64_msvc2015_64 }
#- { qt: '5.10.1', toolchain: msvc, arch: x86-64, aqtArch: win64_msvc2017_64 }
#- { qt: '5.11.3', toolchain: mingw, arch: x86, aqtArch: win32_mingw53 }
#- { qt: '5.11.3', toolchain: msvc, arch: x86, aqtArch: win32_msvc2015 }
#- { qt: '5.11.3', toolchain: msvc, arch: x86-64, aqtArch: win64_msvc2015_64 }
#- { qt: '5.11.3', toolchain: msvc, arch: x86-64, aqtArch: win64_msvc2017_64 }
#- { qt: '5.12.12', toolchain: mingw, arch: x86, aqtArch: win32_mingw73 }
#- { qt: '5.12.12', toolchain: mingw, arch: x86-64, aqtArch: win64_mingw73 }
#- { qt: '5.12.12', toolchain: msvc, arch: x86, aqtArch: win32_msvc2017 }
#- { qt: '5.12.12', toolchain: msvc, arch: x86-64, aqtArch: win64_msvc2015_64 }
#- { qt: '5.12.12', toolchain: msvc, arch: x86-64, aqtArch: win64_msvc2017_64 }
#- { qt: '5.13.2', toolchain: mingw, arch: x86, aqtArch: win32_mingw73 }
#- { qt: '5.13.2', toolchain: mingw, arch: x86-64, aqtArch: win64_mingw73 }
#- { qt: '5.13.2', toolchain: msvc, arch: x86, aqtArch: win32_msvc2017 }
#- { qt: '5.13.2', toolchain: msvc, arch: x86-64, aqtArch: win64_msvc2015_64 }
#- { qt: '5.13.2', toolchain: msvc, arch: x86-64, aqtArch: win64_msvc2017_64 }
#- { qt: '5.14.2', toolchain: mingw, arch: x86, aqtArch: win32_mingw73 }
#- { qt: '5.14.2', toolchain: mingw, arch: x86-64, aqtArch: win64_mingw73 }
#- { qt: '5.14.2', toolchain: msvc, arch: x86, aqtArch: win32_msvc2017 }
#- { qt: '5.14.2', toolchain: msvc, arch: x86-64, aqtArch: win64_msvc2015_64 }
#- { qt: '5.14.2', toolchain: msvc, arch: x86-64, aqtArch: win64_msvc2017_64 }
#- { qt: '5.15.2', toolchain: mingw, arch: x86, aqtArch: win32_mingw81 }
#- { qt: '5.15.2', toolchain: mingw, arch: x86-64, aqtArch: win64_mingw81 }
#- { qt: '5.15.2', toolchain: msvc, arch: x86, aqtArch: win32_msvc2019 }
#- { qt: '5.15.2', toolchain: msvc, arch: x86-64, aqtArch: win64_msvc2015_64 }
#- { qt: '5.15.2', toolchain: msvc, arch: x86-64, aqtArch: win64_msvc2019_64 }
#- { qt: '6.2.4', toolchain: mingw, arch: x86-64, aqtArch: win64_mingw }
#- { qt: '6.2.4', toolchain: msvc, arch: arm64, aqtArch: win64_msvc2019_arm64 }
#- { qt: '6.2.4', toolchain: msvc, arch: x86-64, aqtArch: win64_msvc2019_64 }
#- { qt: '6.3.2', toolchain: mingw, arch: x86-64, aqtArch: win64_mingw }
#- { qt: '6.3.2', toolchain: msvc, arch: arm64, aqtArch: win64_msvc2019_arm64 }
#- { qt: '6.3.2', toolchain: msvc, arch: x86-64, aqtArch: win64_msvc2019_64 }
#- { qt: '6.4.3', toolchain: mingw, arch: x86-64, aqtArch: win64_mingw }
#- { qt: '6.4.3', toolchain: msvc, arch: arm64, aqtArch: win64_msvc2019_arm64 }
#- { qt: '6.4.3', toolchain: msvc, arch: x86-64, aqtArch: win64_msvc2019_64 }
#- { qt: '6.5.3', toolchain: mingw, arch: x86-64, aqtArch: win64_mingw }
#- { qt: '6.5.3', toolchain: msvc, arch: arm64, aqtArch: win64_msvc2019_arm64 }
#- { qt: '6.5.3', toolchain: msvc, arch: x86-64, aqtArch: win64_msvc2019_64 }
#- { qt: '6.6.3', toolchain: mingw, arch: x86-64, aqtArch: win64_mingw }
#- { qt: '6.6.3', toolchain: msvc, arch: arm64, aqtArch: win64_msvc2019_arm64 }
#- { qt: '6.6.3', toolchain: msvc, arch: x86-64, aqtArch: win64_msvc2019_64 }
- { qt: '6.7.3', toolchain: llvm, arch: x86-64, aqtArch: win64_llvm_mingw }
- { qt: '6.7.3', toolchain: mingw, arch: x86-64, aqtArch: win64_mingw }
#- { qt: '6.7.3', toolchain: msvc, arch: arm64, aqtArch: win64_msvc2019_arm64 }
- { qt: '6.7.3', toolchain: msvc, arch: x86-64, aqtArch: win64_msvc2019_64 }
- { qt: '6.8.0', toolchain: llvm, arch: x86-64, aqtArch: win64_llvm_mingw }
- { qt: '6.8.0', toolchain: mingw, arch: x86-64, aqtArch: win64_mingw }
- { qt: '6.8.0', toolchain: msvc, arch: x86-64, aqtArch: win64_msvc2022_64 }
# Map the MSVC architecture.
#- { toolchain: msvc, arch: arm64, msvcArch: amd64_arm64 }
- { toolchain: msvc, arch: x86, msvcArch: amd64_x86 }
- { toolchain: msvc, arch: x86-64, msvcArch: amd64 }
# Define the generator and dll names per toolchain.
- { toolchain: 'llvm', generator: 'MinGW Makefiles', dll: libQtPokit.dll }
- { toolchain: 'mingw', generator: 'MinGW Makefiles', dll: libQtPokit.dll }
- { toolchain: 'msvc', generator: 'NMake Makefiles', dll: QtPokit.dll }
# Use Qt-provided 64-bit MinGW for recent Qt's (defaulting to GitHub's 12.2.0 version for older Qt versions).
#- { toolchain: 'mingw', arch: x86-64, qt: '5.14.2', aqtTools: 'tools_mingw1310' }
#- { toolchain: 'mingw', arch: x86-64, qt: '5.15.2', aqtTools: 'tools_mingw1310' }
#- { toolchain: 'mingw', arch: x86-64, qt: '6.4.3', aqtTools: 'tools_mingw1310' }
#- { toolchain: 'mingw', arch: x86-64, qt: '6.5.3', aqtTools: 'tools_mingw1310' }
#- { toolchain: 'mingw', arch: x86-64, qt: '6.6.3', aqtTools: 'tools_mingw1310' }
- { toolchain: 'llvm', arch: x86-64, qt: '6.7.3', aqtTools: 'tools_llvm_mingw1706' }
- { toolchain: 'mingw', arch: x86-64, qt: '6.7.3', aqtTools: 'tools_mingw1310' }
- { toolchain: 'llvm', arch: x86-64, qt: '6.8.0', aqtTools: 'tools_llvm_mingw1706' }
- { toolchain: 'mingw', arch: x86-64, qt: '6.8.0', aqtTools: 'tools_mingw1310' }
steps:
- name: Configure path
if: matrix.toolchain != 'msvc'
shell: bash
run: |
# Paths needed for MSYS2's LCOV to function properly. Note, its important that we add the mingw64 one here
# before any later mingw installs (including those from install-qt-action) or this would interfere with those.
tee -a "$GITHUB_PATH" <<< 'C:\msys64\usr\bin' # Else geninfo will fail to find .gcda files (not sure why).
tee -a "$GITHUB_PATH" <<< 'C:\msys64\mingw64\bin' # Else lcov will fail to find its own geninfo command.
# For 32-bit (x86) MinGW builds, place GitHub's mingw32 at the head of the path (install-qt-actions would
# supersede this below, but we never install (32-bit) mingw32 via install-qt-actions, so not an issue).
[[ '${{ matrix.toolchain }}' != 'mingw' || '${{ matrix.arch }}' != 'x86' ]] ||
tee -a "$GITHUB_PATH" <<< 'C:\mingw32\bin'
- name: Install LCOV
if: matrix.toolchain != 'msvc'
run: pacman --sync --noconfirm --verbose mingw-w64-x86_64-lcov
- uses: actions/checkout@v4
- name: Install host Qt for cross-compilation
if: matrix.arch == 'arm64'
uses: jurplel/install-qt-action@v4
with:
version: ${{ matrix.qt }}
arch: win64_msvc2019_64
set-env: false
- name: Upload aqtinstall log file
if: matrix.arch == 'arm64' && failure()
uses: actions/upload-artifact@v4
with:
name: aqtinstall-log-win-${{ matrix.arch }}-${{ matrix.toolchain }}-${{ matrix.qt }}-cross
path: aqtinstall.log
if-no-files-found: error
- name: Install Qt
uses: jurplel/install-qt-action@v4
with:
version: ${{ matrix.qt }}
modules: ${{ startsWith(matrix.qt, '6') && 'qtconnectivity' || '' }}
arch: ${{ matrix.aqtArch }}
tools: ${{ matrix.aqtTools }}
add-tools-to-path: true
documentation: true
doc-archives: >-
${{ (startsWith(matrix.qt, '5.10.') || startsWith(matrix.qt, '5.11.')) && 'qt' ||
(startsWith(matrix.qt, '5') && 'qtcore qtbluetooth' || 'qtcore') }}
doc-modules: ${{ startsWith(matrix.qt, '6') && 'qtbluetooth' || '' }}
- name: Upload aqtinstall log file
if: failure()
uses: actions/upload-artifact@v4
with:
name: aqtinstall-log-win-${{ matrix.arch }}-${{ matrix.toolchain }}-${{ matrix.qt }}
path: aqtinstall.log
if-no-files-found: error
- name: Configure cross-compilation
if: matrix.arch == 'arm64'
shell: bash
run: |
echo "CMAKE_TOOLCHAIN_FILE=${QT_ROOT_DIR/_64/_arm64/}\lib\cmake\Qt6\qt.toolchain.cmake" >> $GITHUB_ENV
echo "qtHostPath=${QT_ROOT_DIR/_arm64/_64}" >> $GITHUB_ENV
- name: Configure MSVC
if: matrix.toolchain == 'msvc'
uses: ilammy/msvc-dev-cmd@v1
with:
arch: ${{ matrix.msvcArch }}
toolset: ${{ startsWith(matrix.qt, '5') && '14.29' || '' }} # MSVC 14.38+ has many deprecation issues w/ Qt5.
- name: Build w/ coverage instrumentation
if: matrix.toolchain != 'msvc'
env:
CMAKE_MESSAGE_LOG_LEVEL: VERBOSE
PROJECT_BUILD_ID: ${{ github.run_number }}.win.${{ matrix.arch }}.${{ matrix.toolchain }}.qt-${{ matrix.qt }}
run: |
cmake -D CMAKE_BUILD_TYPE=Release ^
-D ENABLE_COVERAGE=true ^
-D QT_HOST_PATH=%qtHostPath% ^
-D QT_INSTALL_DOCS=%RUNNER_WORKSPACE%\Qt\Docs\Qt-${{ matrix.qt }} ^
-G "${{ matrix.generator }}" -S "%GITHUB_WORKSPACE%" -B "%RUNNER_TEMP%/coverage"
cmake --build "%RUNNER_TEMP%/coverage" --verbose
- name: Build w/o coverage instrumentation
env:
CMAKE_MESSAGE_LOG_LEVEL: VERBOSE
PROJECT_BUILD_ID: ${{ github.run_number }}.win.${{ matrix.arch }}.${{ matrix.toolchain }}.qt-${{ matrix.qt }}
run: |
cmake -D CMAKE_BUILD_TYPE=Release ^
-D ENABLE_COVERAGE=false ^
-D QT_HOST_PATH=%qtHostPath% ^
-D QT_INSTALL_DOCS=%RUNNER_WORKSPACE%\Qt\Docs\Qt-${{ matrix.qt }} ^
-G "${{ matrix.generator }}" -S "%GITHUB_WORKSPACE%" -B "%RUNNER_TEMP%/release"
cmake --build "%RUNNER_TEMP%/release" --verbose
- name: Capture build-output variables
id: post-build
shell: bash
run: |
echo "dokitVersion=$(cat "$RUNNER_TEMP/release/version.txt")" | tee -a "$GITHUB_OUTPUT"
{ echo -n 'tap='; [[ '${{ matrix.qt }}' =~ ^5\.1[2-9]|6 ]] && echo true || echo false; } |
tee -a "$GITHUB_OUTPUT"
- name: Install DLL for tests w/ coverage
if: matrix.toolchain != 'msvc'
run: |
copy /v /b src\lib\${{ matrix.dll }} /b test\unit\cli
copy /v /b src\lib\${{ matrix.dll }} /b test\unit\lib
working-directory: ${{ runner.temp }}/coverage
- name: Install DLL for tests w/o coverage
run: |
copy /v /b src\lib\${{ matrix.dll }} /b test\unit\cli
copy /v /b src\lib\${{ matrix.dll }} /b test\unit\lib
working-directory: ${{ runner.temp }}/release
- name: Test StatusService 0
if: matrix.arch != 'arm64' && matrix.toolchain != 'msvc'
run: 'D:\a\_temp\coverage\test\unit\lib\testAbstractPokitService 2>&1'
- name: Test StatusService 0.5
if: matrix.arch != 'arm64' && matrix.toolchain != 'msvc'
shell: bash
run: |
echo A
/d/a/_temp/coverage/test/unit/lib/testStatusService.exe || true
echo B
/d/a/_temp/coverage/test/unit/lib/testStatusService.exe >&2 || true
echo C
/d/a/_temp/coverage/test/unit/lib/testStatusService.exe 2>&1 || true
echo D
/d/a/_temp/coverage/test/unit/lib/testStatusService.exe -o foo,txt || true
echo E
cat foo
- name: Test StatusService 3
if: matrix.arch != 'arm64' && matrix.toolchain != 'msvc'
run: 'D:\a\_temp\coverage\test\unit\lib\testStatusService.exe 2>&1'
- name: Test StatusService 4
if: matrix.arch != 'arm64' && matrix.toolchain != 'msvc'
run: 'D:\a\_temp\release\test\unit\lib\testStatusService.exe 2>&1'
- name: Test StatusService 1
if: matrix.arch != 'arm64' && matrix.toolchain != 'msvc'
run: 'D:\a\_temp\coverage\test\unit\lib\testStatusService.exe -o StatusService.tap,tap -o -,txt 2>&1'
- name: Test StatusService 2
if: matrix.arch != 'arm64' && matrix.toolchain != 'msvc'
run: 'D:\a\_temp\release\test\unit\lib\testStatusService.exe -o StatusService.tap,tap -o -,txt 2>&1'
- name: Test w/ coverage # We can't execute arm64 binaries on an x86-64 host.
if: matrix.arch != 'arm64' && matrix.toolchain != 'msvc'
run: ctest --output-on-failure --test-dir "%RUNNER_TEMP%/coverage" --extra-verbose 2>&1
- name: Test w/o coverage # We can't execute arm64 binaries on an x86-64 host.
if: matrix.arch != 'arm64'
run: ctest --output-on-failure --test-dir "%RUNNER_TEMP%/release" --extra-verbose 2>&1
- name: Collate test coverage
if: matrix.toolchain != 'msvc'
run: cmake --build "%RUNNER_TEMP%/coverage" --target coverage --verbose
- name: Upload test results
if: matrix.arch != 'arm64' && ( matrix.toolchain != 'msvc' || fromJSON(steps.post-build.outputs.tap) )
uses: actions/upload-artifact@v4
with:
name: test-results-${{ steps.post-build.outputs.dokitVersion }}
path: |
${{ runner.temp }}/coverage/coverage.info
${{ runner.temp }}/coverage/removeHtmlDates.sh
${{ runner.temp }}/coverage/test/**/*.tap
${{ runner.temp }}/release/test/**/*.tap
if-no-files-found: error
- name: Make portable
if: matrix.arch != 'arm64'
run: cmake --build "%RUNNER_TEMP%/release" --target cli-portable
- name: Check portable version
if: matrix.arch != 'arm64'
shell: bash
run: '"$RUNNER_TEMP/release/portable/dokit.exe" --version'
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: dokit-${{ steps.post-build.outputs.dokitVersion }}
path: |
${{ runner.temp }}/release/src/lib/${{ matrix.dll }}
${{ runner.temp }}/release/src/cli/dokit.exe
if-no-files-found: error
- name: Upload artifacts (portable)
if: matrix.arch != 'arm64'
uses: actions/upload-artifact@v4
with:
name: dokit-${{ steps.post-build.outputs.dokitVersion }}.portable
path: ${{ runner.temp }}/release/portable
if-no-files-found: error
collate-test-results:
needs: [ linux, mac, win ]
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- name: Install lcov
run: |
sudo apt-mark hold firefox grub-efi-amd64-signed
sudo apt update
sudo apt upgrade
sudo apt install lcov
- name: Download test results
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh run download "$GITHUB_RUN_ID" --dir "$RUNNER_TEMP/artifacts" --pattern test-results-*
- name: Generate test summary
uses: pcolby/tap-summary@v1
with:
path: ${{ runner.temp }}/artifacts/**/*.tap
- name: Generate HTML coverage report
run: |
shopt -s globstar
# Update source code paths from macOS tracefiles to match Linux.
sed -i -Ee 's|^SF:/Users|SF:/home|' artifacts/*.macos-*/**/coverage.info
# Update source code paths from Windows tracefiles to match Linux, and remove all \r chars from line endings.
sed -i -Ee 's|\r$||' -e 's|\\|/|g' -e 's|^SF:D:/a|SF:/home/runner/work|' artifacts/*.win.*/**/coverage.info
# Combine all tracefiles into one.
lcov $(find artifacts -name '*.info' -type f -printf '-a %p\n') -o coverage.info
# Generate the HTML report.
echo 'genhtml_sort = 0' >> ~/.lcovrc
genhtml --output-directory coverage/coverage coverage.info
# Can use any of the removeHtmlDates.sh scripts here, so the Ubuntu GCC Qt6 job's version will do.
/usr/bin/env bash ./artifacts/test-results-*.gcc.qt-6/coverage/removeHtmlDates.sh
# Remove build numbers from pre-releases, and remove extra build info (such as ".linux.x86-64.gcc.qt-6")
# from all releases, since this coverage report is an aggregation of many build hosts.
sed -i -Ee 's/(headerValue">([0-9]+\.){2}[0-9]+)(((-pre)\+[0-9]+)|(\+[0-9]+))\..*</\1\5\6</' \
coverage/**/*.html
working-directory: ${{ runner.temp }}
- name: Upload HTML coverage report
uses: actions/upload-artifact@v4
with:
name: coverage-report
path: "${{ runner.temp }}/coverage/coverage"
if-no-files-found: error
- name: Report partial-finished to Codacy
if: github.event_name == 'push' && github.actor != 'dependabot[bot]'
env:
CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }}
run: bash <(curl -Ls https://coverage.codacy.com/get.sh) final
- name: Report parallel-finished to Coveralls
if: github.event_name == 'push' && github.actor != 'dependabot[bot]'
uses: coverallsapp/github-action@v2
with:
parallel-finished: true
update-tests-on-doc-branch:
permissions:
contents: write
runs-on: ubuntu-24.04
if: success() && (github.ref == 'refs/heads/main')
needs: collate-test-results
steps:
- uses: actions/checkout@v4
with: { ref: doc }
- name: Clear previous coverage report
run: rm -rf main/cov
- name: Download HTML report
uses: actions/download-artifact@v4
with:
name: coverage-report
path: main/cov
- name: Inject version selectors
run: ./.selector.sh
- name: Inspect changes # for diagnostics only.
run: git status && git diff
- name: Push updates
run: |
[[ -z $(git status --porcelain) ]] || {
git config user.name github-actions
git config user.email [email protected]
git pull
git add .
git commit -m "Update coverage report for ${GITHUB_SHA}"
git push
}