name: 'Build and Test' on: push: schedule: # Build and test daily. - cron: 0 11 * * * env: # Caches should be automatically invalidated when versions change, # but invalidation can be forced by incrementing these numbers. EMSCRIPTEN_CACHE_VERSION: 1 EXPORT_TEMPLATE_CACHE_VERSION: 1 GODOT_CACHE_VERSION: 1 jobs: build_docker: name: 'Build Docker (linux, ${{ matrix.target }}, ${{ matrix.bits }})' runs-on: ubuntu-22.04 strategy: fail-fast: false matrix: target: [ release, debug ] bits: [ 64, 32 ] steps: - uses: actions/checkout@v3 with: submodules: recursive - name: Cache submodules uses: ./.github/actions/cache-submodules id: cache-submodules with: platform: linux target: ${{ matrix.target }} bits: ${{ matrix.bits }} - 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.0 continue-on-error: true - name: Build godot-cpp bindings if: steps.cache-submodules.outputs.cache-hit != 'true' working-directory: addons/godot_xterm/native run: | docker-compose build godot-cpp-linux UID_GID="$(id -u):$(id -g)" docker-compose run -e TARGET=${{ matrix.target }} -e BITS=${{ matrix.bits }} godot-cpp-linux - 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 BITS=${{ matrix.bits }} 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 BITS=${{ matrix.bits }} libgodot-xterm-linux - name: Upload binaries uses: actions/upload-artifact@v3 with: name: libgodot-xterm-${{ matrix.target }} path: | addons/godot_xterm/native/bin/*.so build_native: name: 'Build Native' runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: platform: [ javascript, osx, windows ] target: [ release, debug ] bits: [ 64, 32 ] include: - platform: javascript os: ubuntu-22.04 - platform: osx os: macos-12 - platform: windows os: windows-2022 exclude: - platform: javascript bits: 64 # Currently only wasm32 is supported. - platform: osx bits: 32 # Only 64-bit supported on macOS. steps: - uses: actions/checkout@v3 with: submodules: recursive - name: Cache submodules uses: ./.github/actions/cache-submodules id: cache-submodules with: platform: ${{ matrix.platform }} target: ${{ matrix.target }} bits: ${{ matrix.bits }} - name: Cache emscripten if: ${{ matrix.platform == 'javascript' }} uses: actions/cache@v3 env: cache-name: cache-emscripten with: path: addons/godot_xterm/native/.emcache key: emsdk-cache-${{ matrix.target }}-v${{ env.EMSCRIPTEN_CACHE_VERSION }} - name: Install javascript build dependencies if: ${{ matrix.platform == 'javascript' }} # Previously mymindstorm/setup-emsdk@v11, but hasn't been updated to Node.js 16. # Should be able to switch back once it has. uses: jeetiss/setup-emsdk@fafd6dd1fc20488845d49b760fd143dfcd7f133c with: version: 3.1.14 actions-cache-folder: emsdk-cache-${{ matrix.target }} - name: Install additional javascript build dependencies if: ${{ matrix.platform == 'javascript' }} run: sudo apt-get update && sudo apt-get install -y scons gcc-multilib g++-multilib - name: Install additional macos build dependencies if: ${{ matrix.os == 'macos-12' }} run: brew install scons - name: Install additional windows build dependencies if: ${{ matrix.os == 'windows-2022' }} run: python -m pip install scons - name: Setup MSVC command prompt uses: ilammy/msvc-dev-cmd@v1 if: ${{ matrix.os == 'windows-2022' }} with: arch: win${{ matrix.bits }} - name: Build godot-cpp bindings if: steps.cache-submodules.outputs.cache-hit != 'true' run: | cd addons/godot_xterm/native/thirdparty/godot-cpp scons platform=${{ matrix.platform }} target=${{ matrix.target }} bits=${{ matrix.bits }} generate_bindings=yes -j2 - name: Setup cmake if: steps.cache-submodules.outputs.cache-hit != 'true' uses: jwlawson/actions-setup-cmake@v1 with: cmake-version: '3.23.2' use-32bit: ${{ matrix.bits == 32 && matrix.os == 'windows-2022' }} - name: Build libuv if: steps.cache-submodules.outputs.cache-hit != 'true' shell: bash env: TARGET: ${{ matrix.target }} BITS: ${{ matrix.bits }} OS: ${{ matrix.os }} 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 "$OS" == "windows-2022" ]; 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: Build libgodot-xterm run: | cd addons/godot_xterm/native scons platform=${{ matrix.platform }} target=${{ matrix.target }} bits=${{ matrix.bits }} -j2 - name: Upload binaries uses: actions/upload-artifact@v3 with: name: libgodot-xterm-${{ matrix.target }} path: | addons/godot_xterm/native/bin/*.wasm addons/godot_xterm/native/bin/*.dylib addons/godot_xterm/native/bin/*.dll html5_export: name: 'HTML5 Export' needs: [ build_docker, build_native ] runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v3 - name: Setup Godot uses: lihop/setup-godot@v2 with: export-templates: true - name: Install binary build artifacts uses: actions/download-artifact@v3 with: name: libgodot-xterm-release path: addons/godot_xterm/native/bin - name: Import assets uses: nick-fields/retry@v2 with: command: godot --editor .github/import_assets.tscn retry_on: error timeout_minutes: 5 max_attempts: 6 - name: Export HTML5 uses: nick-fields/retry@v2 with: command: godot --no-window --export HTML5 retry_on: error timeout_minutes: 5 max_attempts: 6 - name: NPM cache uses: actions/setup-node@v3 with: cache: 'npm' cache-dependency-path: test/html5/package-lock.json - name: Smoke test HTML5 export 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@v3 if: ${{ failure() }} with: name: cypress-artifacts path: |- test/html5/cypress/screenshots test/html5/cypress/videos - name: Upload export uses: actions/upload-artifact@v3 with: name: html5-demo path: docs/demo test: name: 'Test' needs: [ build_docker, build_native ] runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ windows-2022, macos-12, ubuntu-22.04 ] bits: [ 64, 32 ] godot_version: [ 'v3.4.5-stable', 'v3.5-stable' ] exclude: - os: macos-12 bits: 32 steps: - uses: actions/checkout@v3 - name: Setup Godot uses: lihop/setup-godot@v2 with: version: ${{ matrix.godot_version }} bits: ${{ matrix.bits }} - name: Install binary build artifacts uses: actions/download-artifact@v3 with: name: libgodot-xterm-release path: addons/godot_xterm/native/bin - name: Run tests uses: nick-fields/retry@v2 with: shell: bash command: godot --no-window -s addons/gut/gut_cmdln.gd -gconfig=test/.gutconfig.ci.json retry_on: error timeout_minutes: 5 max_attempts: 6 - name: Run unix tests if: ${{ matrix.os != 'windows-2022' }} uses: nick-fields/retry@v2 with: command: godot --no-window -s addons/gut/gut_cmdln.gd -gconfig=test/.gutconfig.unix.json retry_on: error timeout_minutes: 5 max_attempts: 6 # Git archive should only include addons/godot_xterm directory. check-archive: name: 'Check Archive' runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v3 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 directory run: | shopt -s nullglob dotglob ls -lR /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-code-format: name: 'Check Code Format' runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v3 - uses: actions/setup-python@v4 with: python-version: 3.x - name: GDFormat Check run: | python -m pip install -r requirements.txt gdformat -c .