Skip to content

dmg

dmg #53

Workflow file for this run

name: Build app binaries
on:
push:
branches:
- main
- publish-demo-binaries
tags:
- "*"
pull_request:
env:
QT_VERSION: "6.8.3"
APP_NAME: subtivals
APP_LABEL: Subtivals
BUILD_TYPE: release
jobs:
# build-linux:
# runs-on: ubuntu-22.04
# environment: build
# strategy:
# matrix:
# demo: [false, true]
# steps:
# - name: Checkout repository
# uses: actions/checkout@v4
# with:
# fetch-depth: 0
# - name: Get latest tag version
# run: echo "PACKAGE_VERSION=$(git describe --tags --abbrev=0 || echo 0.0.0)" >> "$GITHUB_ENV"
# - name: Apply patch
# if: matrix.demo == true
# run: |
# git diff origin/main..origin/demo > demo.patch
# git apply demo.patch
# - name: Install dependencies
# run: |
# sudo apt update
# sudo apt install -y \
# build-essential cmake \
# patchelf dpkg fakeroot \
# squashfs-tools xz-utils \
# libfuse2 \
# file \
# desktop-file-utils \
# libgl1-mesa-dev \
# libx11-6 \
# libx11-xcb1 \
# libxcb1 \
# libxcb-util1 \
# libxcb-image0 \
# libxcb-shm0 \
# libxcb-icccm4 \
# libxcb-keysyms1 \
# libxcb-render0 \
# libxcb-render-util0 \
# libxcb-xinerama0 \
# libxcb-xkb1 \
# libxcb-cursor0 \
# libxcb-shape0 \
# libxkbcommon0 \
# libxkbcommon-x11-0 \
# libxcb-dpms0-dev \
# libxcb1-dev \
# libxcb-screensaver0-dev \
# libxrender1 \
# libglib2.0-0 \
# zlib1g \
# libssl3 \
# libpng16-16 \
# wget curl python3-pip imagemagick
# - name: Install Qt using aqtinstall
# run: |
# python3 -m pip install --upgrade pip
# python3 -m pip install "aqtinstall<4"
# python3 -m aqt install-qt --outputdir "$HOME/Qt" linux desktop "${QT_VERSION}" linux_gcc_64 -m qtwebsockets
# echo "$HOME/Qt/${QT_VERSION}/gcc_64/bin" >> "$GITHUB_PATH"
# - name: Download linuxdeployqt
# run: |
# wget https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage
# chmod +x linuxdeployqt-continuous-x86_64.AppImage
# sudo mv linuxdeployqt-continuous-x86_64.AppImage /usr/local/bin/linuxdeployqt
# - name: Configure and build
# run: |
# which qmake6
# qmake6 --version
# qmake6 -query QT_INSTALL_LIBS
# mkdir -p build && cd build
# qmake6 "../src/${APP_NAME}.pro" CONFIG+="$BUILD_TYPE" CONFIG+=static
# make "-j$(nproc)"
# - name: Prepare AppDir for AppImage
# run: |
# APPDIR=AppDir
# mkdir -p "$APPDIR/usr/bin"
# mkdir -p "$APPDIR/usr/share/applications"
# mkdir -p "$APPDIR/usr/share/icons/hicolor/256x256/apps"
# # Copy binary
# cp "build/${APP_NAME}" "$APPDIR/usr/bin/"
# # Convert .ico to .png and copy it
# cp resources/subtivals.png $APPDIR/subtivals.png
# convert "resources/${APP_NAME}.ico" -resize 256x256 "$APPDIR/usr/share/icons/hicolor/256x256/apps/${APP_NAME}.png"
# # Create .desktop file
# cat <<EOF > "$APPDIR/usr/share/applications/${APP_NAME}.desktop"
# [Desktop Entry]
# Name=${APP_NAME}
# Exec=${APP_NAME}
# Icon=${APP_NAME}
# Type=Application
# Categories=Utility;
# EOF
# - name: Check dynamic dependencies
# run: |
# ldd "$APPDIR/usr/bin/${APP_NAME}" || true
# - name: Run linuxdeployqt
# run: |
# linuxdeployqt "AppDir/usr/share/applications/${APP_NAME}.desktop" -appimage -bundle-non-qt-libs
# mv ./*.AppImage "${APP_NAME}-${PACKAGE_VERSION}${{ matrix.demo && '-demo' || '' }}.AppImage"
# chmod +x "${APP_NAME}-${PACKAGE_VERSION}${{ matrix.demo && '-demo' || '' }}.AppImage"
# - name: Check AppImage
# run: |
# "./${APP_NAME}-${PACKAGE_VERSION}${{ matrix.demo && '-demo' || '' }}.AppImage" --appimage-extract
# ldd "squashfs-root/usr/bin/${APP_NAME}"
# - name: Zip builds
# if: matrix.demo == false
# run: |
# zip -P "${{ secrets.ZIP_PASSWORD }}" "${APP_NAME}-${PACKAGE_VERSION}.zip" "${APP_NAME}-${PACKAGE_VERSION}.AppImage"
# - name: Upload artifacts
# uses: actions/upload-artifact@v4
# with:
# name: "${{ env.APP_NAME }}-artifacts-linux${{ matrix.demo && '-demo' || '' }}"
# path: ${{ matrix.demo && '*.AppImage' || '*.zip' }}
# if-no-files-found: error
build-mac:
runs-on: macos-latest
environment: build
strategy:
matrix:
demo: [false, true]
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Get latest tag version
run: echo "PACKAGE_VERSION=$(git describe --tags --abbrev=0 || echo 0.0.0)" >> "$GITHUB_ENV"
- name: Apply patch
if: matrix.demo == true
run: |
git diff origin/main..origin/demo > demo.patch
git apply demo.patch
- name: Install Qt
uses: jurplel/install-qt-action@v4
with:
version: ${{ env.QT_VERSION }}
modules: 'qtwebsockets'
- name: Compile
run: |
mkdir -p build && cd build/
qmake "../src/${{ env.APP_NAME }}.pro" CONFIG+="${{ env.BUILD_TYPE }}"
make "-j$(sysctl -n hw.ncpu)"
- name: Deploy
run: |
macdeployqt "build/${{ env.APP_NAME }}.app" -dmg -verbose=2
- name: Remove xattr attributes from dmg
run: |
set -e
dmgfile="build/${{ env.APP_NAME }}.dmg"
# 1. Mount the .dmg if it exists
if [ -f "$dmgfile" ]; then
echo "Mounting '${dmgfile}'..."
hdiutil attach "${dmgfile}" -mountpoint /Volumes/appmount
else
echo "'${dmgfile}' file does not exist."
exit 1
fi
# 2. Copy the app to /tmp
echo "Copying the application from the mounted volume..."
cp -R "/Volumes/appmount/${{ env.APP_NAME }}.app" "/tmp/${{ env.APP_LABEL }}.app"
# 3. Remove extended attributes (quarantine, etc.)
echo "Removing extended attributes..."
xattr -rc "/tmp/${{ env.APP_LABEL }}.app"
# 4. Create a new clean
echo "Creating the clean .dmg..."
hdiutil create -volname "${{ env.APP_LABEL }}" \
-srcfolder"/tmp/${{ env.APP_LABEL }}.app" \
-format UDZO \
-ov "${{ env.APP_LABEL }}-${{ env.PACKAGE_VERSION }}${{ matrix.demo && '-demo' || '' }}.dmg"
# 5. Detach the mounted volume
echo "Detaching the volume..."
hdiutil detach "/Volumes/appmount"
- name: Zip builds
if: matrix.demo == false
run: |
zip -P "${{ secrets.ZIP_PASSWORD }}" "${{ env.APP_NAME }}-${{ env.PACKAGE_VERSION }}.zip" "${{ env.APP_NAME }}-${{ env.PACKAGE_VERSION }}.dmg"
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: "${{ env.APP_NAME }}-artifacts-mac${{ matrix.demo && '-demo' || '' }}"
path: ${{ matrix.demo && '*.dmg' || '*.zip' }}
if-no-files-found: error
# build-windows:
# runs-on: windows-latest
# environment: build
# strategy:
# matrix:
# demo: [false, true]
# env:
# QT_DIR: ${{ github.workspace }}\Qt
# steps:
# - name: Checkout repository
# uses: actions/checkout@v4
# with:
# fetch-depth: 0
# - name: Get latest tag version
# shell: pwsh
# run: |
# $tag = git describe --tags --abbrev=0
# echo "PACKAGE_VERSION=$tag" >> $env:GITHUB_ENV
# - name: Apply patch
# if: matrix.demo == true
# run: |
# git diff origin/main..origin/demo > demo.patch
# git apply demo.patch
# - name: Install Qt (MinGW)
# uses: jurplel/install-qt-action@v4
# with:
# aqtversion: '==3.1.19'
# version: ${{ env.QT_VERSION }}
# target: 'desktop'
# arch: 'win64_mingw'
# dir: ${{ env.QT_DIR }}
# modules: 'qtwebsockets'
# tools: 'tools_mingw1310'
# - name: Add Qt-bundled MinGW to PATH
# shell: powershell
# run: |
# ECHO "${{ env.QT_DIR }}\Tools\mingw1310_64\bin" >> $env:GITHUB_PATH
# - name: Compile with MinGW
# run: |
# MKDIR build
# CD build
# qmake "../src/${{ env.APP_NAME }}.pro" CONFIG+="${{ env.BUILD_TYPE }}"
# mingw32-make -j4
# - name: Deploy with windeployqt
# run: |
# MKDIR deploy
# MOVE "build\${{ env.BUILD_TYPE }}\${{ env.APP_NAME }}.exe" deploy
# CD deploy
# windeployqt.exe --verbose 1 "${{ env.APP_NAME }}.exe"
# - name: Install NSIS via Scoop
# run: |
# iwr -useb get.scoop.sh -outfile 'install.ps1'
# .\install.ps1 -RunAsAdmin
# scoop update
# scoop bucket add extras
# scoop install nsis 7zip
# - name: Print NSIS version
# run: makensis -VERSION
# - name: Create NSIS installer
# run: |
# makensis /DAPP_NAME="${{ env.APP_NAME }}" /DPACKAGE_VERSION="${{ env.PACKAGE_VERSION }}" win-installer\installer.nsi
# - run: |
# MOVE "win-installer\${{ env.APP_NAME }}-${{ env.PACKAGE_VERSION }}.exe" "${{ env.APP_NAME }}-${{ env.PACKAGE_VERSION }}${{ matrix.demo == 'true' && '-demo' || '' }}.exe"
# - name: Zip builds
# if: matrix.demo == false
# run: |
# 7z a -p"${{ secrets.ZIP_PASSWORD }}" -tzip "${{ env.APP_NAME }}-${{ env.PACKAGE_VERSION }}.zip" "${{ env.APP_NAME }}-${{ env.PACKAGE_VERSION }}.exe"
# - name: Upload artifacts
# uses: actions/upload-artifact@v4
# with:
# name: "${{ env.APP_NAME }}-artifacts-win${{ matrix.demo && '-demo' || '' }}"
# path: ${{ matrix.demo && '*.exe' || '*.zip' }}
# if-no-files-found: error
release:
needs:
# - build-linux
- build-mac
# - build-windows
if: startsWith(github.ref, 'refs/tags/')
runs-on: ubuntu-latest
steps:
- name: Download built artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
- name: Display downloaded files
run: ls -R artifacts
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
files: artifacts/**/*-demo*
tag_name: "${{ github.ref_name }}"
name: "Release ${{ github.ref_name }}"
body: "Automated release for version ${{ github.ref_name }}"
draft: true
prerelease: true