Nightly build #18
This file contains hidden or 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: Nightly build | |
| on: | |
| schedule: | |
| # Run at 00:00 UTC every day | |
| - cron: '0 0 * * *' | |
| workflow_dispatch: | |
| # Allow manual trigger from Actions tab | |
| permissions: | |
| contents: write | |
| jobs: | |
| tag-and-build: | |
| name: Tag nightly and build (${{ matrix.os }}) | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - os: ubuntu-latest | |
| artifact: basic-linux | |
| archive: basic-linux.tar.gz | |
| outdir: linux | |
| bin: basic | |
| build_gfx: true | |
| - os: macos-latest | |
| artifact: basic-macos | |
| archive: basic-macos.tar.gz | |
| outdir: mac | |
| bin: basic | |
| build_gfx: true | |
| - os: windows-latest | |
| artifact: basic-windows | |
| archive: basic-windows.zip | |
| outdir: windows | |
| bin: basic.exe | |
| build_gfx: true | |
| steps: | |
| - name: Checkout main | |
| uses: actions/checkout@v4 | |
| with: | |
| ref: main | |
| fetch-depth: 0 | |
| - name: Update nightly tag | |
| if: runner.os == 'Linux' | |
| run: | | |
| git config user.name "github-actions[bot]" | |
| git config user.email "github-actions[bot]@users.noreply.github.com" | |
| git tag -f nightly | |
| git push -f origin nightly | |
| - name: Install raylib (Linux) | |
| if: runner.os == 'Linux' && matrix.build_gfx | |
| run: | | |
| set -e | |
| sudo apt-get update | |
| if sudo apt-get install -y libraylib-dev; then | |
| echo "Installed libraylib-dev from apt" | |
| else | |
| echo "libraylib-dev not available; building raylib from source" | |
| sudo apt-get install -y build-essential cmake git pkg-config \ | |
| libasound2-dev libx11-dev libxrandr-dev libxi-dev \ | |
| libxinerama-dev libxcursor-dev libgl1-mesa-dev libglu1-mesa-dev | |
| git clone --depth 1 https://github.com/raysan5/raylib.git /tmp/raylib | |
| cmake -S /tmp/raylib -B /tmp/raylib/build -DBUILD_SHARED_LIBS=ON | |
| cmake --build /tmp/raylib/build --config Release | |
| sudo cmake --install /tmp/raylib/build | |
| echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/raylib.conf | |
| sudo ldconfig | |
| fi | |
| - name: Install raylib (macOS) | |
| if: runner.os == 'macOS' && matrix.build_gfx | |
| run: | | |
| set -e | |
| export HOMEBREW_NO_AUTO_UPDATE=1 | |
| brew install raylib | |
| - name: Build (Unix) | |
| if: runner.os != 'Windows' | |
| run: | | |
| make | |
| if [ "${{ matrix.build_gfx }}" = "true" ]; then | |
| make basic-gfx | |
| fi | |
| - name: Run trek demo (piped) | |
| if: runner.os != 'Windows' | |
| run: | | |
| set -e | |
| sh tests/trek_test.sh >/dev/null | |
| - name: Run tests (Unix) | |
| if: runner.os != 'Windows' | |
| run: | | |
| set -e | |
| for t in tests/*.bas; do | |
| case "$(basename "$t")" in | |
| codes-replaced.bas|locate.bas|get_input_loop.bas|get_while_test.bas|kbuffer.bas|border_option_test.bas|gfx_title_test.bas) | |
| echo "Skipping interactive/GET/GFX-only test $t" | |
| continue | |
| ;; | |
| meta_include_dup_line.bas|meta_include_dup_label.bas|meta_include_circular_a.bas|meta_include_circular_b.bas) | |
| echo "Skipping expected-fail meta test $t" | |
| continue | |
| ;; | |
| esac | |
| echo "Running $t" | |
| ./basic -petscii "$t" >/dev/null | |
| done | |
| - name: Setup MSYS2 (Windows, for raylib) | |
| if: runner.os == 'Windows' && matrix.build_gfx | |
| uses: msys2/setup-msys2@v2 | |
| with: | |
| msystem: MINGW64 | |
| update: true | |
| install: >- | |
| mingw-w64-x86_64-gcc | |
| mingw-w64-x86_64-make | |
| mingw-w64-x86_64-pkg-config | |
| mingw-w64-x86_64-raylib | |
| - name: Build (Windows) | |
| if: runner.os == 'Windows' | |
| shell: msys2 {0} | |
| run: | | |
| set -e | |
| mingw32-make | |
| if [ "${{ matrix.build_gfx }}" = "true" ]; then | |
| mingw32-make basic-gfx | |
| fi | |
| - name: Run tests (Windows) | |
| if: runner.os == 'Windows' | |
| shell: msys2 {0} | |
| run: | | |
| set -e | |
| for t in tests/*.bas; do | |
| case "$(basename "$t")" in | |
| codes-replaced.bas|locate.bas|get_input_loop.bas|get_while_test.bas|kbuffer.bas|border_option_test.bas|gfx_title_test.bas) | |
| echo "Skipping interactive/GET/GFX-only test $t" | |
| continue | |
| ;; | |
| meta_include_dup_line.bas|meta_include_dup_label.bas|meta_include_circular_a.bas|meta_include_circular_b.bas) | |
| echo "Skipping expected-fail meta test $t" | |
| continue | |
| ;; | |
| esac | |
| echo "Running $t" | |
| ./basic.exe -petscii "$t" >/dev/null | |
| done | |
| - name: Package artifact (Unix) | |
| if: runner.os != 'Windows' | |
| run: | | |
| mkdir -p out/${{ matrix.outdir }} | |
| cp ${{ matrix.bin }} out/${{ matrix.outdir }}/basic | |
| if [ "${{ matrix.build_gfx }}" = "true" ] && [ -f basic-gfx ]; then | |
| cp basic-gfx out/${{ matrix.outdir }}/basic-gfx | |
| fi | |
| cp -r examples out/${{ matrix.outdir }}/ | |
| cd out | |
| tar czf ${{ matrix.archive }} ${{ matrix.outdir }} | |
| - name: Package artifact (Windows) | |
| if: runner.os == 'Windows' | |
| shell: msys2 {0} | |
| run: | | |
| mkdir -p out/${{ matrix.outdir }} | |
| cp ${{ matrix.bin }} out/${{ matrix.outdir }}/basic.exe | |
| if [ "${{ matrix.build_gfx }}" = "true" ] && [ -f basic-gfx.exe ]; then | |
| cp basic-gfx.exe out/${{ matrix.outdir }}/basic-gfx.exe | |
| # Bundle raylib and its dependencies so basic-gfx.exe runs without MSYS2 | |
| for dll in libraylib.dll glfw3.dll; do | |
| [ -f /mingw64/bin/$dll ] && cp /mingw64/bin/$dll out/${{ matrix.outdir }}/ | |
| done | |
| fi | |
| cp -r examples out/${{ matrix.outdir }}/ | |
| cd out | |
| powershell -Command "Compress-Archive -Path '${{ matrix.outdir }}' -DestinationPath '${{ matrix.archive }}'" | |
| - name: Upload build artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ${{ matrix.artifact }} | |
| path: out/${{ matrix.archive }} | |
| wasm: | |
| name: Web / WASM build + browser test | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout main | |
| uses: actions/checkout@v4 | |
| with: | |
| ref: main | |
| fetch-depth: 1 | |
| - name: Install Emscripten (emsdk) | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y python3 git | |
| git clone --depth 1 https://github.com/emscripten-core/emsdk.git "$GITHUB_WORKSPACE/emsdk" | |
| cd "$GITHUB_WORKSPACE/emsdk" | |
| ./emsdk install latest | |
| ./emsdk activate latest | |
| - name: Build WASM | |
| run: | | |
| source "$GITHUB_WORKSPACE/emsdk/emsdk_env.sh" | |
| emcc --version | |
| make basic-wasm basic-wasm-modular basic-wasm-canvas | |
| - name: Set up Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: "3.12" | |
| - name: Install Playwright | |
| run: | | |
| pip install -r tests/requirements-wasm.txt | |
| python -m playwright install chromium --with-deps | |
| - name: Run WASM browser smoke tests | |
| run: | | |
| python3 tests/wasm_browser_test.py | |
| python3 tests/wasm_browser_canvas_test.py | |
| python3 tests/wasm_canvas_charset_test.py | |
| python3 tests/wasm_tutorial_embed_test.py | |
| - name: Package WASM artifact | |
| run: | | |
| mkdir -p out/wasm | |
| cp web/basic.js web/basic.wasm web/index.html out/wasm/ | |
| cp web/basic-modular.js web/basic-modular.wasm out/wasm/ | |
| cp web/tutorial-embed.js web/tutorial-example.html web/vfs-helpers.js out/wasm/ | |
| cp web/basic-canvas.js web/basic-canvas.wasm web/canvas.html out/wasm/ | |
| cp web/README.md out/wasm/ | |
| cd out | |
| tar czf rgc-basic-wasm.tar.gz wasm | |
| - name: Upload WASM artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: rgc-basic-wasm | |
| path: out/rgc-basic-wasm.tar.gz | |
| release: | |
| name: Publish nightly release | |
| needs: [tag-and-build, wasm] | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Download artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| path: dist | |
| - name: Delete existing nightly release | |
| run: | | |
| gh release delete nightly --yes 2>/dev/null || true | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Create nightly release | |
| uses: softprops/action-gh-release@v1 | |
| with: | |
| tag_name: nightly | |
| name: Nightly | |
| body: | | |
| Bleeding-edge build from `main`. Updated automatically every night. | |
| **Use stable [releases](https://github.com/${{ github.repository }}/releases) for production.** | |
| draft: false | |
| files: dist/**/* | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |