Skip to content

Merge pull request #813 from Chesyon/master #6651

Merge pull request #813 from Chesyon/master

Merge pull request #813 from Chesyon/master #6651

# Builds on all branches & PRs and packages for MacOS and Windows.
# Deploys to PyPi for tags.
name: Build, test and publish
on:
push:
branches:
- master
- release
- version/*
pull_request:
branches-ignore:
- l10n_master
create:
tags:
- '*'
jobs:
typechecks:
runs-on: ubuntu-latest
name: Type checks
strategy:
max-parallel: 5
matrix:
python-version: [ "3.9", "3.10", "3.11", "3.12" ]
steps:
- uses: actions/checkout@v4
- uses: theCapypara/mypy-check@rust-support
name: Run type checks
with:
mypy_flags: '--config-file mypy.ini'
requirements: '-r requirements-dev.txt'
python_version: '${{ matrix.python-version }}'
linting:
runs-on: ubuntu-latest
name: Linting
steps:
- uses: actions/checkout@v4
- name: Install gobject-introspection
run: sudo apt-get install -y gobject-introspection libgirepository1.0-dev
- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements-dev.txt
- name: Lint with ruff
run: ruff check --output-format=github skytemple
code-formatting:
runs-on: ubuntu-latest
name: Code Format
steps:
- uses: actions/checkout@v4
- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install ruff
run: |
python -m pip install --upgrade pip
pip install ruff
- name: Check with ruff
run: ruff format --check skytemple
build:
runs-on: ubuntu-latest
name: Build the Python wheel
steps:
# For tags we assume the version in pyproject.toml is correct!
- name: Checkout
uses: actions/checkout@v4
- name: Rewrite version for dev if not tag
if: "!startsWith(github.ref, 'refs/tags/')"
run: |
perl -i -pe "s/version\s*=\s*\"(.*?)(\.rc.*|\.a.*|\.post.*)?\"/version=\"\1.dev0+${GITHUB_SHA::8}\"/" pyproject.toml
- name: Note version
run: |
echo "PACKAGE_VERSION=$(tomlq '.project.version' pyproject.toml -r)" >> $GITHUB_ENV
- name: Build localization MO files
run: |
installer/generate-mo.sh
- name: Build wheels
run: |
python3 -m pip install --upgrade pip build
python3 -m build
- name: Upload wheels
uses: actions/upload-artifact@v4
with:
name: wheels
path: dist/*.whl
deploy:
if: startsWith(github.ref, 'refs/tags/')
needs:
- build
- package-windows
- package-mac
- package-mac-arm64
- package-linux-flatpak-stable
runs-on: ubuntu-latest
name: Deploy wheels to PyPI
steps:
- name: Download wheels
uses: actions/download-artifact@v4
with:
name: wheels
- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: 3.11
- name: Upgrade pip
run: |
python -m pip install --upgrade pip
pip install twine
- name: Publish wheels to PyPI
env:
TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }}
TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
run: |
twine upload *.whl
deploy-to-artifact-storage:
runs-on: [ self-hosted, artifact-storage ]
name: Upload artifacts
needs:
- build
- package-windows
- package-mac
- package-mac-arm64
concurrency:
group: "${{ github.workflow }}-${{ github.ref }}"
steps:
- name: Clear
run: |
rm -rf "${{ github.workspace }}/artifacts" || true
mkdir -p "${{ github.workspace }}/artifacts"
- name: Download wheels
id: artifact_wheel
uses: actions/download-artifact@v4
with:
path: ${{ github.workspace }}/artifacts/whl
name: wheels
- name: Download Windows
id: artifact_windows
uses: actions/download-artifact@v4
with:
path: ${{ github.workspace }}/artifacts/win
name: skytemple-windows-app-x64
- name: Download MacOS Intel
id: artifact_macos_x86
uses: actions/download-artifact@v4
with:
path: ${{ github.workspace }}/artifacts/mac_x86
name: skytemple-mac-dmg-x86_64
- name: Download MacOS ARM
id: artifact_macos_arm64
uses: actions/download-artifact@v4
with:
path: ${{ github.workspace }}/artifacts/mac_arm64
name: skytemple-mac-dmg-arm64
- name: Copy over distributions
run: |
# Replace / in PR refs (123/merge -> 123-merge)
REF=${GITHUB_REF_NAME/\//-}
PATH_WHEEL=$(eval echo "${{ steps.artifact_wheel.outputs.download-path }}/*.whl")
PATH_WIN=$(eval echo "${{ steps.artifact_windows.outputs.download-path }}/*.exe")
PATH_MACOS=$(eval echo "${{ steps.artifact_macos_x86.outputs.download-path }}/*.dmg")
PATH_MACOS_ARM=$(eval echo "${{ steps.artifact_macos_arm64.outputs.download-path }}/*.dmg")
mkdir -p /mnt/dist/skytemple
cp -f "$PATH_WHEEL" "/mnt/dist/skytemple/skytemple-$REF.whl"
cp -f "$PATH_WIN" "/mnt/dist/skytemple/skytemple-$REF.exe"
cp -f "$PATH_MACOS" "/mnt/dist/skytemple/skytemple-x86-$REF.dmg"
cp -f "$PATH_MACOS_ARM" "/mnt/dist/skytemple/skytemple-arm64-$REF.dmg"
deploy-to-skytemple-dist:
if: startsWith(github.ref, 'refs/tags/')
runs-on: [ self-hosted, skytemple-dist ]
name: Upload to Deposit Box
needs:
- build
- package-windows
- package-mac
- package-mac-arm64
steps:
- name: Clear
run: |
rm -rf "${{ github.workspace }}/artifacts" || true
mkdir -p "${{ github.workspace }}/artifacts"
- name: Download Windows
id: artifact_windows
uses: actions/download-artifact@v4
with:
path: ${{ github.workspace }}/artifacts/win
name: skytemple-windows-app-x64
- name: Download MacOS Intel
id: artifact_macos_x86
uses: actions/download-artifact@v4
with:
path: ${{ github.workspace }}/artifacts/mac_x86
name: skytemple-mac-dmg-x86_64
- name: Download MacOS ARM
id: artifact_macos_arm64
uses: actions/download-artifact@v4
with:
path: ${{ github.workspace }}/artifacts/mac_arm64
name: skytemple-mac-dmg-arm64
- name: Copy over distributions
run: |
PATH_WIN=$(eval echo "${{ steps.artifact_windows.outputs.download-path }}/*.exe")
PATH_MACOS=$(eval echo "${{ steps.artifact_macos_x86.outputs.download-path }}/*.dmg")
PATH_MACOS_ARM=$(eval echo "${{ steps.artifact_macos_arm64.outputs.download-path }}/*.dmg")
dist.py "$PATH_WIN" "skytemple/$GITHUB_REF_NAME/skytemple-$GITHUB_REF_NAME-win-install.exe"
dist.py "$PATH_MACOS" "skytemple/$GITHUB_REF_NAME/skytemple-$GITHUB_REF_NAME-mac-install-x86-64.dmg"
dist.py "$PATH_MACOS_ARM" "skytemple/$GITHUB_REF_NAME/skytemple-$GITHUB_REF_NAME-mac-install-arm64.dmg"
package-linux-flatpak-nightly:
name: Linux Flatpak Nightly
runs-on: ubuntu-latest
container:
image: bilelmoussaoui/flatpak-github-actions:gnome-46
options: --privileged
steps:
# Most of these are needed because of a bug in pip download, which causes pip download to attempt to build all build dependencies..
- name: Install dependencies
run: |
sudo yum install -y perl python3 python3-pip python3-devel gobject-introspection-devel meson cmake pkg-config cairo-devel cairo-gobject-devel make automake gcc gcc-c++
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install generator dependencies
run: |
pip3 install -r installer/linux-flatpak/requirements.txt
- name: Rewrite version for dev if not tag
if: "!startsWith(github.ref, 'refs/tags/')"
run: |
perl -i -pe "s/version\s*=\s*\"(.*?)(\.rc.*|\.a.*|\.post.*)?\"/version=\"\1.dev0+${GITHUB_SHA::8}\"/" pyproject.toml
- name: Run generator
run: |
python3 -u installer/linux-flatpak/generator.py nightly
- uses: flatpak/flatpak-github-actions/flatpak-builder@v6
name: Build Flatpak
with:
bundle: org.skytemple.SkyTemple.flatpak
manifest-path: installer/linux-flatpak/org.skytemple.SkyTemple.yml
cache-key: flatpak-builder-${{ github.sha }}
- uses: flatpak/flatpak-github-actions/flat-manager@v6
name: Deploy to SkyTemple Repo
if: github.ref == 'refs/heads/master'
with:
repository: nightly
flat-manager-url: https://flatpak.skytemple.org/
token: ${{ secrets.SKYTEMPLE_FLATPAK_REPO_TOKEN }}
package-linux-flatpak-stable:
if: startsWith(github.ref, 'refs/tags/')
name: Linux Flatpak Stable
runs-on: ubuntu-latest
container:
image: bilelmoussaoui/flatpak-github-actions:gnome-46
options: --privileged
steps:
# Most of these are needed because of a bug in pip download, which causes pip download to attempt to build all build dependencies..
- name: Install dependencies
run: |
sudo yum install -y python3 python3-pip python3-devel jq gobject-introspection-devel meson cmake pkg-config cairo-devel cairo-gobject-devel make automake gcc gcc-c++
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Install generator dependencies
run: |
pip3 install -r installer/linux-flatpak/requirements.txt tomlq
- name: Note version
run: |
echo "PACKAGE_VERSION=$(tomlq '.project.version' pyproject.toml -r)" >> $GITHUB_ENV
- name: Run generator
run: |
python3 -u installer/linux-flatpak/generator.py stable
- uses: flatpak/flatpak-github-actions/flatpak-builder@v6
name: Build Flatpak
with:
bundle: org.skytemple.SkyTemple.flatpak
manifest-path: installer/linux-flatpak/stable/org.skytemple.SkyTemple.yml
- name: Checkout Flathub GH Repo
uses: actions/checkout@v4
with:
repository: flathub/org.skytemple.SkyTemple
path: flathub
token: ${{ secrets.FLATHUB_GITHUB_TOKEN }}
- name: Delete all old files
run: |
git rm -rf .
git clean -fxd
working-directory: flathub
- name: Copy stable build to FlatHub Repo
run: |
cp -a installer/linux-flatpak/stable/. flathub/
- name: Create Pull Request
uses: peter-evans/create-pull-request@v6
with:
add-paths: .
title: New Release ${{ env.PACKAGE_VERSION }}
body: Autogenerated by ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
commit-message: New Release ${{ env.PACKAGE_VERSION }}
path: flathub
token: ${{ secrets.FLATHUB_GITHUB_TOKEN }}
branch: release/${{ env.PACKAGE_VERSION }}
delete-branch: true
package-windows:
# This is partly based on https://github.com/wingtk/gvsbuild/blob/main/.github/workflows/ci.yml
runs-on: windows-2022
name: Build and package for Windows
steps:
- name: Setup python
uses: actions/setup-python@v5
with:
python-version: "3.11"
architecture: "x64"
- name: Cache GTK-Build
id: cache-gtk-build
uses: actions/cache@v4
with:
path: "C:\\gtk-build"
key: win-gtk-build-2024-fork1-1
restore-keys: |
win-gtk-build-2023-fork1-1-
- name: Checkout
uses: actions/checkout@v4
# Temporarily move the preinstalled git, it causes errors related to cygwin.
- name: Move git binary
run: |
Move-Item "C:\Program Files\Git\usr\bin" "C:\Program Files\Git\usr\notbin"
Move-Item "C:\Program Files\Git\bin" "C:\Program Files\Git\notbin"
- name: Install gvsbuild
run: |
# gvsbuild has issues if the pipx install path has spaces in it. It may be installed
# in Program Files (x86) by default, so let's just make sure it isn't.
if (Test-Path "C:\Program Files (x86)\pipx") {
Remove-Item -path "C:\Program Files (x86)\pipx" -recurse
}
# Make sure the pipx venv dir has no spaces
New-Item -ItemType Directory -Force -Path C:\pipx_home
$env:PIPX_HOME = "C:\pipx_home"
echo "PIPX_HOME=C:\pipx_home" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
New-Item -ItemType Directory -Force -Path C:\pipx_bin
$env:PIPX_BIN_DIR = "C:\pipx_bin"
echo "PIPX_BIN_DIR=C:\pipx_bin" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
$env:path = "C:\pipx_bin;" + $env:path
python -m pip install --user pipx
python -m pipx ensurepath
pipx install "git+https://github.com/theCapypara/gvsbuild@pango-patch"
- name: Build GTK and other libs
run: |
$env:path = "C:\pipx_bin;" + $env:path
gvsbuild build --fast-build --ninja-opts -j2 --enable-gi --py-wheel gtk3 pygobject openssl gettext gtksourceview4 hicolor-icon-theme adwaita-icon-theme
- name: Restore git binary
run: |
Move-Item "C:\Program Files\Git\usr\notbin" "C:\Program Files\Git\usr\bin"
Move-Item "C:\Program Files\Git\notbin" "C:\Program Files\Git\bin"
- name: Rewrite version for dev if not tag
if: "!startsWith(github.ref, 'refs/tags/')"
shell: sh
run: |
perl -i -pe "s/version\s*=\s*\"(.*?)(\.rc.*|\.a.*|\.post.*)?\"/version=\"\1.dev0+${GITHUB_SHA::8}\"/" pyproject.toml
echo "IS_DEV_BUILD=1" >> $GITHUB_ENV
- name: Note version
run: |
$env:path = "C:\pipx_bin;" + $env:path
pipx install yq
$env:PACKAGE_VERSION = tomlq.exe '.project.version' pyproject.toml -r
echo "PACKAGE_VERSION=$env:PACKAGE_VERSION" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Install SkyTemple
run: |
$ErrorActionPreference = "Stop"
$env:pathext = $env:pathext + ";.PY"
$env:path = "C:\gtk-build\gtk\x64\release\bin;" + $env:path
$env:LIB = "C:\gtk-build\gtk\x64\release\lib;" + $env:LIB
$env:INCLUDE = "C:\gtk-build\gtk\x64\release\include;C:\gtk-build\gtk\x64\release\include\cairo;C:\gtk-build\gtk\x64\release\include\glib-2.0;C:\gtk-build\gtk\x64\release\include\gobject-introspection-1.0;C:\gtk-build\gtk\x64\release\lib\glib-2.0\include;" + $env:INCLUDE
# Install PyGObject and pycairo
pip install --force-reinstall (Resolve-Path C:\gtk-build\build\x64\release\pygobject\dist\PyGObject*.whl)
pip install --force-reinstall (Resolve-Path C:\gtk-build\build\x64\release\pycairo\dist\pycairo*.whl)
# Check GObject availability
python -c 'import gi; gi.require_version("Gtk", "3.0"); from gi.repository import GObject, Gio, GLib, Gtk, Gdk'
if ($LASTEXITCODE) { exit $LASTEXITCODE }
cd installer
# Package
.\build-windows.ps1 $PACKAGE_VERSION
if ($LASTEXITCODE) { exit $LASTEXITCODE }
if(!(Test-Path ".\dist\skytemple\skytemple.exe")){
exit 1
}
- name: Create installer
uses: joncloud/[email protected]
with:
script-file: "installer/skytemple.nsi"
arguments: "/DPRODUCT_VERSION=${{ env.PACKAGE_VERSION }} /DINST_LIST=install_list.nsh /DUNINST_LIST=uninstall_list.nsh"
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: skytemple-windows-app-x64
path: |
installer/skytemple-*.exe
package-mac:
runs-on: macos-12
name: Build and package for Mac OS (Intel)
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Rewrite version for dev if not tag
if: "!startsWith(github.ref, 'refs/tags/')"
run: |
perl -i -pe "s/version\s*=\s*\"(.*?)(\.rc.*|\.a.*|\.post.*)?\"/version=\"\1.dev0+${GITHUB_SHA::8}\"/" pyproject.toml
echo "IS_DEV_BUILD=1" >> $GITHUB_ENV
- name: Note version
run: |
python3 -m venv .yq-venv
. .yq-venv/bin/activate
pip install yq
echo "PACKAGE_VERSION=$(tomlq '.project.version' pyproject.toml -r)" >> $GITHUB_ENV
- name: Install base packages
run: |
brew install enchant pygobject3 gtk+3 [email protected] gtksourceview4 adwaita-icon-theme sdl12-compat sdl2 cmake
echo "PATH=/usr/local/opt/[email protected]/bin:/usr/local/bin:$PATH" >> $GITHUB_ENV
python3.12 -m venv .venv
. .venv/bin/activate
pip3 debug --verbose # print compatible tags etc. for debugging purposes
- name: Make sure PyGObject is available.
run: |
. .venv/bin/activate
pip3 install "pygobject>=3.44.0"
- name: Install and package
run: |
. .venv/bin/activate
# Install other dependencies and SkyTemple itself
pip3 install skytemple-rust 'pyinstaller~=6.0'
if [ -n "$IS_DEV_BUILD" ]; then
IS_MACOS=1 installer/install-skytemple-rust.sh x86_64
fi
pip3 install -r requirements-frozen.txt
# Generate MO localization files
installer/generate-mo.sh
pip3 install '.[eventserver]'
if [ -n "$IS_DEV_BUILD" ]; then
installer/install-skytemple-components-from-git.sh
fi
# Check GObject availability
python -c 'import gi; gi.require_version("Gtk", "3.0"); from gi.repository import GObject, Gio, GLib, Gtk, Gdk'
cd installer
# Download armips
curl https://skytemple.org/build_deps/mac/armips -O
chmod +x armips
# Package
./build-mac.sh $PACKAGE_VERSION
- name: Create installer
run: |
# See https://github.com/sindresorhus/create-dmg
# create-dmg automatically generates an installer icon if imagemagick is installed
brew install graphicsmagick imagemagick
# This tool returns exit code 2 if the DMG was created but code signing failed for some reason
npx create-dmg --dmg-title="SkyTemple" "installer/dist/SkyTemple.app" installer || true
- name: Upload .dmg
uses: actions/upload-artifact@v4
with:
name: skytemple-mac-dmg-x86_64
path: |
installer/SkyTemple*.dmg
package-mac-arm64:
runs-on: macos-14
name: Build and package for Mac OS (ARM)
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: true
- name: Rewrite version for dev if not tag
if: "!startsWith(github.ref, 'refs/tags/')"
run: |
perl -i -pe "s/version\s*=\s*\"(.*?)(\.rc.*|\.a.*|\.post.*)?\"/version=\"\1.dev0+${GITHUB_SHA::8}\"/" pyproject.toml
echo "IS_DEV_BUILD=1" >> $GITHUB_ENV
- name: Note version
run: |
python3 -m venv .yq-venv
. .yq-venv/bin/activate
pip install yq
echo "PACKAGE_VERSION=$(tomlq '.project.version' pyproject.toml -r)" >> $GITHUB_ENV
- name: Install base packages
run: |
brew install enchant pygobject3 gtk+3 [email protected] gtksourceview4 adwaita-icon-theme sdl12-compat sdl2 cmake
echo "PATH=/usr/local/opt/[email protected]/bin:/usr/local/bin:$PATH" >> $GITHUB_ENV
python3.12 -m venv .venv
. .venv/bin/activate
pip3 debug --verbose # print compatible tags etc. for debugging purposes
- name: Make sure PyGObject is available.
run: |
. .venv/bin/activate
pip3 install "pygobject>=3.44.0"
- name: Install and package
run: |
. .venv/bin/activate
# Install other dependencies and SkyTemple itself
pip3 install skytemple-rust 'pyinstaller~=6.0'
if [ -n "$IS_DEV_BUILD" ]; then
IS_MACOS=1 installer/install-skytemple-rust.sh x86_64
fi
pip3 install -r requirements-frozen.txt
# Generate MO localization files
installer/generate-mo.sh
pip3 install '.[eventserver]'
if [ -n "$IS_DEV_BUILD" ]; then
installer/install-skytemple-components-from-git.sh
fi
# Check GObject availability
python -c 'import gi; gi.require_version("Gtk", "3.0"); from gi.repository import GObject, Gio, GLib, Gtk, Gdk'
cd installer
# Download armips
curl https://skytemple.org/build_deps/mac/armips-mac-arm64 -o armips
chmod +x armips
# Package
./build-mac.sh $PACKAGE_VERSION
- name: Create installer
run: |
# See https://github.com/sindresorhus/create-dmg
# create-dmg automatically generates an installer icon if imagemagick is installed
brew install graphicsmagick imagemagick
# This tool returns exit code 2 if the DMG was created but code signing failed for some reason
npx create-dmg --dmg-title="SkyTemple" "installer/dist/SkyTemple.app" installer || true
- name: Upload .dmg
uses: actions/upload-artifact@v4
with:
name: skytemple-mac-dmg-arm64
path: |
installer/SkyTemple*.dmg