-
Notifications
You must be signed in to change notification settings - Fork 108
306 lines (279 loc) · 12.1 KB
/
ci.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
name: CI
on:
push:
pull_request:
types: [opened, reopened]
defaults:
run:
shell: bash
# A note on bash code style (specifically if's)
# - No attempt to be POSIX-compliant, it's Bash (4.x+) here
# - In if's, use [[ ... ]] instead of [ ... ]; BUT quote strings around and next
# to ${{ }} expansions to make it clear those are strings and not,
# accidentally, numbers
# - Quotes: use "" only where shell "$VARIABLES" should be expanded, everywhere
# else '' is the way to go; ${{ }} is expanded before even feeding the script
# to Bash, so always use single quotes (or no quotes - except if's, see above)
# around them
jobs:
Prepare:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.generate.outputs.version }}
reftype: ${{ steps.generate.outputs.reftype }}
steps:
- id: generate
run: |
IFS=/ read -r ign type name merge <<<'${{ github.ref }}' # leading refs is (ign)ored
case $type in
heads) VERSION="${name:+$name-}ci${{ github.run_number }}" ;;
pull) VERSION="merge$name" ;;
tags) VERSION="$name" ;;
*) VERSION='ci{{ github.run_number }}'
esac
echo "Version string: $VERSION, ref type $type"
echo "version=$VERSION" >>$GITHUB_OUTPUT
echo "reftype=$type" >>$GITHUB_OUTPUT
Build:
runs-on: ${{ matrix.os }}
needs: Prepare
strategy:
fail-fast: false
matrix:
os: [ ubuntu-24.04, macos-latest, windows-latest ]
qt-version: [ 6 ]
override-compiler: [ '', GCC ] # Defaults: MSVC on Windows, Clang elsewhere
composition: [ own-quotient, static, dynamic ]
exclude:
# Unsupported combinations
- os: windows-latest
composition: dynamic
- os: macos-latest
composition: dynamic
- os: windows-latest
override-compiler: GCC
- os: macos-latest
override-compiler: GCC
include:
- os: ubuntu-24.04
composition: own-quotient
check: appstream # Use one of faster paths for validation
- os: ubuntu-24.04
# Use the variation with external libQuotient to do CodeQL analysis
# (libQuotient is analysed in its own repo)
composition: dynamic
check: codeql
env:
QTKEYCHAIN_REF: 0.14.3
QUOTIENT_REF: dev
VERSION: ${{ needs.Prepare.outputs.version }}
steps:
- uses: actions/checkout@v4
with:
submodules: ${{ matrix.composition == 'own-quotient' }}
- name: Install Qt (non-Linux)
if: "!startsWith(matrix.os, 'ubuntu')"
uses: jurplel/install-qt-action@v3.0.0
with:
version: "6.6"
cache: true
cache-key-prefix: Qt
modules: 'qtmultimedia'
tools: "tools_ninja${{ startsWith(matrix.os, 'windows') && ' tools_opensslv3_x64' || '' }}"
# Install on Linux via apt to test against Qt coming from the package manager
- name: Install dependencies (Linux)
if: startsWith(matrix.os, 'ubuntu')
run: |
sudo apt-get -qq install libolm-dev ninja-build \
qt6-declarative-dev qt6-base-private-dev qt6-tools-dev qt6-tools-dev-tools \
qt6-l10n-tools qml6-module-qtquick-controls qt6-multimedia-dev qtkeychain-qt6-dev
- name: Setup environment
run: |
if [[ '${{ matrix.override-compiler }}' == 'GCC' ]]; then
echo "CC=gcc" >>$GITHUB_ENV
echo "CXX=g++" >>$GITHUB_ENV
elif [[ '${{ runner.os }}' == 'Linux' ]]; then
echo "CC=clang" >>$GITHUB_ENV
echo "CXX=clang++" >>$GITHUB_ENV
fi
echo "CMAKE_ARGS=-GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo \
${{ runner.os != 'Linux' && '-DCMAKE_MAKE_PROGRAM=$IQTA_TOOLS/Ninja/ninja' || '' }} \
-DCMAKE_PREFIX_PATH=~/.local \
${{ runner.os == 'macOS' && '-DOPENSSL_ROOT_DIR=`brew --prefix openssl`' ||
runner.os == 'Windows' && '-DOPENSSL_ROOT_DIR=$IQTA_TOOLS/OpenSSLv3/Win_x64/' || '' }} \
-DBUILD_SHARED_LIBS=${{ matrix.composition == 'dynamic' }}" \
>>$GITHUB_ENV
- name: Setup MSVC environment
uses: ilammy/msvc-dev-cmd@v1
if: startsWith(matrix.os, 'windows')
with:
arch: x64
- name: Get, build and install QtKeychain
if: "!startsWith(matrix.os, 'ubuntu')"
run: |
git clone --depth=1 -b $QTKEYCHAIN_REF https://github.com/frankosterfeld/qtkeychain
cd qtkeychain
cmake -S . -B build $CMAKE_ARGS -DBUILD_WITH_QT6=ON -DCMAKE_INSTALL_PREFIX=~/.local
cmake --build build --target install
if [[ '${{ matrix.composition }}' == 'dynamic' ]]; then
QTKEYCHAIN_SO_PATH=$(dirname $(find ~/.local/lib* -name 'libqt?keychain.so'))
test -n "$QTKEYCHAIN_SO_PATH"
fi
- name: Get, build and install Olm
if: "!startsWith(matrix.os, 'ubuntu')"
run: |
git clone --depth=1 https://gitlab.matrix.org/matrix-org/olm.git
cmake -S olm -B olm/build $CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=~/.local
cmake --build olm/build --target install
- name: Get, build and install libQuotient
if: matrix.composition != 'own-quotient'
run: |
git clone --depth=1 -b $QUOTIENT_REF https://github.com/quotient-im/libQuotient
cd libQuotient
cmake -S . -B build $CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=~/.local -DCMAKE_PREFIX_PATH=~/.local
cmake --build build --target install
if [[ '${{ matrix.composition }}' == 'dynamic' ]]; then
QUOTIENT_SO_PATH=$(dirname $(find ~/.local/lib* -name libQuotient*.so))
test -n "$QUOTIENT_SO_PATH"
echo "DEP_SO_PATH=$DEP_SO_PATH:$QUOTIENT_SO_PATH" >>$GITHUB_ENV
fi
- name: Initialize CodeQL tools
if: matrix.check == 'codeql'
uses: github/codeql-action/init@v3
with:
languages: cpp
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
- name: Configure Quaternion
run: |
if [[ '${{ runner.os }}' == 'Windows' ]]; then
# DESTDIR doesn't work (and is not necessary) on Windows, see
# https://cmake.org/cmake/help/latest/envvar/DESTDIR.html
# NB: Using ${{ runner.temp }} (or any absolute path?) for install
# root on Windows somehow confuses the shell code using it
# (because of the volume letter?) - therefore relative path here.
INSTALL_PATH=Quaternion-$VERSION
else
INSTALL_PATH=/usr
DESTDIR=$GITHUB_WORKSPACE/install
echo "DESTDIR=$DESTDIR" >>$GITHUB_ENV
fi
cmake -LA -S $GITHUB_WORKSPACE -B build $CMAKE_ARGS -DDEPLOY_VERBOSITY=$DEPLOY_VERBOSITY \
-DCMAKE_INSTALL_PREFIX=$INSTALL_PATH
echo "FULL_INSTALL_PATH=$DESTDIR$INSTALL_PATH" >>$GITHUB_ENV
- name: Build and install Quaternion
run: cmake --build build --target install
- name: Perform CodeQL analysis
if: matrix.check == 'codeql'
uses: github/codeql-action/analyze@v3
- name: Validate installation (Linux)
if: startsWith(matrix.os, 'ubuntu')
run: |
find $FULL_INSTALL_PATH -name 'quaternion_*.qm'
LD_LIBRARY_PATH=$DEP_SO_PATH \
$FULL_INSTALL_PATH/bin/quaternion -platform offscreen --version
if [[ '${{ matrix.check }}' == 'appstream' ]]; then
sudo apt-get -qq install flatpak
flatpak install --user -y https://flathub.org/repo/appstream/org.freedesktop.appstream-glib.flatpakref
flatpak run org.freedesktop.appstream-glib validate $FULL_INSTALL_PATH/share/metainfo/*.appdata.xml
fi
- name: Make a package
if: matrix.composition == 'own-quotient' && matrix.override-compiler == ''
id: package
env:
DEPLOY_VERBOSITY: 1
run: |
PACKAGE_STEM=quaternion-${{ needs.Prepare.outputs.version }}
case ${{ runner.os }} in
Linux)
sudo apt-get -qq install appstream libgstreamer-plugins-base1.0.0 \
libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 \
libxcb-render-util0 libxcb-shape0 libxcb-xinerama0 libxkbcommon-x11-0 \
libfuse2
# Make sure OpenSSL ends up in AppImage - linuxdeploy doesn't
# copy it automatically
cp /usr/lib/*/libssl.so.* $DESTDIR/usr/lib/
for f in linuxdeploy linuxdeploy-plugin-qt; do
wget -c -nv --directory-prefix=linuxdeploy \
https://github.com/linuxdeploy/$f/releases/download/continuous/$f-x86_64.AppImage
chmod +x linuxdeploy/$f-x86_64.AppImage
done
# NB: $OUTPUT is both used in this script further below and
# propagated by linuxdeploy to appimagetool as the target path
export OUTPUT=$PACKAGE_STEM.AppImage
QMAKE=/usr/bin/qmake${{ matrix.qt-version }} \
QML_SOURCES_PATHS=$GITHUB_WORKSPACE/client/qml \
linuxdeploy/linuxdeploy-x86_64.AppImage --appdir $DESTDIR \
--plugin qt --output appimage
;;
macOS)
OUTPUT=$PACKAGE_STEM.dmg
cmake --build build --target image
mv build/quaternion.dmg $OUTPUT
;;
Windows)
ls -l $FULL_INSTALL_PATH/quaternion.exe # Fail if it's not there
rm -rf $FULL_INSTALL_PATH/{include,lib/cmake,share,qmltooling}
OUTPUT=$PACKAGE_STEM.zip
7z a $OUTPUT $FULL_INSTALL_PATH
;;
esac
find $OUTPUT -size +10M
echo "path=$OUTPUT" >>$GITHUB_OUTPUT
- name: Store artefacts
if: steps.package.outputs.path != ''
uses: actions/upload-artifact@v4
with:
name: quaternion-${{ env.VERSION }}-${{ runner.os }}
path: ${{ steps.package.outputs.path }}
retention-days: 7
Publish:
runs-on: ubuntu-latest
needs: [ Prepare, Build ]
strategy:
fail-fast: false
matrix:
type: [ macOS, Linux, Windows ]
steps:
- name: Retrieve artefacts
id: get-package
uses: actions/download-artifact@v4
with:
name: quaternion-${{ needs.Prepare.outputs.version}}-${{ matrix.type }}
path: package
- name: Upload artefacts to Cloudsmith (interim builds)
if: needs.Prepare.outputs.reftype != 'tags' # Tags will go to GitHub Releases
uses: cloudsmith-io/action@v0.5.1
with:
api-key: '${{ secrets.CLOUDSMITH_API_KEY }}'
format: raw
owner: quotient
repo: quaternion
file: "`find package -name '*.*'`" # Globs don't seem to work: https://github.com/cloudsmith-io/action/issues/21
name: ${{ matrix.type }}
summary: CI builds of Quaternion, ${{ matrix.type }}
description: |
The builds produced by the continuous integration; only intended for testing,
not for production usage. No workability guarantees whatsoever.
version: ${{ needs.Prepare.outputs.version }}
republish: true
- name: Upload artefact to GitHub Releases (tag builds)
if: needs.Prepare.outputs.reftype == 'tags' && matrix.type != 'Linux'
uses: ncipollo/release-action@v1
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit: dev
artifacts: ${{ steps.get-package.outputs.download-path }}/*
# It tends to false-prerelease things but that's better than false-release them
prerelease: ${{ contains(needs.Prepare.outputs.version, '-') }}
allowUpdates: true
# Create as a draft, update without touching the draft flag
draft: true
omitDraftDuringUpdate: true
# Never write name and body - this action is to upload files only
name: ""
omitNameDuringUpdate: true
body: ""
omitBodyDuringUpdate: true