Release Builds #161
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |