Skip to content

Added script validation on a minimal version of python. #662

Added script validation on a minimal version of python.

Added script validation on a minimal version of python. #662

name: 🛠️ GDExtension Build
on:
push:
paths:
[
src/**,
.github/**,
"!.github/**/util_*",
"patches/**",
lib_utils.py,
SConstruct,
]
pull_request:
paths:
[
src/**,
.github/**,
"!.github/**/util_*",
"patches/**",
lib_utils.py,
SConstruct,
]
workflow_dispatch:
inputs:
production_build:
description: Production build
default: true
type: boolean
use_cache:
description: Use Cache
default: true
type: boolean
# Stop the same workflow actions
concurrency:
group: ${{github.workflow}}-${{github.event.pull_request.number || github.ref}}-${{inputs.production_build}}
cancel-in-progress: true
permissions:
actions: write
env:
SCONS_CACHE: ${{github.workspace}}/.scons-cache/
USE_CACHE: ${{!format('{0}', inputs.use_cache) && 'true' || format('{0}', inputs.use_cache)}} # Default true
PRODUCTION_BUILD: ${{!format('{0}', inputs.production_build) && 'false' || format('{0}', inputs.production_build)}} # Default false
OUTPUT_LIBS_PATH: bin
FORCE_DISABLE_UNITY: yes
GH_TOKEN: ${{ github.token }}
jobs:
windows-gdextension:
name: 🏁 Windows
runs-on: windows-latest
strategy:
fail-fast: false
matrix:
arch: [x86_64]
target: [editor, template_release]
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Compile GDExtension
uses: ./.github/actions/compile_gdextension
with:
platform: windows
target: ${{matrix.target}}
arch: ${{matrix.arch}}
artifact: libdd3d-windows.${{matrix.target}}.${{matrix.arch}}
additional: lto=yes
output_libs_path: ${{env.OUTPUT_LIBS_PATH}}
use_cache: ${{env.USE_CACHE}}
token: ${{secrets.TELEMETRY_TOKEN}}
# ============================================
linux-gdextension:
name: 🐧 Linux
runs-on: ubuntu-20.04
strategy:
fail-fast: false
matrix:
arch: [x86_64]
target: [editor, template_release]
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Compile GDExtension
uses: ./.github/actions/compile_gdextension
with:
platform: linux
target: ${{matrix.target}}
arch: ${{matrix.arch}}
artifact: libdd3d-linux.${{matrix.target}}.${{matrix.arch}}
additional: lto=yes
output_libs_path: ${{env.OUTPUT_LIBS_PATH}}
use_cache: ${{env.USE_CACHE}}
token: ${{secrets.TELEMETRY_TOKEN}}
# ============================================
macos-gdextension:
name: 🍏 MacOS
runs-on: macos-latest
strategy:
fail-fast: false
matrix:
arch: [universal]
target: [editor, template_release]
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Compile GDExtension
uses: ./.github/actions/compile_gdextension
with:
platform: macos
target: ${{matrix.target}}
arch: ${{matrix.arch}}
artifact: libdd3d-macos.${{matrix.target}}.${{matrix.arch}}
additional: lto=yes macos_deployment_target=10.14
output_libs_path: ${{env.OUTPUT_LIBS_PATH}}
use_cache: ${{env.USE_CACHE}}
token: ${{secrets.TELEMETRY_TOKEN}}
# ============================================
ios-gdextension:
name: 🍏 Ios
runs-on: macos-latest
strategy:
fail-fast: false
matrix:
arch: [universal]
target: [template_debug, template_release]
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Compile GDExtension
uses: ./.github/actions/compile_gdextension
with:
platform: ios
target: ${{matrix.target}}
arch: ${{matrix.arch}}
artifact: libdd3d-ios.${{matrix.target}}.${{matrix.arch}}
additional: lto=yes
output_libs_path: ${{env.OUTPUT_LIBS_PATH}}
use_cache: ${{env.USE_CACHE}}
token: ${{secrets.TELEMETRY_TOKEN}}
# ============================================
android-gdextension:
name: 🤖 Android
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
arch: [arm32, arm64, x86_32, x86_64]
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Install Android NDK r23c
uses: nttld/[email protected]
id: setup-ndk
with:
ndk-version: r23c
link-to-sdk: true
local-cache: true
# TODO revisit after some updates of nttld/setup-ndk
- name: Restore Android Symlinks
run: |
directory="${{ steps.setup-ndk.outputs.ndk-path }}/toolchains/llvm/prebuilt/linux-x86_64/bin"
find "$directory" -type l | while read link; do
current_target=$(readlink "$link")
new_target="$directory/$(basename "$current_target")"
ln -sf "$new_target" "$link"
echo "Changed $(basename "$link") from $current_target to $new_target"
done
- name: Compile GDExtension target=template_debug
uses: ./.github/actions/compile_gdextension
with:
platform: android
target: template_debug
arch: ${{matrix.arch}}
artifact: libdd3d-android.template_debug.${{matrix.arch}}
additional: lto=yes
additional_enabled_dd3d: false
output_libs_path: ${{env.OUTPUT_LIBS_PATH}}
use_cache: ${{env.USE_CACHE}}
- name: Compile GDExtension target=template_release
uses: ./.github/actions/compile_gdextension
with:
platform: android
target: template_release
arch: ${{matrix.arch}}
artifact: libdd3d-android.template_release.${{matrix.arch}}
additional: lto=yes
additional_enabled_dd3d: false
output_libs_path: ${{env.OUTPUT_LIBS_PATH}}
use_cache: ${{env.USE_CACHE}}
# ============================================
web-gdextension:
name: 🕸 Web
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
arch: [wasm32]
target: [template_debug, template_release]
env:
EM_VERSION: 3.1.64
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Download Emscripten
uses: mymindstorm/setup-emsdk@v14
# Continue if failed to cache
# https://github.com/mymindstorm/setup-emsdk/issues/20
continue-on-error: true
with:
version: ${{env.EM_VERSION}}
actions-cache-folder: obj/emsdk_cache
- name: Compile GDExtension threads=no
uses: ./.github/actions/compile_gdextension
with:
platform: web
target: ${{matrix.target}}
arch: ${{matrix.arch}}
artifact: libdd3d-web.${{matrix.target}}.${{matrix.arch}}.threads_no
additional: lto=yes threads=no
output_libs_path: ${{env.OUTPUT_LIBS_PATH}}
use_cache: ${{env.USE_CACHE}}
- name: Compile GDExtension threads=yes
uses: ./.github/actions/compile_gdextension
with:
platform: web
target: ${{matrix.target}}
arch: ${{matrix.arch}}
artifact: libdd3d-web.${{matrix.target}}.${{matrix.arch}}.threads_yes
additional: lto=yes threads=yes
output_libs_path: ${{env.OUTPUT_LIBS_PATH}}
use_cache: ${{env.USE_CACHE}}
# ============================================
double-debug-gdextension:
name: "2️⃣ Double: ${{matrix.runner-os}}, Platform-${{matrix.platform}}"
runs-on: ${{matrix.runner-os}}
strategy:
fail-fast: false
matrix:
# sync with other jobs
runner-os: [ubuntu-20.04, macos-latest, windows-latest]
include:
- runner-os: ubuntu-20.04
platform: "linux"
arch: "x86_64"
- runner-os: macos-latest
platform: "macos"
arch: "universal"
- runner-os: windows-latest
platform: "windows"
arch: "x86_64"
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Compile GDExtension target=editor
uses: ./.github/actions/compile_gdextension
with:
platform: ${{matrix.platform}}
target: editor
arch: ${{matrix.arch}}
artifact: libdouble-${{matrix.platform}}.editor.${{matrix.arch}}
additional: lto=yes precision=double fix_precision_enabled=yes shader_world_coords_enabled=no
output_libs_path: ${{env.OUTPUT_LIBS_PATH}}
use_cache: ${{env.USE_CACHE}}
token: ${{secrets.TELEMETRY_TOKEN}}
- name: Compile GDExtension target=template_release
uses: ./.github/actions/compile_gdextension
with:
platform: ${{matrix.platform}}
target: template_release
arch: ${{matrix.arch}}
artifact: libdouble-${{matrix.platform}}.template_release.${{matrix.arch}}
additional: lto=yes precision=double fix_precision_enabled=yes shader_world_coords_enabled=no
output_libs_path: ${{env.OUTPUT_LIBS_PATH}}
use_cache: ${{env.USE_CACHE}}
token: ${{secrets.TELEMETRY_TOKEN}}
# ============================================
check-python-version:
name: 🐍 Check compatibility with python
runs-on: ubuntu-latest
strategy:
matrix:
PYTHON_VER: ["3.8"] # this is the minimum available version to install on ubuntu 22.04 and 24.04
# but the code is most likely compatible with python 3.6
steps:
- name: Checkout
uses: actions/checkout@v4
with:
sparse-checkout: |
.
patches
- name: Setup python ${{matrix.PYTHON_VER}}
uses: actions/setup-python@v5
with:
python-version: ${{matrix.PYTHON_VER}}
- name: Try to compile all .py files
run: |
python --version
files="SConstruct $(find . -maxdepth 1 -name "*.py") $(find patches -name "*.py")"
echo "Found files: '$files'"
python -m py_compile $files
echo "All files compiled successfully!"
# ============================================
collect-gdextension:
needs:
[
windows-gdextension,
linux-gdextension,
macos-gdextension,
android-gdextension,
web-gdextension,
ios-gdextension,
]
name: 📦 Collect GDExtension binaries
runs-on: ubuntu-latest
outputs:
artifact_name: ${{steps.output_info.outputs.artifact_name}}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Get library version
id: get_version
uses: ./.github/actions/get_lib_version
- name: Download Binaries
uses: actions/download-artifact@v4
with:
pattern: libdd3d-*
path: extracted_files
- name: Store all libraries in one directory
run: |
arch_dirs=$(find extracted_files/ -mindepth 1 -maxdepth 1 -type d)
echo "Original structure:"
find extracted_files -mindepth 1
mv -f extracted_files/**/* extracted_files
rm -rf $arch_dirs
echo "Final structure:"
find extracted_files -mindepth 1
touch extracted_files/.gdignore
- name: Output file information
id: output_info
run: |
cd extracted_files
echo "Total size: $(du -ch -b | grep total | cut -f1 | awk '{printf "%.2f", $1/1048576}') MB, Total number of files: $(find . -type f | wc -l)" >> $GITHUB_STEP_SUMMARY
echo "artifact_name=${{env.PRODUCTION_BUILD == 'true' && '.gdextension_libs_production' || '.gdextension_libs'}}-${{steps.get_version.outputs.version}}" >> $GITHUB_OUTPUT
- name: Upload GDExtension
uses: actions/upload-artifact@v4
with:
name: ${{steps.output_info.outputs.artifact_name}}
retention-days: 7
include-hidden-files: true
path: extracted_files/*
# ============================================
test_api_integration:
name: "🧪 Testing API: ${{matrix.runner-os}}, Godot-${{matrix.file_suffix}}"
runs-on: ${{matrix.runner-os}}
needs: collect-gdextension
strategy:
fail-fast: false
matrix:
# sync with other jobs
runner-os: [ubuntu-20.04, macos-latest, windows-latest]
include:
- runner-os: ubuntu-20.04
file_suffix: "stable_linux.x86_64.zip"
- runner-os: macos-latest
file_suffix: "stable_macos.universal.zip"
- runner-os: windows-latest
file_suffix: "stable_win64.exe.zip"
env:
# Sync with container: image:
GODOT_VERSION: 4.2.2-stable
ADDON_DIR: debug_draw_3d
PROJECT_PATH: dd3d_web_build
TESTS_PATH: examples_dd3d
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Delete old libs folder
shell: bash
run: |
rm -rf addons/${{env.ADDON_DIR}}/libs
- name: Download Binaries
uses: actions/download-artifact@v4
with:
path: addons/${{env.ADDON_DIR}}/libs
name: ${{needs.collect-gdextension.outputs.artifact_name}}
- name: Prepare Test Project
shell: bash
run: |
cp -r addons ${{env.PROJECT_PATH}}/addons
cp -r ${{env.TESTS_PATH}} ${{env.PROJECT_PATH}}/${{env.TESTS_PATH}}
find ${{env.PROJECT_PATH}} -mindepth 1
- name: Setup Godot 4.1
uses: ./.github/actions/setup_godot
id: setup_godot_4_1
with:
tag: 4.1.4-stable
file_suffix: ${{matrix.file_suffix}}
download_export_templates: false
is_mono: false
- name: Setup Godot 4.2
uses: ./.github/actions/setup_godot
id: setup_godot_4_2
with:
tag: 4.2.2-stable
file_suffix: ${{matrix.file_suffix}}
download_export_templates: false
is_mono: false
- name: Setup Godot 4.3
uses: ./.github/actions/setup_godot
id: setup_godot_4_3
with:
tag: 4.3-stable
file_suffix: ${{matrix.file_suffix}}
download_export_templates: false
is_mono: false
- name: macOS dependencies
shell: bash
if: runner.os == 'macOS'
run: |
brew install coreutils
alias timeout="gtimeout"
- name: Test runs
shell: bash --noprofile --norc -o pipefail {0}
run: |
run_tests() {
godot_exe="$1"
echo "::group::🧪Testing '$godot_exe'"
max_attempts=3
current_attempt=1
last_exit_code=0
# Cleanup
rm -f "${{env.PROJECT_PATH}}/SUCCESS"
rm -rf "${{env.PROJECT_PATH}}/.godot"
until [ $current_attempt -gt $max_attempts ]; do
current_attempt=$((current_attempt + 1))
echo "============================================="
echo "🛒 Project preparation"
echo "============================================="
timeout 2m $godot_exe -v -e --headless --path ${{env.PROJECT_PATH}} --quit || true
echo "============================================="
echo "✅ --check-only test without MainLoop"
echo "============================================="
timeout 2m $godot_exe -v --headless --path ${{env.PROJECT_PATH}} --check-only --script res://check-only_test.gd
if [ $? -ne 0 ]; then
echo "[$godot_exe] The test without MainLoop failed. Exiting."
exit 1
fi
echo "============================================="
echo "🧪 Actual testing"
echo "============================================="
timeout 2m $godot_exe -v --headless --path ${{env.PROJECT_PATH}} res://headless_test.tscn || true
if [ ! -f "${{env.PROJECT_PATH}}/SUCCESS" ]; then
echo "[$godot_exe] The file reporting success has not been created! Failed."
last_exit_code=1
else
echo "[$godot_exe] The file reporting success has been created! Success!"
return 0
fi
done
echo "[$godot_exe] The maximum number of attempts has been reached. Last error code: $?"
exit $last_exit_code
}
run_tests "${{steps.setup_godot_4_1.outputs.godot}}"
echo "::endgroup::"
run_tests "${{steps.setup_godot_4_2.outputs.godot}}"
echo "::endgroup::"
run_tests "${{steps.setup_godot_4_3.outputs.godot}}"
echo "::endgroup::"