ci: [mac] Update Xcode version to Qt 5 supported
[quassel.git] / .github / workflows / main.yml
1 # Workflow that builds Quassel on various Linux distros, and creates packages for both Windows and macOS.
2 # For tagged pushes, a draft release is automatically created, using the tag message as release description
3 # and attaching Windows and macOS builds, as well as the source archive.
4 name: Quassel CI
5
6 on: [ push, pull_request ]
7
8 defaults:
9   run:
10     shell: bash
11
12 jobs:
13
14 # ------------------------------------------------------------------------------------------------------------------------------------------
15   build-linux:
16     name: Linux
17     runs-on: ubuntu-latest
18     container: quassel/quassel-build-env:${{ matrix.dist }}
19     strategy:
20       fail-fast: false
21       matrix:
22         dist: [ debian-stable, debian-testing, ubuntu-xenial, ubuntu-bionic, ubuntu-focal, ubuntu-groovy ]
23         cxx: [ 'g++', 'clang++' ]
24         with-kde: [ -DWITH_KDE=ON ]
25         extra-options: [ -DWITH_WEBENGINE=ON ]
26         include:
27           # Baseline, test more combinations
28           - dist: ubuntu-xenial
29             with-kde: -DWITH_KDE=OFF
30             extra-options: -DWITH_WEBKIT=ON
31           - dist: ubuntu-xenial
32             with-kde: -DWITH_KDE=ON
33             extra-options: -DWITH_WEBKIT=ON
34         exclude:
35           # QtWebEngine is not available on Xenial
36           - dist: ubuntu-xenial
37             extra-options: -DWITH_WEBENGINE=ON
38     env:
39         CCACHE_BASEDIR: ${{ github.workspace }}
40         CCACHE_DIR: ${{ github.workspace }}/ccache
41         CCACHE_MAXSIZE: 100M
42         CXX: ${{ matrix.cxx }}
43
44     steps:
45     - name: Check out source code
46       uses: actions/checkout@v2
47
48     - name: Get timestamp
49       id: get-timestamp
50       run: echo "::set-output name=timestamp::$(date -u "+%F-%R")"
51
52     - name: Setup ccache
53       uses: actions/cache@v2
54       with:
55         path: ${{ github.workspace }}/ccache
56         key: ${{ matrix.dist }}-ccache-${{ steps.get-timestamp.outputs.timestamp }}
57         restore-keys: |
58              ${{ matrix.dist }}-ccache-
59
60     - name: Zero ccache stats
61       run: ccache -z
62
63     - name: Configure
64       run: |
65         mkdir build
66         cd build && cmake $GITHUB_WORKSPACE \
67                           -GNinja \
68                           -DCMAKE_BUILD_TYPE=Release \
69                           -DBUILD_TESTING=ON \
70                           -DFATAL_WARNINGS=ON \
71                           ${{ matrix.with-kde }} \
72                           ${{ matrix.extra-options }}
73
74     - name: Build
75       run: cd build && ninja
76
77     - name: Run tests
78       run: cd build && ctest
79
80     - name: Install
81       run: cd build && DESTDIR=$GITHUB_WORKSPACE/image ninja install
82
83     - name: Print ccache stats
84       run: ccache -s
85
86 # ------------------------------------------------------------------------------------------------------------------------------------------
87   build-macos:
88     name: macOS
89     runs-on: macos-latest
90     env:
91       CCACHE_BASEDIR: ${{ github.workspace }}
92       CCACHE_DIR: ${{ github.workspace }}/ccache
93       CCACHE_MAXSIZE: 100M
94
95     steps:
96     - name: Select Xcode version
97       uses: maxim-lobanov/setup-xcode@v1
98       with:
99         # Newer Xcode versions may not officially be supported by Qt
100         # Check https://doc.qt.io/qt-5/macos.html
101         xcode-version: '12.4.0'
102
103     - name: Check out source code
104       uses: actions/checkout@v2
105       with:
106         fetch-depth: 0  # so git-describe works
107
108     - name: Fetch tag information
109       if: startsWith(github.ref, 'refs/tags/')
110       run: git fetch -f origin $GITHUB_REF:$GITHUB_REF
111
112     - name: Install dependencies
113       # Skip "brew update" as it can trigger 50+ minutes of updating.
114       # GitHub Actions intentionally disables the default auto-update on their
115       # macOS CI images (and macOS CI images usually update once a week).
116       #
117       # See https://github.com/actions/virtual-environments/issues/2173
118       # > We've set no auto-update intentionally here [...]
119       # And https://github.com/microsoft/appcenter/issues/293
120       #
121       # If Homebrew begins failing in the future due to out-of-date versions,
122       # it can be re-enabled here as follows...
123       # run: brew update && [below command]
124       run: brew install boost ccache ninja qca qt@5
125
126     - name: Get timestamp
127       id: get-timestamp
128       run: echo "::set-output name=timestamp::$(date -u "+%F-%R")"
129
130     - name: Setup ccache
131       uses: actions/cache@v2
132       with:
133         path: ${{ github.workspace }}/ccache
134         key: macos-ccache-${{ steps.get-timestamp.outputs.timestamp }}
135         restore-keys: |
136              macos-ccache-
137
138     - name: Zero ccache stats
139       run: ccache -z
140
141     - name: Configure
142       run: |
143         mkdir build
144         cd build && cmake $GITHUB_WORKSPACE \
145                           -GNinja \
146                           -DWANT_CORE=ON \
147                           -DWANT_QTCLIENT=ON \
148                           -DWANT_MONO=ON \
149                           -DCMAKE_PREFIX_PATH=$(brew --prefix)/opt/qt@5 \
150                           -DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/bundles \
151                           -DCMAKE_BUILD_TYPE=Release \
152                           -DBUILD_TESTING=ON \
153                           -DFATAL_WARNINGS=OFF \
154                           -DENABLE_SHARED=OFF \
155                           -DBUNDLE=ON \
156
157     - name: Build
158       run: cd build && ninja
159
160     - name: Run tests
161       run: cd build && ctest
162
163     - name: Install
164       run: cd build && ninja install
165
166     - name: Print ccache stats
167       run: ccache -s
168
169     - name: Upload artifacts
170       uses: actions/upload-artifact@v2
171       with:
172         name: macOS
173         path: ${{ github.workspace }}/bundles/*.dmg
174
175 # ------------------------------------------------------------------------------------------------------------------------------------------
176   build-windows:
177     name: Windows
178     runs-on: windows-latest
179     env:
180       WORKSPACE: ${{ github.workspace }}
181       CRAFT: /C/CraftMaster/windows-msvc2019_64-cl/craft/bin/craft.py
182
183     steps:
184     - name: Check out source code
185       uses: actions/checkout@v2
186       with:
187         fetch-depth: 0  # so git-describe works
188
189     - name: Fetch tag information
190       if: startsWith(github.ref, 'refs/tags/')
191       run: git fetch -f origin $GITHUB_REF:$GITHUB_REF
192
193     - name: Clone CraftMaster
194       run: git clone --depth=1 https://invent.kde.org/kde/craftmaster.git /C/CraftMaster/CraftMaster
195
196     - name: Configure CraftMaster
197       run: python /C/CraftMaster/CraftMaster/CraftMaster.py --config $WORKSPACE/.craftsettings.ini --variables "WORKSPACE=$WORKSPACE"
198
199     - name: Add Quassel blueprint
200       run: python $CRAFT --add-blueprint-repository https://github.com/quassel/craft-blueprints-quassel.git
201
202     - name: Install NSIS
203       run: python $CRAFT dev-utils/nsis
204
205     - name: Install dependencies
206       run: python $CRAFT --install-deps quassel/quassel
207
208     - name: Build
209       run: python $CRAFT --no-cache --src-dir $WORKSPACE quassel/quassel
210
211     - name: Run tests
212       run: python $CRAFT --no-cache --src-dir $WORKSPACE --test quassel/quassel
213
214     - name: Package
215       run: python $CRAFT --no-cache --src-dir $WORKSPACE --package quassel/quassel
216
217     - name: Upload artifacts
218       uses: actions/upload-artifact@v2
219       with:
220         name: Windows
221         path: ${{ github.workspace }}/packages/*
222
223 # ------------------------------------------------------------------------------------------------------------------------------------------
224   post-build:
225     name: Post-Build
226     runs-on: ubuntu-latest
227     needs: [ build-linux, build-macos, build-windows ]
228     env:
229       GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
230
231     steps:
232     - name: Check out source code
233       uses: actions/checkout@v2
234
235     - name: Fetch tag information
236       if: startsWith(github.ref, 'refs/tags/')
237       run: git fetch -f origin $GITHUB_REF:$GITHUB_REF
238
239     - name: Download artifacts
240       uses: actions/download-artifact@v2
241       with:
242         path: artifacts
243
244     - name: List artifacts
245       run: ls -lhR artifacts
246
247     - name: Check artifacts
248       run: |
249         # Sanity check: We should have exactly 5 files matching the given patterns
250         [[ 5 -eq $(find artifacts/ \( -type f -name 'Quassel*.dmg' -o -name 'quassel*.exe' -o -name 'quassel*.7z' \) -printf '.' | wc -c) ]]
251
252     - name: Create release notes
253       if: startsWith(github.ref, 'refs/tags/')
254       run: |
255         # Use the tag's annotation as release notes
256         TAGNAME=$(git rev-parse --abbrev-ref $GITHUB_REF)
257         MESSAGE=$(git tag -l --format='%(contents)' $TAGNAME | perl -ne 'print if not /-----BEGIN PGP SIGNATURE-----/../-----END PGP SIGNATURE-----/')
258         echo -e "Quassel $TAGNAME\n\n$MESSAGE" > release_notes.txt
259
260     - name: Prepare source archive
261       if: startsWith(github.ref, 'refs/tags/')
262       run: |
263         mkdir assets
264         TAGNAME=$(git rev-parse --abbrev-ref $GITHUB_REF)
265         git archive --format=tar --prefix=quassel-$TAGNAME/ $TAGNAME | xz > assets/quassel-$TAGNAME.tar.xz
266
267     - name: Prepare packages for release
268       if: startsWith(github.ref, 'refs/tags/')
269       run: |
270         TAGNAME=$(git rev-parse --abbrev-ref $GITHUB_REF)
271         for type in Client Core Mono; do
272           mv artifacts/macOS/Quassel$type*.dmg assets/Quassel$type-macOS-$TAGNAME.dmg
273         done
274         mv artifacts/Windows/quassel-*.exe assets/quassel-windows-setup-$TAGNAME.exe
275         mv artifacts/Windows/quassel-*.7z assets/quassel-windows-$TAGNAME.7z
276
277     - name: Create checksums for release assets
278       if: startsWith(github.ref, 'refs/tags/')
279       run: find assets/ -type f -execdir sh -c 'sha256sum "$1" > "$1.sha256sum"' _ {} \;
280
281     - name: Create draft release
282       if: startsWith(github.ref, 'refs/tags/')
283       run: |
284         # The stock upload-release-asset action can only handle single files
285         # Instead, use the hub utility so we can upload all assets at once
286         assets=()
287         for asset in assets/*; do assets+=("-a" "$asset"); done
288         hub release create -d "${assets[@]}" -F release_notes.txt `git rev-parse --abbrev-ref $GITHUB_REF`