Fix and modernize CI #332
Workflow file for this run
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
# Workflow that builds Quassel on various Linux distros, and creates packages for both Windows and macOS. | |
# For tagged pushes, a draft release is automatically created, using the tag message as release description | |
# and attaching Windows and macOS builds, as well as the source archive. | |
name: Quassel CI | |
on: | |
push: | |
pull_request: | |
schedule: | |
# * is a special character in YAML so you have to quote this string | |
# Run at 13:37 on the 14th of every month (odd time to reduce load) | |
- cron: '37 13 14 * *' | |
# Can't use simpler definition of [ push, pull_request, schedule ] | |
# See https://www.jeffgeerling.com/blog/2020/running-github-actions-workflow-on-schedule-and-other-events | |
defaults: | |
run: | |
shell: bash | |
jobs: | |
# ------------------------------------------------------------------------------------------------------------------------------------------ | |
build-linux: | |
name: Linux | |
runs-on: ubuntu-latest | |
container: quassel/quassel-build-env:${{ matrix.dist }} | |
strategy: | |
fail-fast: false | |
matrix: | |
dist: [ debian-stable, debian-testing, ubuntu-xenial, ubuntu-bionic, ubuntu-focal, ubuntu-groovy ] | |
cxx: [ 'g++', 'clang++' ] | |
with-kde: [ -DWITH_KDE=ON ] | |
extra-options: [ -DWITH_WEBENGINE=ON ] | |
include: | |
# Baseline, test more combinations | |
- dist: ubuntu-xenial | |
with-kde: -DWITH_KDE=OFF | |
extra-options: -DWITH_WEBKIT=ON | |
- dist: ubuntu-xenial | |
with-kde: -DWITH_KDE=ON | |
extra-options: -DWITH_WEBKIT=ON | |
exclude: | |
# QtWebEngine is not available on Xenial | |
- dist: ubuntu-xenial | |
extra-options: -DWITH_WEBENGINE=ON | |
env: | |
# CCACHE_BASEDIR: ${{ github.workspace }} | |
# CCACHE_DIR: ${{ github.workspace }}/ccache | |
# CCACHE_MAXSIZE: 100M | |
CXX: ${{ matrix.cxx }} | |
steps: | |
- name: Check out source code | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
- name: Get timestamp | |
id: get-timestamp | |
run: echo "::set-output name=timestamp::$(date -u "+%F-%R")" | |
- name: Setup ccache | |
uses: hendrikmuhs/ccache-action@v1.2 | |
with: | |
key: ${{ github.job }}-${{ matrix.dist }}-${{ matrix.cxx }} | |
# - name: Setup ccache | |
# uses: actions/cache@v4 | |
# with: | |
# path: ${{ github.workspace }}/ccache | |
# key: ${{ matrix.dist }}-ccache-${{ steps.get-timestamp.outputs.timestamp }} | |
# restore-keys: | | |
# ${{ matrix.dist }}-ccache- | |
# - name: Zero ccache stats | |
# run: ccache -z | |
- name: Configure | |
run: | | |
mkdir build | |
cd build && cmake $GITHUB_WORKSPACE \ | |
-GNinja \ | |
-DCMAKE_BUILD_TYPE=Release \ | |
-DBUILD_TESTING=ON \ | |
-DFATAL_WARNINGS=ON \ | |
${{ matrix.with-kde }} \ | |
${{ matrix.extra-options }} | |
- name: Build | |
run: cd build && ninja | |
- name: Run tests | |
run: cd build && ctest | |
- name: Install | |
run: cd build && DESTDIR=$GITHUB_WORKSPACE/image ninja install | |
- name: Print ccache stats | |
run: ccache -s | |
# ------------------------------------------------------------------------------------------------------------------------------------------ | |
build-macos: | |
name: macOS | |
runs-on: macos-${{ matrix.osversion }} | |
strategy: | |
fail-fast: false | |
matrix: | |
osversion: [13, latest] | |
env: | |
CCACHE_BASEDIR: ${{ github.workspace }} | |
CCACHE_DIR: ${{ github.workspace }}/ccache | |
CCACHE_MAXSIZE: 100M | |
steps: | |
- name: Select Xcode version | |
uses: maxim-lobanov/setup-xcode@v1 | |
with: | |
# Newer Xcode versions may not officially be supported by Qt | |
# Check https://doc.qt.io/qt-5/macos.html | |
xcode-version: '14.x' | |
- name: Check out source code | |
uses: actions/checkout@v2 | |
with: | |
fetch-depth: 0 # so git-describe works | |
submodules: recursive | |
- name: Fetch tag information | |
if: startsWith(github.ref, 'refs/tags/') | |
run: git fetch -f origin $GITHUB_REF:$GITHUB_REF | |
- name: Install dependencies | |
# Skip "brew update" as it can trigger 50+ minutes of updating. | |
# GitHub Actions intentionally disables the default auto-update on their | |
# macOS CI images (and macOS CI images usually update once a week). | |
# | |
# See https://github.com/actions/virtual-environments/issues/2173 | |
# > We've set no auto-update intentionally here [...] | |
# And https://github.com/microsoft/appcenter/issues/293 | |
# | |
# If Homebrew begins failing in the future due to out-of-date versions, | |
# it can be re-enabled here as follows... | |
# run: brew update && [below command] | |
run: brew install boost ccache ninja qt@5 | |
- name: Get timestamp | |
id: get-timestamp | |
run: echo "::set-output name=timestamp::$(date -u "+%F-%R")" | |
- name: Setup ccache | |
uses: hendrikmuhs/ccache-action@v1.2 | |
with: | |
key: ${{ github.job }}-${{ matrix.dist }}-${{ matrix.cxx }} | |
- name: Setup ccache | |
uses: actions/cache@v2 | |
with: | |
path: ${{ github.workspace }}/ccache | |
key: macos-ccache-${{ steps.get-timestamp.outputs.timestamp }} | |
restore-keys: | | |
macos-ccache- | |
- name: Zero ccache stats | |
run: ccache -z | |
- name: Configure | |
continue-on-error: true | |
run: | | |
mkdir build | |
cd build && cmake $GITHUB_WORKSPACE \ | |
-GNinja \ | |
-DCMAKE_CXX_FLAGS="-std=c++17" \ | |
-DWANT_CORE=ON \ | |
-DWANT_QTCLIENT=ON \ | |
-DWANT_MONO=ON \ | |
-DCMAKE_PREFIX_PATH=$(brew --prefix)/opt/qt@5 \ | |
-DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/bundles \ | |
-DCMAKE_BUILD_TYPE=Release \ | |
-DBUILD_TESTING=ON \ | |
-DFATAL_WARNINGS=OFF \ | |
-DENABLE_SHARED=OFF \ | |
-DBUNDLE=ON \ | |
- name: Dump CMake logs | |
run: cat build/CMakeFiles/CMakeConfigureLog.yaml | |
- name: Build | |
run: cd build && ninja | |
- name: Run tests | |
run: cd build && ctest | |
- name: Install | |
run: cd build && ninja install | |
- name: Print ccache stats | |
run: ccache -s | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v2 | |
with: | |
name: macOS | |
path: ${{ github.workspace }}/bundles/*.dmg | |
# ------------------------------------------------------------------------------------------------------------------------------------------ | |
build-windows: | |
name: Windows | |
runs-on: windows-latest | |
env: | |
WORKSPACE: ${{ github.workspace }} | |
CRAFT: /C/CraftMaster/windows-msvc2019_64-cl/craft/bin/craft.py | |
steps: | |
- name: Check out source code | |
uses: actions/checkout@v2 | |
with: | |
fetch-depth: 0 # so git-describe works | |
submodules: recursive | |
- name: Fetch tag information | |
if: startsWith(github.ref, 'refs/tags/') | |
run: git fetch -f origin $GITHUB_REF:$GITHUB_REF | |
- name: Clone CraftMaster | |
run: git clone --depth=1 https://invent.kde.org/kde/craftmaster.git /C/CraftMaster/CraftMaster | |
- name: Configure CraftMaster | |
run: python /C/CraftMaster/CraftMaster/CraftMaster.py --config $WORKSPACE/.craftsettings.ini --variables "WORKSPACE=$WORKSPACE" | |
- name: Add Quassel blueprint | |
run: python $CRAFT --add-blueprint-repository https://github.com/quassel/craft-blueprints-quassel.git | |
- name: Install NSIS | |
run: python $CRAFT dev-utils/nsis | |
- name: Install dependencies | |
run: python $CRAFT --install-deps quassel/quassel | |
- name: Build | |
run: python $CRAFT --no-cache --src-dir $WORKSPACE quassel/quassel | |
- name: Run tests | |
run: python $CRAFT --no-cache --src-dir $WORKSPACE --test quassel/quassel | |
- name: Package | |
run: python $CRAFT --no-cache --src-dir $WORKSPACE --package quassel/quassel | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v2 | |
with: | |
name: Windows | |
path: ${{ github.workspace }}/packages/* | |
# ------------------------------------------------------------------------------------------------------------------------------------------ | |
post-build: | |
name: Post-Build | |
runs-on: ubuntu-latest | |
needs: [ build-linux, build-macos, build-windows ] | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
steps: | |
- name: Check out source code | |
uses: actions/checkout@v2 | |
with: | |
submodules: recursive | |
- name: Fetch tag information | |
if: startsWith(github.ref, 'refs/tags/') | |
run: git fetch -f origin $GITHUB_REF:$GITHUB_REF | |
- name: Download artifacts | |
uses: actions/download-artifact@v2 | |
with: | |
path: artifacts | |
- name: List artifacts | |
run: ls -lhR artifacts | |
- name: Check artifacts | |
run: | | |
# Sanity check: We should have exactly 5 files matching the given patterns | |
[[ 5 -eq $(find artifacts/ \( -type f -name 'Quassel*.dmg' -o -name 'quassel*.exe' -o -name 'quassel*.7z' \) -printf '.' | wc -c) ]] | |
- name: Create release notes | |
if: startsWith(github.ref, 'refs/tags/') | |
run: | | |
# Use the tag's annotation as release notes | |
TAGNAME=$(git rev-parse --abbrev-ref $GITHUB_REF) | |
MESSAGE=$(git tag -l --format='%(contents)' $TAGNAME | perl -ne 'print if not /-----BEGIN PGP SIGNATURE-----/../-----END PGP SIGNATURE-----/') | |
echo -e "Quassel $TAGNAME\n\n$MESSAGE" > release_notes.txt | |
- name: Prepare source archive | |
if: startsWith(github.ref, 'refs/tags/') | |
run: | | |
mkdir assets | |
TAGNAME=$(git rev-parse --abbrev-ref $GITHUB_REF) | |
PREFIX=quassel-$TAGNAME/ | |
TAR_BASE=assets/quassel-$TAGNAME | |
git archive --format=tar --prefix=$PREFIX -o $TAR_BASE.tar $TAGNAME | |
git submodule foreach --recursive "git archive --prefix=$PREFIX -o $TAR_BASE-\$sha1.tar HEAD" | |
# Workaround for https://lists.gnu.org/archive/html/bug-tar/2008-08/msg00002.html | |
for t in $TAR_BASE-*.tar; do tar --concatenate --file=$TAR_BASE.tar.xz "$t"; done | |
xz $TAR_BASE.tar | |
rm $TAR_BASE-*.tar | |
- name: Prepare packages for release | |
if: startsWith(github.ref, 'refs/tags/') | |
run: | | |
TAGNAME=$(git rev-parse --abbrev-ref $GITHUB_REF) | |
for type in Client Core Mono; do | |
mv artifacts/macOS/Quassel$type*.dmg assets/Quassel$type-macOS-$TAGNAME.dmg | |
done | |
mv artifacts/Windows/quassel-*.exe assets/quassel-windows-setup-$TAGNAME.exe | |
mv artifacts/Windows/quassel-*.7z assets/quassel-windows-$TAGNAME.7z | |
- name: Create checksums for release assets | |
if: startsWith(github.ref, 'refs/tags/') | |
run: find assets/ -type f -execdir sh -c 'sha256sum "$1" > "$1.sha256sum"' _ {} \; | |
- name: Create draft release | |
if: startsWith(github.ref, 'refs/tags/') | |
run: | | |
# The stock upload-release-asset action can only handle single files | |
# Instead, use the hub utility so we can upload all assets at once | |
assets=() | |
for asset in assets/*; do assets+=("-a" "$asset"); done | |
hub release create -d "${assets[@]}" -F release_notes.txt `git rev-parse --abbrev-ref $GITHUB_REF` |