Skip to content

Release Builds

Release Builds #275

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: false
type: boolean
emscripten:
default: true
type: boolean
switch:
default: false
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: '1.7.0'
EM_VERSION: '3.1.68'
PYTHON_VERSION: '3.13'
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-latest
container: taiseiproject/linux-toolkit:20250616
steps:
- 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: Download subprojects
run: |
meson subprojects download
shell: bash
- 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-zigcc.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 debugsyms --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: Upload Artifact (Debug)
uses: actions/upload-artifact@v4
if: success()
with:
name: linux-x86_64-${{ env.BUILD_VERSION }}-debugsyms
path: build/linux/Taisei-${{ env.BUILD_VERSION }}*-linux-x86_64-debugsyms.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: Download subprojects
run: |
meson subprojects download
shell: bash
- 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 (DMG)
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 Artifact (Debug)
uses: actions/upload-artifact@v4
if: success()
with:
name: macos-universal-${{ env.BUILD_VERSION }}-debugsyms
path: build-release/*/Taisei*-debugsyms.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-release/compiled/Taisei-${{ env.BUILD_VERSION }}-universal.dmg*
build-release/*/Taisei*-debugsyms.tar.xz
- 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/linux-toolkit:20250616
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: Download subprojects
run: |
meson subprojects download
shell: bash
- name: Configure
run: >
git config --global --add safe.directory $(pwd)
git fetch --force --tags
meson setup build/windows
--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 debugsyms --verbose
- 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 Artifact (Debug)
uses: actions/upload-artifact@v4
if: success()
with:
name: windows-x86_64-${{ env.BUILD_VERSION }}-debugsyms
path: build/windows/Taisei-${{ env.BUILD_VERSION }}*-windows-x86_64-debugsyms.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/windows/Taisei-${{ env.BUILD_VERSION }}*-setup-x86_64.exe*
build/windows/Taisei-${{ env.BUILD_VERSION }}*-windows-x86_64.zip*
build/windows/Taisei-${{ env.BUILD_VERSION }}*-windows-x86_64-debugsyms.tar.xz
- 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 || 'false') == 'true' }}
runs-on: ubuntu-latest
container: taiseiproject/linux-toolkit:20250616
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: Download subprojects
run: |
meson subprojects download
shell: bash
- name: Configure
run: >
git config --global --add safe.directory $(pwd)
git fetch --force --tags
meson setup build/windows
--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 debugsyms --verbose
- 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 Artifact (ZIP)
uses: actions/upload-artifact@v4
if: success()
with:
name: windows-x86-${{ env.BUILD_VERSION }}-debugsyms
path: build/windows/Taisei-${{ env.BUILD_VERSION }}*-windows-x86-debugsyms.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/windows/Taisei-${{ env.BUILD_VERSION }}*-setup-x86.exe*
build/windows/Taisei-${{ env.BUILD_VERSION }}*-windows-x86.zip*
build/windows/Taisei-${{ env.BUILD_VERSION }}*-windows-x86-debugsyms.tar.xz
- 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-latest
container: taiseiproject/linux-toolkit:20250616
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: Download subprojects
run: |
meson subprojects download
shell: bash
- 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 || 'false') == '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: Download subprojects
run: |
meson subprojects download
shell: bash
- 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