# This is a basic workflow to help you get started with Actions name: CI # Controls when the workflow will run on: # Triggers the workflow on push or pull request events but only for the "master" branch push: branches: [ "master" ] pull_request: branches: [ "master" ] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: ubuntu: name: Build Ubuntu Debian package runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-22.04] steps: - name: Checkout uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: '3.13.0' - name: Install prereqs run: | sudo apt install -y libegl-dev libxcb-keysyms1 libxcb-randr0 libxkbcommon-x11-0 libxcb-icccm4 libxcb-image0 libxcb-shape0 libxcb-xkb1 libxcb-render-util0 curl -sSL https://install.python-poetry.org | python3 - - name: Setup Env Vars run: | export PATH="$HOME/.local/bin:$PATH" echo "PATH=$PATH" >> $GITHUB_ENV echo "BUILD_DIR=build" >> $GITHUB_ENV echo "DIST_DIR=dist" >> $GITHUB_ENV FILE_LOC=$(find . -name info.py) export VER="$(cat $FILE_LOC | grep -w version | awk -F'"' '$0=$2')" export PROJ_NAME="$(cat $FILE_LOC | grep -w name | awk -F'"' '$0=$2')" export PROJ_MOD="$(cat $FILE_LOC | grep -w module_name | awk -F'"' '$0=$2')" export MAIN_FILE="$(cat $FILE_LOC | grep -w main_file | awk -F'"' '$0=$2')" export MAIN_MOD="$(cat $FILE_LOC | grep -w main_module | awk -F'"' '$0=$2')" export BUNDLE_ID="$(cat $FILE_LOC | grep -w bundle_identifier | awk -F'"' '$0=$2')" export EMAIL="$(cat $FILE_LOC | grep -w email | awk -F'"' '$0=$2')" export DESCRIPTION="$(cat $FILE_LOC | grep -w description | awk -F'"' '$0=$2')" echo "VER=$VER" >> $GITHUB_ENV echo "DESCRIPTION=$DESCRIPTION" >> $GITHUB_ENV echo "PROJECT_NAME=$PROJ_NAME" >> $GITHUB_ENV echo "PROJ_DIR=$PROJ_MOD" >> $GITHUB_ENV echo "PROJ_PATH=$PROJ_MOD" >> $GITHUB_ENV echo "PROJ_MOD=$PROJ_MOD" >> $GITHUB_ENV echo "MAIN_MOD=$MAIN_MOD" >> $GITHUB_ENV echo "MAIN_FILE=$MAIN_FILE" >> $GITHUB_ENV echo "BUNDLE_ID=$BUNDLE_ID" >> $GITHUB_ENV echo "EMAIL=$EMAIL" >> $GITHUB_ENV - name: Check Python install run: | poetry self update poetry run which python3 poetry run python3 --version poetry run which pip3 poetry run pip3 --version poetry run file python3 - name: Install Python dependencies run: | poetry install PYINSTALLER_COMPILE_BOOTLOADER=1 MACOSX_DEPLOYMENT_TARGET=10.9 poetry run pip3 install https://github.com/pyinstaller/pyinstaller/tarball/develop --no-binary :all: - name: Check Python dependencies run: | poetry run python3 -c "from PySide6 import __version__; print(__version__)" poetry run python3 -c "from PySide6.QtCore import __version__; print(__version__)" poetry run python3 -c "from PySide6.QtCore import QLibraryInfo; print(QLibraryInfo.location(QLibraryInfo.LibrariesPath))" poetry run python3 -c "import ssl; print(ssl)" poetry run python3 -c "from py2app.recipes import pyside6" poetry run python3 -c 'from distutils.sysconfig import get_config_var; print(get_config_var("LDLIBRARY"))' - name: Setup Deb run: | poetry run python3 create_pyinstaller_file.py poetry run pyinstaller -w --noconfirm --hidden-import PySide6 \ --add-data "${{ env.PROJ_DIR }}/resources:." \ --icon "${{ env.PROJ_DIR }}/resources/icon.png" \ --hidden-import configobj \ --workpath "${{ env.BUILD_DIR }}" \ --distpath "${{ env.DIST_DIR }}" \ -n "${{ env.PROJ_MOD }}" pyinstaller.py mv "${{ env.DIST_DIR }}/${{ env.PROJ_MOD }}" "./${{ env.PROJ_MOD }}-tar" tar -czvf ${{ env.PROJ_MOD }}.tar.gz ${{ env.PROJ_MOD }}-tar/* ci/deb-script.sh - uses: jiro4989/build-deb-action@v3 with: package: ${{ env.PROJ_PATH }}-${{ env.VER }}-${{ matrix.os }}-deb package_root: .debpkg maintainer: ${{ env.EMAIL }} version: ${{ env.VER }} # refs/tags/v*.*.* arch: 'all' depends: 'libc6 (>= 2.2.1)' desc: "${{ env.DESCRIPTION }}" - name: Deploy tar uses: actions/upload-artifact@v4 with: name: ${{ env.PROJ_PATH }}_${{ env.VER }}_${{ matrix.os }}-tar path: | ${{ env.PROJ_MOD }}.tar.gz retention-days: 1 - name: Deploy deb uses: actions/upload-artifact@v4 with: name: ${{ env.PROJ_PATH }}_${{ env.VER }}_${{ matrix.os }}-deb path: | ./*.deb retention-days: 1 - name: Release uses: softprops/action-gh-release@v1 if: startsWith(github.ref, 'refs/tags/') with: generate_release_notes: true files: | ${{ env.PROJ_MOD }}.tar.gz ./*.deb windows: name: Build for Windows runs-on: ${{ matrix.os }} strategy: matrix: os: [windows-2019] steps: - name: Checkout uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: '3.13.0' - name: Check Python install run: | (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python - $PATH = $env:Path + ";" + $env:APPDATA + "\Python\Scripts\" $env:Path = $PATH echo "$env:Path=$PATH" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append poetry self update poetry run which python poetry run python --version poetry run python -c "import struct; print(struct.calcsize('P') * 8)" poetry run which pip poetry run pip --version - name: Install Python dependencies run: | $env:Path += ";" + $env:APPDATA + "\Python\Scripts\" poetry self update poetry install poetry run pip install https://github.com/pyinstaller/pyinstaller/tarball/develop - name: Check Python dependencies run: | $env:Path += ";" + $env:APPDATA + "\Python\Scripts\" poetry run python -c "from PySide6 import __version__; print(__version__)" poetry run python -c "from PySide6.QtCore import __version__; print(__version__)" poetry run python -c "from PySide6.QtCore import QLibraryInfo; print(QLibraryInfo.location(QLibraryInfo.LibrariesPath))" - name: Setup Env Vars run: | $FILE_LOC = (Get-ChildItem -Path .\ -Filter info.py -Recurse -ErrorAction SilentlyContinue -Force | foreach {$_.FullName}) $VER = (findstr /b version $FILE_LOC).split('"')[1] echo "VER=$VER" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append echo "BUILD_DIR=build" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append echo "DIST_DIR=dist" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append $PROJ_NAME = (findstr /b name $FILE_LOC).split('"')[1] $PROJ_MOD = (findstr /b module_name $FILE_LOC).split('"')[1] $MAIN_FILE = (findstr /b main_file $FILE_LOC).split('"')[1] $MAIN_MOD = (findstr /b main_mod $FILE_LOC).split('"')[1] echo "PROJECT_NAME=$PROJ_NAME" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append echo "PROJ_MOD=$PROJ_MOD" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append echo "PROJ_DIR=$PROJ_MOD" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append echo "MAIN_FILE=$MAIN_FILE" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append echo "MAIN_MOD=$MAIN_MOD" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append - name: Build run: | $env:Path += ";" + $env:APPDATA + "\Python\Scripts\" poetry run python create_pyinstaller_file.py poetry run pyinstaller -w --noconfirm --hidden-import PySide6 ` --add-data "${{ env.PROJ_DIR }}\resources;." ` -i ${{ env.PROJ_DIR }}\resources\icon.ico ` --hidden-import pkg_resources ` --workpath "${{ env.BUILD_DIR }}" ` --distpath "${{ env.DIST_DIR }}" ` --onedir -n "${{ env.PROJECT_NAME }}" pyinstaller.py Compress-Archive -Path .\${{env.DIST_DIR}}\${{env.PROJECT_NAME}} -DestinationPath ${{env.PROJECT_NAME}}-${{ env.VER }}-windows-x64.zip - name: Deploy Zip uses: actions/upload-artifact@v4 with: name: ${{ env.PROJECT_NAME }}_${{ env.VER }}-${{ matrix.os }}-zip path: | ${{ env.PROJECT_NAME }}-${{ env.VER }}-windows-x64.zip retention-days: 1 - name: Release uses: softprops/action-gh-release@v1 if: startsWith(github.ref, 'refs/tags/') with: generate_release_notes: true files: | ${{ env.PROJECT_NAME }}-${{ env.VER }}-windows-x64.zip macos: name: Build for macOS runs-on: ${{ matrix.os }} strategy: matrix: os: [macos-14] steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Homebrew run: | NONINTERACTIVE=1 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brew install create-dmg - name: Setup Python run: | wget https://www.python.org/ftp/python/3.13.0/python-3.13.0-macos11.pkg sudo installer -verbose -pkg ./python-3*.pkg -target / echo "/Library/Frameworks/Python.framework/Versions/3.11/bin" >> $GITHUB_PATH curl -sSL https://install.python-poetry.org | python3 - - name: Setup Env Vars run: | export PATH="$HOME/.local/bin:$PATH" echo "PATH=$PATH" >> $GITHUB_ENV echo "BUILD_DIR=build" >> $GITHUB_ENV echo "DIST_DIR=dist" >> $GITHUB_ENV FILE_LOC=$(find . -name info.py) export VER="$(cat $FILE_LOC | grep -w version | awk -F'"' '$0=$2')" export PROJ_NAME="$(cat $FILE_LOC | grep -w name | awk -F'"' '$0=$2')" export PROJ_MOD="$(cat $FILE_LOC | grep -w module_name | awk -F'"' '$0=$2')" export MAIN_FILE="$(cat $FILE_LOC | grep -w main_file | awk -F'"' '$0=$2')" export MAIN_MOD="$(cat $FILE_LOC | grep -w main_module | awk -F'"' '$0=$2')" export BUNDLE_ID="$(cat $FILE_LOC | grep -w bundle_identifier | awk -F'"' '$0=$2')" echo "VER=$VER" >> $GITHUB_ENV echo "PROJECT_NAME=$PROJ_NAME" >> $GITHUB_ENV echo "PROJ_DIR=$PROJ_MOD" >> $GITHUB_ENV echo "PROJ_MOD=$PROJ_MOD" >> $GITHUB_ENV echo "MAIN_FILE=$MAIN_FILE" >> $GITHUB_ENV echo "MAIN_MOD=$MAIN_MOD" >> $GITHUB_ENV echo "BUNDLE_ID=$BUNDLE_ID" >> $GITHUB_ENV - name: Check Python install run: | poetry self update poetry run which python3 poetry run python3 --version poetry run which pip3 poetry run pip3 --version poetry run file python3 - name: Install Python dependencies run: | poetry add py2app pyclean --group dev poetry install PYINSTALLER_COMPILE_BOOTLOADER=1 MACOSX_DEPLOYMENT_TARGET=10.9 poetry run pip3 install https://github.com/pyinstaller/pyinstaller/tarball/develop --no-binary :all: - name: Install universal2 dependencies env: CFLAGS: -arch x86_64 -arch arm64 ARCHFLAGS: -arch x86_64 -arch arm64 run: | poetry run pip3 uninstall cffi -y poetry run pip3 install --no-binary :all: cffi poetry run pip3 uninstall cryptography -y poetry run pip3 download --platform macosx_10_10_universal2 --only-binary :all: --no-deps --dest . cryptography poetry run pip3 install --no-cache-dir --no-index --find-links . cryptography - name: Check Python dependencies run: | poetry run python3 -c "from PySide6 import __version__; print(__version__)" poetry run python3 -c "from PySide6.QtCore import __version__; print(__version__)" poetry run python3 -c "from PySide6.QtCore import QLibraryInfo; print(QLibraryInfo.location(QLibraryInfo.LibrariesPath))" poetry run python3 -c "import ssl; print(ssl)" poetry run python3 -c "from py2app.recipes import pyside6" poetry run python3 -c 'from distutils.sysconfig import get_config_var; print(get_config_var("LDLIBRARY"))' - name: Build run: | poetry run python3 create_pyinstaller_file.py # py2app works better poetry run python3 buildPy2app.py py2app # pyinstaller -w --noconfirm --hidden-import PySide6 \ # --add-data "${{ env.PROJ_DIR }}/resources:." \ # --icon "${{ env.PROJ_DIR }}/resources/icon.icns" \ # --target-architecture universal2 \ # --osx-bundle-identifier "${{ env.BUNDLE_ID }}" \ # --hidden-import pkg_resources \ # --distpath "${{ env.BUILD_DIR }}/ProjectMac" \ # --onefile -n "${{ env.PROJECT_NAME }}" pyinstaller.py mv "${{ env.DIST_DIR }}/${{ env.PROJECT_NAME }}.app" "${{ env.PROJECT_NAME }}.app" # Clean the directory so it's not full of python bytecode poetry run pyclean "${{ env.PROJECT_NAME }}.app" poetry run python3 ci/cleandist.py "${{ env.PROJECT_NAME }}.app" poetry run python3 ci/codesign.py "${{ env.PROJECT_NAME }}.app" zip -ry "${{ env.PROJECT_NAME }}_${{ env.VER }}-macos-universal.zip" "${{ env.PROJECT_NAME }}.app" - name: Prepare for deployment run: | mkdir -p "${{ env.DIST_DIR }}/dmg" test -f "${{ env.PROJECT_NAME }}_${{ env.VER }}.dmg" && rm "${{ env.PROJECT_NAME }}_${{ env.VER }}.dmg" mv "${{ env.PROJECT_NAME }}.app" "${{ env.DIST_DIR}}/dmg/" poetry run create-dmg \ --volname "${{ env.PROJECT_NAME }}-${{ env.VER }} Installer" \ --volicon "${{ env.PROJ_DIR }}/resources/icon.icns" \ --window-pos 200 120 \ --window-size 800 400 \ --icon-size 100 \ --icon "${{ env.PROJECT_NAME }}.app" 200 190 \ --hide-extension "${{ env.PROJECT_NAME }}.app" \ --app-drop-link 600 185 \ "${{ env.PROJECT_NAME }}_${{ env.VER }}-universal.dmg" \ "${{ env.DIST_DIR }}/dmg/" ls -al ${{ env.DIST_DIR }} - name: Deploy Zip uses: actions/upload-artifact@v4 with: name: ${{ env.PROJECT_NAME }}_${{ env.VER }}-${{ matrix.os }}-zip path: | ${{ env.PROJECT_NAME }}_${{ env.VER }}-macos-universal.zip retention-days: 1 - name: Deploy DMG uses: actions/upload-artifact@v4 with: name: ${{ env.PROJECT_NAME }}_${{ env.VER }}-${{ matrix.os}}-dmg path: | ${{ env.PROJECT_NAME }}_${{ env.VER }}-universal.dmg retention-days: 1 - name: Release uses: softprops/action-gh-release@v1 if: startsWith(github.ref, 'refs/tags/') with: generate_release_notes: true files: | ${{ env.PROJECT_NAME }}_${{ env.VER }}-universal.dmg ${{ env.PROJECT_NAME }}_${{ env.VER }}-macos-universal.zip