You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
392 lines
13 KiB
392 lines
13 KiB
name: Linux
|
|
|
|
on:
|
|
workflow_call:
|
|
workflow_dispatch:
|
|
|
|
env:
|
|
APP_ID: io.github.nuttyartist.notes
|
|
|
|
jobs:
|
|
deb:
|
|
name: deb (${{ matrix.build-type }}, Qt ${{ matrix.qt-version-major }}, ${{ matrix.image }})
|
|
runs-on: ubuntu-latest
|
|
container:
|
|
image: zjeffer/notes:${{ matrix.image }}
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
# Ubuntu's release cycle: https://wiki.ubuntu.com/Releases
|
|
- image: ubuntu-20_04
|
|
qt-version-major: 5
|
|
build-type: release
|
|
|
|
- image: ubuntu-22_04
|
|
qt-version-major: 6
|
|
build-type: release
|
|
|
|
- image: ubuntu-23_10
|
|
qt-version-major: 6
|
|
build-type: release
|
|
steps:
|
|
- name: Setup git configuration
|
|
# workaround for "detected dubious ownership in repository" git error: https://github.com/actions/checkout/issues/1169
|
|
run: git config --global --add safe.directory "${PWD}"
|
|
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
with:
|
|
submodules: recursive
|
|
|
|
- name: Set up variables
|
|
shell: bash
|
|
id: vars
|
|
run: |
|
|
set -x
|
|
distro_id=$(grep -oPm1 '^ID="?\K[^"]+' /etc/os-release)
|
|
if [ -z "${distro_id}" ]
|
|
then
|
|
echo 'Fatal: Failed to extract distro ID from /etc/os-release'
|
|
exit 1
|
|
fi
|
|
distro_codename=$(grep -oPm1 '^VERSION_CODENAME="?\K[^"]+' /etc/os-release)
|
|
if [ -z "${distro_codename}" ]
|
|
then
|
|
echo 'Fatal: Failed to extract distro codename from /etc/os-release'
|
|
exit 1
|
|
fi
|
|
echo "distro_name=${distro_id}-${distro_codename}" >> "${GITHUB_OUTPUT}"
|
|
|
|
- name: Setup GCC problem matcher
|
|
uses: ammaraskar/gcc-problem-matcher@0.3.0
|
|
|
|
- name: Build (${{ matrix.build-type }})
|
|
env:
|
|
VERBOSE: 1
|
|
run: |
|
|
cmake --warn-uninitialized --warn-unused-vars \
|
|
-B build \
|
|
-DCMAKE_BUILD_TYPE=${{ matrix.build-type }} \
|
|
-DGIT_REVISION=${{ github.ref_type != 'tag' && 'ON' || 'OFF' }} \
|
|
-DCMAKE_INSTALL_PREFIX=/usr \
|
|
-DPRO_VERSION=OFF
|
|
cmake --build build --parallel $(nproc)
|
|
|
|
- name: Create deb package
|
|
run: |
|
|
cd build
|
|
cpack -G DEB
|
|
|
|
- name: Grab deb package name
|
|
id: deb
|
|
shell: bash
|
|
run: |
|
|
set -x
|
|
if ! path=$(find build/ -maxdepth 1 -name '*.deb' -print -quit)
|
|
then
|
|
echo 'Fatal: Unable to find deb package'
|
|
exit 1;
|
|
fi
|
|
echo "name=$(basename "${path%.*}")" >> "${GITHUB_OUTPUT}"
|
|
echo "path=${path}" >> "${GITHUB_OUTPUT}"
|
|
|
|
- name: Run lintian
|
|
run: |
|
|
lintian '${{ steps.deb.outputs.path }}'
|
|
|
|
- name: Upload deb package
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
if-no-files-found: error
|
|
name: ${{ steps.deb.outputs.name }}-qt${{ matrix.qt-version-major }}-${{ steps.vars.outputs.distro_name }}-${{ matrix.build-type }}
|
|
path: ${{ steps.deb.outputs.path }}
|
|
|
|
rpm:
|
|
name: rpm (${{ matrix.build-type }}, Qt ${{ matrix.qt-version-major }}, ${{ matrix.image }})
|
|
runs-on: ubuntu-latest
|
|
container: zjeffer/notes:${{ matrix.image }}
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- # Fedora's release cycle: https://docs.fedoraproject.org/en-US/releases/lifecycle/
|
|
image: fedora
|
|
qt-version-major: 6
|
|
build-type: release
|
|
|
|
- image: opensuse
|
|
qt-version-major: 6
|
|
build-type: release
|
|
steps:
|
|
- name: Setup git configuration
|
|
# workaround for "detected dubious ownership in repository" git error: https://github.com/actions/checkout/issues/1169
|
|
run: git config --global --add safe.directory "${PWD}"
|
|
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
with:
|
|
submodules: recursive
|
|
|
|
- name: Set up variables
|
|
shell: bash
|
|
id: vars
|
|
run: |
|
|
set -x
|
|
distro_id=$(grep -oPm1 '^ID="?\K[^"]+' /etc/os-release)
|
|
if [ -z "${distro_id}" ]
|
|
then
|
|
echo 'Failed to extract distro ID from /etc/os-release.'
|
|
exit 1
|
|
fi
|
|
version_id=$(grep -oPm1 '^VERSION_ID="?\K[^"]+' /etc/os-release)
|
|
if [ -z "${version_id}" ]
|
|
then
|
|
echo 'Failed to extract version id from /etc/os-release.'
|
|
exit 1
|
|
fi
|
|
echo "distro_name=${distro_id}-${version_id}" >> "${GITHUB_OUTPUT}"
|
|
|
|
- name: Setup GCC problem matcher
|
|
uses: ammaraskar/gcc-problem-matcher@0.3.0
|
|
|
|
- name: Build (${{ matrix.build-type }})
|
|
env:
|
|
VERBOSE: 1
|
|
# openSUSE defaults to GCC 7, which doesn't support the filesystem library from C++17,
|
|
# and causes trouble compiling for Qt 6. So we have to manully specify GCC 10 instead.
|
|
CXX: ${{ startsWith(matrix.image, 'opensuse') && 'g++-10' || 'g++' }}
|
|
run: |
|
|
cmake --warn-uninitialized --warn-unused-vars \
|
|
-B build \
|
|
-DCMAKE_BUILD_TYPE=${{ matrix.build-type }} \
|
|
-DGIT_REVISION=${{ github.ref_type != 'tag' && 'ON' || 'OFF' }} \
|
|
-DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \
|
|
-DUPDATE_CHECKER=OFF \
|
|
-DUSE_QT_VERSION=${{ matrix.qt-version-major }} \
|
|
-DPRO_VERSION=OFF
|
|
cmake --build build --parallel $(nproc)
|
|
|
|
- name: Create rpm package
|
|
run: |
|
|
cd build
|
|
cpack -G RPM
|
|
|
|
- name: Grab rpm package name
|
|
id: rpm
|
|
shell: bash
|
|
run: |
|
|
set -x
|
|
if ! path=$(find build/ -maxdepth 1 -name '*.rpm' -print -quit)
|
|
then
|
|
echo 'Fatal: Unable to find rpm package!'
|
|
exit 1;
|
|
fi
|
|
echo "name=$(basename "${path%.*}")" >> "${GITHUB_OUTPUT}"
|
|
echo "path=${path}" >> "${GITHUB_OUTPUT}"
|
|
|
|
- name: Run rpmlint
|
|
run: |
|
|
rpmlint '${{ steps.rpm.outputs.path }}'
|
|
|
|
- name: Upload rpm package
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
if-no-files-found: error
|
|
name: ${{ steps.rpm.outputs.name }}-qt${{ matrix.qt-version-major }}-${{ steps.vars.outputs.distro_name }}-${{ matrix.build-type }}
|
|
path: ${{ steps.rpm.outputs.path }}
|
|
|
|
# Build the AppImage using official Qt releases, downloaded by aqtinstall.
|
|
# This is also done for macOS and Windows, just to make sure we use the exact same Qt version across all three OSes.
|
|
#
|
|
# NOTE: This job uses a fixed Qt version (set in the 'qt-version' key below)!
|
|
# So, remember to keep it updated whenever a new Qt version is available on aqtinstall.
|
|
appimage-aqtinstall:
|
|
name: AppImage (${{ matrix.build-type }}, Qt ${{ matrix.qt-version }}, ${{ matrix.image }})
|
|
runs-on: ${{ matrix.os }}
|
|
container:
|
|
image: zjeffer/notes:${{ matrix.image }}
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- os: ubuntu-22.04
|
|
build-type: release
|
|
qt-version: 5.15.2
|
|
image: ubuntu-aqtinstall-5
|
|
|
|
- os: ubuntu-22.04
|
|
build-type: release
|
|
qt-version: 6.4.3
|
|
image: ubuntu-aqtinstall-6
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
with:
|
|
submodules: recursive
|
|
|
|
- name: Setup variables
|
|
shell: bash
|
|
id: vars
|
|
run: |
|
|
set -x
|
|
version=$(grep -oPm1 '\bAPP_VERSION +\K[^)]+' CMakeLists.txt)
|
|
if [ -z "${version}" ]
|
|
then
|
|
echo 'Failed to extract app version from CMakeLists.txt.'
|
|
exit 1
|
|
fi
|
|
if [ '${{ github.ref_type }}' != 'tag' ]
|
|
then
|
|
version="${version}+g${GITHUB_SHA::7}"
|
|
fi
|
|
artifact_name="Notes_${version}-Qt${{ matrix.qt-version }}-x86_64"
|
|
if [ '${{ matrix.build-type }}' == 'debug' ]
|
|
then
|
|
file_name="${artifact_name}-debug.AppImage"
|
|
else
|
|
file_name="${artifact_name}.AppImage"
|
|
fi
|
|
echo "version=${version}" >> "${GITHUB_OUTPUT}"
|
|
echo "artifact_name=${artifact_name}" >> "${GITHUB_OUTPUT}"
|
|
echo "file_name=${file_name}" >> "${GITHUB_OUTPUT}"
|
|
|
|
# TODO: Figure out why this error only occurs on the Linux container when building with -DGIT_REVISION=ON
|
|
# The error: fatal: detected dubious ownership in repository
|
|
- name: Prevent git's dubious ownership message
|
|
if: github.ref_type != 'tag'
|
|
run: |
|
|
git config --global --add safe.directory "${PWD}"
|
|
|
|
- name: Build (${{ matrix.build-type }})
|
|
env:
|
|
VERBOSE: 1
|
|
run: |
|
|
cmake --warn-uninitialized --warn-unused-vars \
|
|
-B build \
|
|
-DCMAKE_BUILD_TYPE=${{ matrix.build-type }} \
|
|
-DGIT_REVISION=${{ github.ref_type != 'tag' && 'ON' || 'OFF' }} \
|
|
-DCMAKE_INSTALL_PREFIX=/usr \
|
|
-DPRO_VERSION=OFF
|
|
cmake --build build --parallel $(nproc)
|
|
|
|
- name: (FIXME) Run qmllint
|
|
if: startsWith(matrix.qt-version, '6.')
|
|
run: |
|
|
cmake --build build --target all_qmllint || true
|
|
|
|
- name: Install (${{ matrix.build-type }})
|
|
run: |
|
|
make -C build DESTDIR=Notes install
|
|
|
|
- name: Setup linuxdeploy
|
|
run: |
|
|
cd build
|
|
curl -fLO --retry 10 https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage
|
|
chmod +x linuxdeploy-x86_64.AppImage
|
|
|
|
- name: Setup Qt plugin for linuxdeploy
|
|
run: |
|
|
cd build
|
|
curl -fLO --retry 10 https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage
|
|
chmod +x linuxdeploy-plugin-qt-x86_64.AppImage
|
|
|
|
- name: Deploy (${{ matrix.build-type }})
|
|
env:
|
|
APPIMAGE_EXTRACT_AND_RUN: 1
|
|
run: |
|
|
export QML_SOURCES_PATHS="${PWD}/src/qml"
|
|
cd build
|
|
./linuxdeploy-x86_64.AppImage --appdir Notes --plugin qt
|
|
|
|
- name: Remove unnecessary Qt plugins and libraries
|
|
shell: bash
|
|
run: |
|
|
set -x
|
|
set -e
|
|
cd build/Notes
|
|
if [[ '${{ matrix.qt-version }}' == 5.* ]]
|
|
then
|
|
# The bearer plugin has caused problems for us in the past. Plus, it was removed altogether in Qt 6.
|
|
rm -rv usr/plugins/bearer
|
|
fi
|
|
# We only use the SQLite Qt driver, so it's fine to delete others.
|
|
rm -v usr/plugins/sqldrivers/libqsqlodbc.so
|
|
rm -v usr/plugins/sqldrivers/libqsqlpsql.so
|
|
if [[ '${{ matrix.qt-version }}' == 6.* ]]
|
|
then
|
|
# The Qt 6 build also has a MySQL Qt driver we don't use.
|
|
rm -v usr/plugins/sqldrivers/libqsqlmysql.so
|
|
rm -v usr/lib/libmysqlclient.so.*
|
|
fi
|
|
|
|
- name: Validate AppStream metadata
|
|
if: matrix.image != 'ubuntu:20.04'
|
|
run: |
|
|
cd build/Notes
|
|
appstreamcli validate --verbose 'usr/share/metainfo/${{ env.APP_ID }}.metainfo.xml'
|
|
|
|
- name: Validate desktop file
|
|
run: |
|
|
cd build/Notes
|
|
desktop-file-validate 'usr/share/applications/${{ env.APP_ID }}.desktop'
|
|
|
|
- name: Build AppImage (${{ matrix.build-type }})
|
|
env:
|
|
APPIMAGE_EXTRACT_AND_RUN: 1
|
|
run: |
|
|
cd build
|
|
export VERSION='${{ steps.vars.outputs.version }}'
|
|
./linuxdeploy-x86_64.AppImage --appdir Notes --output appimage
|
|
mv -v Notes*.AppImage '${{ steps.vars.outputs.file_name }}'
|
|
|
|
- name: Upload AppImage artifact (${{ matrix.build-type }})
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
if-no-files-found: error
|
|
name: ${{ steps.vars.outputs.artifact_name }}-${{ runner.os }}-${{ matrix.build-type }}
|
|
path: build/${{ steps.vars.outputs.file_name }}
|
|
|
|
snap:
|
|
name: snap
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
with:
|
|
submodules: recursive
|
|
|
|
- name: Install snapcraft
|
|
run: |
|
|
sudo snap install snapcraft --classic
|
|
|
|
- name: Set up LXD
|
|
run: |
|
|
sudo usermod -a -G lxd "${USER}"
|
|
sudo lxd init --auto
|
|
sudo iptables -P FORWARD ACCEPT
|
|
|
|
- name: Build
|
|
run: |
|
|
sg lxd -c 'snap run snapcraft -v'
|
|
|
|
- name: Grab snap package name
|
|
id: snap
|
|
shell: bash
|
|
run: |
|
|
set -x
|
|
if ! path=$(find . -maxdepth 1 -name '*.snap' -print -quit)
|
|
then
|
|
echo 'Fatal: Unable to find snap package'
|
|
exit 1
|
|
fi
|
|
echo "name=$(basename "${path%.*}")" >> "${GITHUB_OUTPUT}"
|
|
echo "path=${path}" >> "${GITHUB_OUTPUT}"
|
|
|
|
- name: Upload snap package
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
if-no-files-found: error
|
|
name: ${{ steps.snap.outputs.name }}.snap
|
|
path: ${{ steps.snap.outputs.path }}
|