name: "Build and Test" on: push: schedule: # Build and test daily. - cron: 0 11 * * * jobs: build-linux: name: Build (linux, ${{ matrix.arch }}, ${{ matrix.target }}) runs-on: ubuntu-22.04 strategy: fail-fast: false matrix: arch: [x86_64, x86_32] target: [release, debug] steps: - uses: actions/checkout@v4 with: submodules: recursive - name: Cache submodules uses: ./.github/actions/cache-submodules id: cache-submodules with: platform: linux arch: ${{ matrix.arch }} target: ${{ matrix.target }} - name: Pull docker images run: docker-compose pull working-directory: addons/godot_xterm/native - name: Cache docker image layers uses: jpribyl/action-docker-layer-caching@v0.1.1 continue-on-error: true - name: Ensure scons cache exists run: mkdir -p ${{github.workspace}}/.scons-cache - name: Build libuv if: steps.cache-submodules.outputs.cache-hit != 'true' working-directory: addons/godot_xterm/native run: UID_GID="$(id -u):$(id -g)" docker-compose run -e TARGET=${{ matrix.target }} -e ARCH=${{ matrix.arch }} -v ${{github.workspace}}/.scons-cache:/scons-cache libuv-linux - name: Build libgodot-xterm working-directory: addons/godot_xterm/native run: UID_GID="$(id -u):$(id -g)" docker-compose run -e TARGET=${{ matrix.target }} -e ARCH=${{ matrix.arch }} -v ${{github.workspace}}/.scons-cache:/scons-cache libgodot-xterm-linux - name: Upload binaries uses: actions/upload-artifact@v4 with: name: libgodot-xterm-linux-${{ matrix.arch }}-${{ matrix.target }} path: addons/godot_xterm/native/bin/*.so build-other-platforms: name: Build (${{ matrix.platform }}, ${{ matrix.arch }}, ${{ matrix.target}}) runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: platform: [web, macos, windows] target: [release, debug] bits: [64, 32] exclude: - platform: web bits: 64 - platform: macos bits: 32 include: - platform: web os: ubuntu-22.04 - platform: macos os: macos-12 - platform: windows os: windows-2022 - platform: web arch: wasm32 - platform: macos arch: universal - platform: windows bits: 64 arch: x86_64 - platform: windows bits: 32 arch: x86_32 steps: - uses: actions/checkout@v4 with: submodules: recursive - name: Cache submodules uses: ./.github/actions/cache-submodules id: cache-submodules with: platform: ${{ matrix.platform }} target: ${{ matrix.target }} arch: ${{ matrix.arch }} - name: Cache emscripten if: ${{ matrix.platform == 'web' }} uses: actions/cache@v3 env: cache-name: cache-emscripten with: path: addons/godot_xterm/native/.emcache key: emsdk-cache-${{ matrix.target }}-${{ hashFiles('**/*.c*', '**/*.h*') }} restore-keys: | emsdk-cache-${{ matrix.target }}- - name: Install web build dependencies if: ${{ matrix.platform == 'web' }} uses: mymindstorm/setup-emsdk@v11 with: version: 3.1.14 actions-cache-folder: emsdk-cache-${{ matrix.target }} - name: Install additional web build dependencies if: ${{ matrix.platform == 'web' }} run: sudo apt-get update && sudo apt-get install -y scons gcc-multilib g++-multilib - name: Install additional macos build dependencies if: ${{ matrix.platform == 'macos' }} run: brew install scons - name: Install additional windows build dependencies if: ${{ matrix.platform == 'windows' }} run: python -m pip install scons - name: Setup MSVC command prompt uses: ilammy/msvc-dev-cmd@v1 if: ${{ matrix.platform == 'windows' }} with: arch: win${{ matrix.bits }} - name: Setup cmake if: steps.cache-submodules.outputs.cache-hit != 'true' uses: jwlawson/actions-setup-cmake@v2 with: cmake-version: "3.23.2" use-32bit: ${{ matrix.bits == 32 && matrix.platform == 'windows' }} - name: Build libuv if: steps.cache-submodules.outputs.cache-hit != 'true' shell: bash env: PLATFORM: ${{ matrix.platform }} TARGET: ${{ matrix.target }} BITS: ${{ matrix.bits }} run: | cd addons/godot_xterm/native/thirdparty/libuv args="-DCMAKE_BUILD_TYPE=$TARGET -DBUILD_SHARED_LIBS=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ -DCMAKE_OSX_ARCHITECTURES=x86_64;arm64" if [ "$TARGET" == "release" ]; then args="$args -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDLL" else args="$args -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDebugDLL" fi if [ "$BITS" -eq 32 -a "$PLATFORM" == "windows" ]; then cmake -G "Visual Studio 17 2022" -A Win32 -S $(pwd) -B "build" $args else mkdir build || true cd build if [ "$BITS" -eq 32 ]; then args="$args -DCMAKE_SYSTEM_PROCESSOR=i686 -DCMAKE_C_FLAGS=-m32"; fi cmake .. $args cd .. fi cmake --build build --config $TARGET - name: Ensure scons cache exists run: mkdir -p ${{github.workspace}}/.scons-cache shell: bash - name: Build libgodot-xterm env: SCONS_CACHE: ${{github.workspace}}/.scons-cache run: | cd addons/godot_xterm/native scons platform=${{ matrix.platform }} target=template_${{ matrix.target }} arch=${{ matrix.arch }} -j2 - name: Upload binaries uses: actions/upload-artifact@v4 with: name: libgodot-xterm-${{ matrix.platform }}-${{ matrix.arch }}-${{ matrix.target }} path: | addons/godot_xterm/native/bin/*.so addons/godot_xterm/native/bin/*.wasm addons/godot_xterm/native/bin/*.framework addons/godot_xterm/native/bin/spawn-helper addons/godot_xterm/native/bin/*.xcframework addons/godot_xterm/native/bin/*.dll html5-export: name: "HTML5 Export" needs: [check-archive, check-pre-commit] runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 - name: Setup Godot uses: lihop/setup-godot@v2 with: version: "4.2.1-stable" - name: Import assets run: godot --editor --headless --quit-after 100 || true - name: Wait for build uses: fountainhead/action-wait-for-check@v1.1.0 with: token: ${{ secrets.GITHUB_TOKEN }} checkName: Build (web, wasm32, release) ref: ${{ github.event.pull_request.head.sha || github.sha }} - name: Install binary build artifacts uses: actions/download-artifact@v4 with: path: addons/godot_xterm/native/bin merge-multiple: true # Some remaining steps temporarily disabled. - name: Export HTML5 if: false uses: nick-fields/retry@v3 with: command: godot --no-window --export HTML5 retry_on: error timeout_minutes: 5 max_attempts: 6 - name: NPM cache uses: c-hive/gha-npm-cache@v1 with: directory: test/html5 - name: Smoke test HTML5 export if: false shell: bash working-directory: test/html5 run: | npm ci npx serve ../../docs/demo -p 3000 & npx cypress run - name: Upload cypress artifacts (on failure) uses: actions/upload-artifact@v4 if: false #if: ${{ failure() }} with: name: cypress-artifacts path: |- test/html5/cypress/screenshots test/html5/cypress/videos - name: Upload export if: false uses: actions/upload-artifact@v4 with: name: html5-demo path: docs/demo test: name: Test (${{ matrix.platform }}, ${{ matrix.arch }}, ${{ matrix.test-type }}, debug) runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: platform: [linux, macos, windows] bits: [64, 32] test-type: [headless, rendering, unix] exclude: - platform: macos bits: 32 - platform: windows test-type: rendering - platform: windows test-type: unix include: - platform: linux os: ubuntu-22.04 - platform: macos os: macos-12 - platform: windows os: windows-2022 - platform: linux bits: 64 arch: x86_64 - platform: linux bits: 32 arch: x86_32 - platform: macos arch: universal - platform: windows bits: 64 arch: x86_64 - platform: windows bits: 32 arch: x86_32 steps: - uses: actions/checkout@v4 - name: Setup Godot uses: lihop/setup-godot@v2 with: version: "4.2.1-stable" - name: Macos setup if: ${{ matrix.platform == 'macos' && matrix.test-type == 'rendering' }} run: | # Some macos runners have metal which means we can use vulkan, others don't. if system_profiler SPDisplaysDataType | grep -q "Metal"; then echo RENDERING_DRIVER=vulkan >> .env brew install molten-vk else echo RENDERING_DRIVER=opengl3 >> .env fi - name: Install just uses: taiki-e/install-action@just - name: Install dependencies run: just install - name: Import assets shell: bash run: godot --editor --headless --quit-after 100 || true - name: Wait for build uses: fountainhead/action-wait-for-check@v1.1.0 with: token: ${{ secrets.GITHUB_TOKEN }} checkName: Build (${{ matrix.platform }}, ${{ matrix.arch }}, debug) ref: ${{ github.event.pull_request.head.sha || github.sha }} - name: Install binary build artifacts uses: actions/download-artifact@v4 with: path: addons/godot_xterm/native/bin merge-multiple: true - name: Set spawn-helper file permissions if: ${{ matrix.platform == 'macos' }} # File permissions are not preserved by upload-artifact. run: chmod +x addons/godot_xterm/native/bin/spawn-helper - name: Test shell: bash run: | if [ "${{ matrix.test-type }}" = "headless" ]; then just test else just test-${{ matrix.test-type }} fi merge-artifacts: name: Merge Artifacts runs-on: ubuntu-latest needs: [build-linux, build-other-platforms, test, html5-export] strategy: matrix: target: [release, debug] steps: - uses: actions/upload-artifact/merge@v4 with: name: libgodot-xterm-${{ matrix.target }} pattern: "*-${{ matrix.target }}" delete-merged: true # Git archive should only include addons/godot_xterm directory. check-archive: name: "Check Archive" runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 with: submodules: recursive - name: Create git archive run: git archive -o archive.zip HEAD - name: Extract archive run: mkdir -p /tmp/unzipped && unzip archive.zip -d /tmp/unzipped - name: Check that archive only contains addons/godot_xterm directory run: | shopt -s nullglob dotglob ls -laR /tmp/unzipped files=(/tmp/unzipped/*) if [ ${#files[@]} -ne 1 ]; then echo "Wrong number of files in archive (${#files[@]}) expected 1." exit 1 fi if [ ! -d "/tmp/unzipped/addons" ]; then echo "Expected directory (addons) not found." exit 1 fi files=(/tmp/unzipped/addons) if [ ${#files[@]} -ne 1 ]; then echo "Wrong number of files in addons directory (${#files[@]}) expected 1." exit 1 fi if [ ! -d "/tmp/unzipped/addons/godot_xterm" ]; then echo "Expected directory (addons/godot_xterm) not found." exit 1 fi check-pre-commit: name: "Check Pre-Commit" runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 - uses: pre-commit/action@v3.0.1