Skip to content

Release Builds

Release Builds #161

Workflow file for this run

name: "Release Builds"
on:
push:
branches:
- v[0-9].[0-9]**
tags:
- v[0-9].[0-9]**
- v[0-9].[0-9]**-**
workflow_dispatch:
inputs:
custom-ref:
required: false
description: "Build release from git-ref:"
release-tag:
required: false
description: "Publish release to tag:"
developer:
default: false
type: boolean
description: "Developer build"
linux-x64:
default: true
type: boolean
macos-x64-arm64:
default: true
type: boolean
windows-x64:
default: true
type: boolean
windows-x86:
default: true
type: boolean
emscripten:
default: true
type: boolean
switch:
default: true
type: boolean
schedule:
# run every Wednesday at 8AM EST
- cron: '0 8 * * 3'
env:
REF: ${{ github.event.inputs.custom-ref || github.ref || 'master' }}
MESON_VERSION: '0.63.3'
EM_VERSION: '3.1.68'
PYTHON_VERSION: '3.11'
EM_CACHE_FOLDER: 'emsdk'
TAISEI_NOPRELOAD: 0
TAISEI_PRELOAD_REQUIRED: 1
GH_TOKEN: ${{ github.token }}
jobs:
setup-release:
name: "Setup release"
if: ${{ github.event.inputs.release-tag }}
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v4
with:
fetch-depth: 1
ref: ${{ env.REF }}
- name: Create release draft
run: |
if gh release view "${{ github.event.inputs.release-tag }}" &>/dev/null; then
echo "Release ${{ github.event.inputs.release-tag }}" already exists
else
gh release create --draft "${{ github.event.inputs.release-tag }}"
fi
linux-release-build-x64:
name: "Linux (x64/Source)"
if: ${{ (github.event.inputs.linux-x64 || 'true') == 'true' }}
runs-on: ubuntu-20.04
steps:
- name: Install Python
uses: actions/setup-python@v5
with:
python-version: ${{ env.PYTHON_VERSION }}
- name: Install Tools
run: >
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update || true # debian cache is not atomic and can sometimes fail
sudo apt install -y -qq
build-essential
libsdl2-dev
libx11-dev
libwayland-dev
python3-docutils
gnupg
gcc-10
g++-10
sudo update-alternatives --install
/usr/bin/gcc gcc /usr/bin/gcc-10 60 --slave
/usr/bin/g++ g++ /usr/bin/g++-10
pip install
meson==${{ env.MESON_VERSION }}
ninja
zstandard
python-gnupg
- name: Import GPG Key
uses: taisei-project/ghaction-import-gpg@v6
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.GPG_PASSPHRASE }}
# NOTE: 'fetch-depth: 0' == "get all history", not "no history"
- name: Checkout Code
uses: actions/checkout@v4
with:
submodules: 'recursive'
fetch-depth: 0
ref: ${{ env.REF }}
- name: Configure
run: >
git config --global --add safe.directory $(pwd)
git fetch --force --tags # see: https://github.com/actions/checkout/issues/290
meson setup build/linux
--native-file misc/ci/common-options.ini
--native-file misc/ci/forcefallback.ini
--native-file misc/ci/linux-x86_64-build-release.ini
--prefix=$(pwd)/build-release
-Ddeveloper=${{ github.event.inputs.developer || 'false' }}
- name: Set Package Version
run: |
echo BUILD_VERSION=$($(pwd)/scripts/version.py) >> $GITHUB_ENV
shell: bash
- name: Build
run: |
echo "Version set to ${{ env.BUILD_VERSION }}" # needs to be here as GITHUB_ENV doesn't update until the next step: https://github.com/github/docs/issues/7892
meson compile -C build/linux --verbose
meson install -C build/linux
- name: Unwanted Library Check
run: $(pwd)/scripts/smoke-test-standalone-linux-exe.py $(pwd)/build-release/taisei
- name: Run Test
run: $(pwd)/build-release/taisei -R $(pwd)/misc/ci/tests/test-replay.tsr
env:
TAISEI_NOPRELOAD: ${{ env.TAISEI_NOPRELOAD }}
TAISEI_PRELOAD_REQUIRED: ${{ env.TAISEI_PRELOAD_REQUIRED }}
- name: Package (Binary)
run: |
ninja txz -C build/linux --verbose
scripts/sign-release.py build/linux/Taisei-${{ env.BUILD_VERSION }}-linux-x86_64.tar.xz
- name: Upload Artifact (Binary)
uses: actions/upload-artifact@v4
if: success()
with:
name: linux-x86_64-${{ env.BUILD_VERSION }}-txz
path: build/linux/Taisei-${{ env.BUILD_VERSION }}-linux-x86_64.tar.xz*
if-no-files-found: error
- name: Package (Source)
run: |
meson dist -C build/linux --no-tests # disable test build, since we already know it compiles
scripts/sign-release.py build/linux/meson-dist/taisei-${{ env.BUILD_VERSION }}.tar.xz
- name: Upload Artifact (Source)
uses: actions/upload-artifact@v4
if: success()
with:
name: source-${{ env.BUILD_VERSION }}-txz
path: build/linux/meson-dist/taisei-${{ env.BUILD_VERSION }}.tar.xz*
if-no-files-found: error
- name: Upload Release Artifacts
if: ${{ github.event.inputs.release-tag }}
run: >
gh release upload "${{ github.event.inputs.release-tag }}"
build/linux/meson-dist/taisei-${{ env.BUILD_VERSION }}.tar.xz*
build/linux/Taisei-${{ env.BUILD_VERSION }}-linux-x86_64.tar.xz*
- name: Upload Log
if: always()
uses: actions/upload-artifact@v4
with:
name: taisei_x64_linux_release_log
path: build/linux/meson-logs/meson-log.txt
if-no-files-found: warn
macos-release-build-universal:
name: macOS (Universal)
if: ${{ (github.event.inputs.macos-x64-arm64 || 'true') == 'true' }}
runs-on: macos-15
steps:
- name: Install Tools
run: >
brew install
create-dmg
docutils
pygments
pip3 install
meson==${{ env.MESON_VERSION }}
ninja
python-gnupg
setuptools
zstandard
--break-system-packages
shell: bash
- name: Import GPG Key
uses: taisei-project/ghaction-import-gpg@v6
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.GPG_PASSPHRASE }}
- name: Checkout Code
uses: actions/checkout@v4
with:
submodules: 'recursive'
fetch-depth: 0
ref: ${{ env.REF }}
- name: Checkout Compiled ANGLE Libraries
uses: actions/checkout@v4
with:
repository: taisei-project/angle-compiled
path: angle-compiled
- name: Configure
run: |
git config --global --add safe.directory $(pwd)
git fetch --force --tags
$(pwd)/scripts/macos_configure_env.sh $(pwd)/build-release/ $(pwd)
$(pwd)/scripts/macos_setup_universal.sh -Ddeveloper=${{ github.event.inputs.developer || 'false' }}
shell: bash
- name: Set Package Version
run: |
echo BUILD_VERSION=$($(pwd)/scripts/version.py) >> $GITHUB_ENV
shell: bash
- name: Build
run: |
echo "Version set to ${{ env.BUILD_VERSION }}"
$(pwd)/scripts/macos_build_universal.sh ${{ env.BUILD_VERSION }}
shell: bash
- name: Sign Release
run: |
scripts/sign-release.py build-release/compiled/Taisei-${{ env.BUILD_VERSION }}-universal.dmg
shell: bash
- name: Run Test
run: $(pwd)/build-release/compiled/combined/Taisei.app/Contents/MacOS/Taisei -R $(pwd)/misc/ci/tests/test-replay.tsr
env:
TAISEI_NOPRELOAD: ${{ env.TAISEI_NOPRELOAD }}
TAISEI_PRELOAD_REQUIRED: ${{ env.TAISEI_PRELOAD_REQUIRED }}
- name: Upload Artifact
uses: actions/upload-artifact@v4
if: success()
with:
name: macos-universal-${{ env.BUILD_VERSION }}-dmg
path: build-release/compiled/Taisei-${{ env.BUILD_VERSION }}-universal.dmg*
if-no-files-found: error
- name: Upload Release Artifacts
if: ${{ github.event.inputs.release-tag }}
run: >
gh release upload "${{ github.event.inputs.release-tag }}"
build-release/compiled/Taisei-${{ env.BUILD_VERSION }}-universal.dmg*
- name: Upload Log
if: always()
uses: actions/upload-artifact@v4
with:
name: taisei_macos_universal_release_log
path: build-release/*/meson-logs/meson-log.txt
if-no-files-found: warn
windows-release-build-x64:
name: Windows (x64)
if: ${{ (github.event.inputs.windows-x64 || 'true') == 'true' }}
runs-on: ubuntu-latest
container: taiseiproject/windows-toolkit:20240304
steps:
- name: Import GPG Key
uses: taisei-project/ghaction-import-gpg@v6
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.GPG_PASSPHRASE }}
- name: Checkout Code
uses: actions/checkout@v4
with:
submodules: 'recursive'
fetch-depth: 0
ref: ${{ env.REF }}
- name: Checkout Compiled ANGLE Libraries
uses: actions/checkout@v4
with:
repository: taisei-project/angle-compiled
path: angle-compiled
- name: Configure
run: >
git config --global --add safe.directory $(pwd)
git fetch --force --tags
meson setup build/windows
-Dangle_libegl=$(pwd)/angle-compiled/lib/Windows-x64-dll/libEGL.dll
-Dangle_libgles=$(pwd)/angle-compiled/lib/Windows-x64-dll/libGLESv2.dll
--cross-file misc/ci/common-options.ini
--cross-file misc/ci/forcefallback.ini
--cross-file misc/ci/windows-llvm_mingw-x86_64-build-release.ini
--prefix=$(pwd)/build-release
-Ddeveloper=${{ github.event.inputs.developer || 'false' }}
- name: Set Package Version
run: |
echo BUILD_VERSION=$($(pwd)/scripts/version.py) >> $GITHUB_ENV
shell: bash
- name: Build
run: |
echo "Version set to ${{ env.BUILD_VERSION }}"
meson compile -C build/windows
- name: Package (EXE)
run: |
ninja nsis -C build/windows --verbose
scripts/sign-release.py build/windows/Taisei-${{ env.BUILD_VERSION }}-setup-x86_64.exe
- name: Upload Artifact (EXE)
uses: actions/upload-artifact@v4
if: success()
with:
name: windows-x86_64-${{ env.BUILD_VERSION }}-setup-exe
path: build/windows/Taisei-${{ env.BUILD_VERSION }}-setup-x86_64.exe*
if-no-files-found: error
- name: Package (ZIP)
run: |
ninja zip -C build/windows --verbose
scripts/sign-release.py build/windows/Taisei-${{ env.BUILD_VERSION }}-windows-x86_64.zip
- name: Upload Artifact (ZIP)
uses: actions/upload-artifact@v4
if: success()
with:
name: windows-x86_64-${{ env.BUILD_VERSION }}-zip
path: build/windows/Taisei-${{ env.BUILD_VERSION }}-windows-x86_64.zip*
if-no-files-found: error
- name: Upload Release Artifacts
if: ${{ github.event.inputs.release-tag }}
run: >
gh release upload "${{ github.event.inputs.release-tag }}"
build/windows/Taisei-${{ env.BUILD_VERSION }}-setup-x86_64.exe*
build/windows/Taisei-${{ env.BUILD_VERSION }}-windows-x86_64.zip*
- name: Upload Log
if: always()
uses: actions/upload-artifact@v4
with:
name: taisei_windows_x64_release_log
path: build/windows/meson-logs/meson-log.txt
if-no-files-found: warn
windows-release-build-x86:
name: Windows (x86)
if: ${{ (github.event.inputs.windows-x86 || 'true') == 'true' }}
runs-on: ubuntu-latest
container: taiseiproject/windows-toolkit:20240304
steps:
- name: Import GPG Key
uses: taisei-project/ghaction-import-gpg@v6
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.GPG_PASSPHRASE }}
- name: Checkout Code
uses: actions/checkout@v4
with:
submodules: 'recursive'
fetch-depth: 0
ref: ${{ env.REF }}
- name: Checkout Compiled ANGLE Libraries
uses: actions/checkout@v4
with:
repository: taisei-project/angle-compiled
path: angle-compiled
- name: Configure
run: >
git config --global --add safe.directory $(pwd)
git fetch --force --tags
meson setup build/windows
-Dangle_libegl=$(pwd)/angle-compiled/lib/Windows-x86-dll/libEGL.dll
-Dangle_libgles=$(pwd)/angle-compiled/lib/Windows-x86-dll/libGLESv2.dll
--cross-file misc/ci/common-options.ini
--cross-file misc/ci/forcefallback.ini
--cross-file misc/ci/windows-llvm_mingw-x86-build-release.ini
--prefix=$(pwd)/build-release
-Ddeveloper=${{ github.event.inputs.developer || 'false' }}
- name: Set Package Version
run: |
echo BUILD_VERSION=$($(pwd)/scripts/version.py) >> $GITHUB_ENV
shell: bash
- name: Build
run: |
echo "Version set to ${{ env.BUILD_VERSION }}"
meson compile -C build/windows
- name: Package (EXE)
run: |
ninja nsis -C build/windows --verbose
scripts/sign-release.py build/windows/Taisei-${{ env.BUILD_VERSION }}-setup-x86.exe
- name: Upload Artifact (EXE)
uses: actions/upload-artifact@v4
if: success()
with:
name: windows-x86-${{ env.BUILD_VERSION }}-setup-exe
path: build/windows/Taisei-${{ env.BUILD_VERSION }}-setup-x86.exe*
if-no-files-found: error
- name: Package (ZIP)
run: |
ninja zip -C build/windows --verbose
scripts/sign-release.py build/windows/Taisei-${{ env.BUILD_VERSION }}-windows-x86.zip
- name: Upload Artifact (ZIP)
uses: actions/upload-artifact@v4
if: success()
with:
name: windows-x86-${{ env.BUILD_VERSION }}-zip
path: build/windows/Taisei-${{ env.BUILD_VERSION }}-windows-x86.zip*
if-no-files-found: error
- name: Upload Release Artifacts
if: ${{ github.event.inputs.release-tag }}
run: >
gh release upload "${{ github.event.inputs.release-tag }}"
build/windows/Taisei-${{ env.BUILD_VERSION }}-setup-x86.exe*
build/windows/Taisei-${{ env.BUILD_VERSION }}-windows-x86.zip*
- name: Upload Log
if: always()
uses: actions/upload-artifact@v4
with:
name: taisei_windows_x86_release_log
path: build/windows/meson-logs/meson-log.txt
if-no-files-found: warn
emscripten-release-build:
name: Emscripten
if: ${{ (github.event.inputs.emscripten || 'true') == 'true' }}
runs-on: ubuntu-20.04
steps:
- name: Install Python
uses: actions/setup-python@v5
with:
python-version: ${{ env.PYTHON_VERSION }}
- name: Install Tools
run: >
sudo apt update || true
sudo apt install -y -qq
python3-docutils
python3-pip
git
gnupg
pip install
meson==${{ env.MESON_VERSION }}
ninja
zstandard
python-gnupg
- name: Import GPG Key
uses: taisei-project/ghaction-import-gpg@v6
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.GPG_PASSPHRASE }}
- name: Checkout Code
uses: actions/checkout@v4
with:
submodules: 'recursive'
fetch-depth: 0
ref: ${{ env.REF }}
- name: Fetch Cached Emscripten SDK
id: emsdk-cache
uses: actions/cache@v4
with:
path: ${{ env.EM_CACHE_FOLDER }}
key: ${{ env.EM_VERSION }}-${{ runner.os }}
- name: Install Emscripten SDK
if: steps.emsdk-cache.outputs.cache-hit != 'true'
run: |
rm -rf ./${{ env.EM_CACHE_FOLDER }}/
git clone https://github.com/emscripten-core/emsdk.git
${{ env.EM_CACHE_FOLDER }}/emsdk install ${{ env.EM_VERSION }}
${{ env.EM_CACHE_FOLDER }}/emsdk activate ${{ env.EM_VERSION }}
- name: Verify Emscripten SDK
run: |
source ${{ env.EM_CACHE_FOLDER }}/emsdk_env.sh
emcc -v
tee misc/ci/emscripten-ephemeral-ci.ini <<EOF >/dev/null
[constants]
toolchain = '$(pwd)/${{ env.EM_CACHE_FOLDER }}/upstream/emscripten/'
EOF
- name: Configure
run: >
git config --global --add safe.directory $(pwd)
git fetch --force --tags
source ${{ env.EM_CACHE_FOLDER }}/emsdk_env.sh
meson setup build/emscripten
--cross-file misc/ci/common-options.ini
--cross-file misc/ci/forcefallback.ini
--cross-file misc/ci/emscripten-build.ini
--cross-file misc/ci/emscripten-ephemeral-ci.ini
--prefix=$(pwd)/build-release
-Ddeveloper=${{ github.event.inputs.developer || 'false' }}
- name: Set Package Version
run: |
echo BUILD_VERSION=$($(pwd)/scripts/version.py) >> $GITHUB_ENV
shell: bash
- name: Build
run: |
echo "Version set to ${{ env.BUILD_VERSION }}"
source ${{ env.EM_CACHE_FOLDER }}/emsdk_env.sh
meson compile -C build/emscripten --verbose
- name: Package
run: |
source ${{ env.EM_CACHE_FOLDER }}/emsdk_env.sh
ninja txz -C build/emscripten --verbose
scripts/sign-release.py build/emscripten/Taisei-${{ env.BUILD_VERSION }}-emscripten-wasm32.tar.xz
- name: Upload Artifact
uses: actions/upload-artifact@v4
if: success()
with:
name: emscripten-wasm32-${{ env.BUILD_VERSION }}-txz
path: build/emscripten/Taisei-${{ env.BUILD_VERSION }}-emscripten-wasm32.tar.xz*
if-no-files-found: error
- name: Upload Release Artifacts
if: ${{ github.event.inputs.release-tag }}
run: >
gh release upload "${{ github.event.inputs.release-tag }}"
build/emscripten/Taisei-${{ env.BUILD_VERSION }}-emscripten-wasm32.tar.xz*
- name: Upload Log
if: always()
uses: actions/upload-artifact@v4
with:
name: taisei_emscripten_build_log
path: build/emscripten/meson-logs/meson-log.txt
if-no-files-found: warn
switch-release-build:
name: Switch (ARM64)
if: ${{ (github.event.inputs.switch || 'true') == 'true' }}
runs-on: ubuntu-latest
container: taiseiproject/switch-toolkit:20240305
steps:
- name: Import GPG Key
uses: taisei-project/ghaction-import-gpg@v6
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.GPG_PASSPHRASE }}
- name: Checkout Code
uses: actions/checkout@v4
with:
submodules: 'recursive'
fetch-depth: 0
ref: ${{ env.REF }}
- name: Configure
run: >
git config --global --add safe.directory $(pwd)
git fetch --force --tags
switch/crossfile.sh > misc/ci/switch-crossfile-ci.ini
meson setup build/nx
--cross-file misc/ci/common-options.ini
--cross-file misc/ci/switch-options.ini
--cross-file misc/ci/switch-crossfile-ci.ini
--prefix=$(pwd)/build-release
-Ddeveloper=${{ github.event.inputs.developer || 'false' }}
- name: Set Package Version
run: |
echo BUILD_VERSION=$($(pwd)/scripts/version.py) >> $GITHUB_ENV
shell: bash
- name: Build
run: |
echo "Version set to ${{ env.BUILD_VERSION }}"
meson compile -C build/nx --verbose
- name: Package
run: |
ninja zip -C build/nx --verbose
scripts/sign-release.py build/nx/Taisei-${{ env.BUILD_VERSION }}-switch-aarch64.zip
- name: Upload Artifact
uses: actions/upload-artifact@v4
if: success()
with:
name: switch-aarch64-${{ env.BUILD_VERSION }}-zip
path: build/nx/Taisei-${{ env.BUILD_VERSION }}-switch-aarch64.zip*
if-no-files-found: error
- name: Upload Release Artifacts
if: ${{ github.event.inputs.release-tag }}
run: >
gh release upload "${{ github.event.inputs.release-tag }}"
build/nx/Taisei-${{ env.BUILD_VERSION }}-switch-aarch64.zip*
- name: Upload Log
if: always()
uses: actions/upload-artifact@v4
with:
name: taisei_switch_release_log
path: build/nx/meson-logs/meson-log.txt
if-no-files-found: warn