Graduately/.github/workflows/build.yml
pepaskopec-blip 70119bf373 Skip the retired Android SDK tools package in CI.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-18 10:57:59 +02:00

232 lines
7.2 KiB
YAML

name: Build
# Packages are published to the `builds` branch instead of to a GitHub
# Release, so everything the installers and the in-app updater fetch comes
# straight from the repository and always matches what is on main.
on:
push:
branches:
- main
# Nothing to rebuild when only documentation changed.
paths-ignore:
- "README.md"
- "LICENSE"
- ".gitignore"
workflow_dispatch:
permissions:
contents: write
jobs:
linux:
name: Linux AppImage
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
build-essential pkg-config curl \
libgtk-4-dev librsvg2-dev \
desktop-file-utils \
appstream
- name: Build AppImage
env:
COMMIT: ${{ github.sha }}
run: |
chmod +x scripts/bundle-linux.sh
./scripts/bundle-linux.sh
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: maturita-linux
path: dist/maturita-linux-*.AppImage
windows:
name: Windows zip
runs-on: windows-latest
defaults:
run:
shell: msys2 {0}
steps:
- uses: actions/checkout@v4
- uses: msys2/setup-msys2@v2
with:
msystem: UCRT64
update: true
install: >-
make
zip
mingw-w64-ucrt-x86_64-gcc
mingw-w64-ucrt-x86_64-gtk4
mingw-w64-ucrt-x86_64-pkg-config
mingw-w64-ucrt-x86_64-make
- name: Build and bundle
env:
COMMIT: ${{ github.sha }}
run: |
make bundle
cd dist
zip -qry ../maturita-windows-x64.zip .
cd ..
mkdir -p dist-out
mv maturita-windows-x64.zip dist-out/
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: maturita-windows
path: dist-out/maturita-windows-x64.zip
macos:
name: macOS app
runs-on: macos-14
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: |
brew install gtk4 pkg-config
# Developer ID lives in repo secrets. Without it the bundle is only
# ad-hoc signed and Gatekeeper still blocks downloaded copies.
# Do not use `secrets` in `if:` — GitHub rejects the whole workflow.
- name: Import Developer ID certificate
env:
MACOS_CERTIFICATE: ${{ secrets.MACOS_CERTIFICATE }}
MACOS_CERTIFICATE_PASSWORD: ${{ secrets.MACOS_CERTIFICATE_PASSWORD }}
run: |
set -euo pipefail
if [ -z "${MACOS_CERTIFICATE:-}" ]; then
echo "No Developer ID certificate; the bundle will be ad-hoc signed."
exit 0
fi
cert="$RUNNER_TEMP/certificate.p12"
keychain="$RUNNER_TEMP/signing.keychain-db"
pass="$(openssl rand -base64 32)"
echo "$MACOS_CERTIFICATE" | base64 --decode > "$cert"
security create-keychain -p "$pass" "$keychain"
security set-keychain-settings -lut 21600 "$keychain"
security unlock-keychain -p "$pass" "$keychain"
security import "$cert" -k "$keychain" \
-P "$MACOS_CERTIFICATE_PASSWORD" \
-T /usr/bin/codesign -T /usr/bin/security
security set-key-partition-list -S apple-tool:,apple: -s \
-k "$pass" "$keychain"
security list-keychains -d user -s "$keychain" \
$(security list-keychains -d user | tr -d '"')
rm -f "$cert"
- name: Build .app zip
env:
COMMIT: ${{ github.sha }}
MACOS_SIGN_IDENTITY: ${{ secrets.MACOS_SIGN_IDENTITY }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }}
APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }}
APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }}
run: |
chmod +x scripts/bundle-macos.sh
./scripts/bundle-macos.sh
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: maturita-macos
path: dist/maturita-macos-*.zip
android:
name: Android APK
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
# v3 defaults to the retired `tools` package, which sdkmanager no longer
# serves. Request only packages that still exist.
- uses: android-actions/setup-android@v3
with:
packages: platform-tools
- name: Install Android SDK platform
run: |
sdkmanager --install "platforms;android-37" "build-tools;36.0.0"
if [ -d "$ANDROID_HOME/platforms/android-37.0" ] && [ ! -e "$ANDROID_HOME/platforms/android-37" ]; then
ln -s android-37.0 "$ANDROID_HOME/platforms/android-37"
fi
- uses: gradle/actions/setup-gradle@v4
with:
build-root-directory: android
- name: Extract content and build APK
env:
COMMIT: ${{ github.sha }}
run: |
python3 scripts/extract-android-content.py
chmod +x android/gradlew
cd android
./gradlew :app:assembleRelease --no-daemon
mkdir -p ../dist-android
cp app/build/outputs/apk/release/app-release.apk \
../dist-android/maturita-android.apk
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: maturita-android
path: dist-android/maturita-android.apk
publish:
name: Publish to builds branch
needs: [linux, windows, macos, android]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Download artifacts
uses: actions/download-artifact@v4
with:
path: staged
merge-multiple: true
- name: Collect installers
run: |
chmod +x installers/pack-installer-zips.sh
./installers/pack-installer-zips.sh
cp installers/maturita-installer-linux.sh staged/
cp installers/maturita-installer-windows.cmd staged/
cp installers/maturita-installer-*.zip staged/
# The updater downloads this to see whether it is behind.
echo "${{ github.sha }}" > staged/VERSION
# The branch is rewritten from scratch every time rather than added to,
# so the repository keeps one copy of the packages instead of a new
# ~70 MB set per commit.
- name: Push to builds branch
run: |
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
rm -rf .git/index.lock
git checkout --orphan builds
git rm -rf --cached . >/dev/null
find . -maxdepth 1 ! -name . ! -name .git ! -name staged \
-exec rm -rf {} +
mv staged/* .
rmdir staged
ls -la
git add -A
git commit -q -m "Build from ${{ github.sha }}"
git push -f origin builds