Preserve externally visible names during optimization #869
Workflow file for this run
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: CI (build & test) | |
| on: | |
| push: | |
| branches: [ master ] | |
| pull_request: | |
| types: [opened, synchronize, reopened] | |
| concurrency: | |
| group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| # Master pushes exercise every supported host. Pull requests use one Linux job | |
| # so that the normal feedback loop does not spend four runner-minutes on the | |
| # same compiler test suite; the full host matrix still runs before release. | |
| build: | |
| name: Gradle build on ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: ${{ fromJSON(github.event_name == 'push' && '["ubuntu-latest","windows-latest","macos-latest","macos-15-intel"]' || '["ubuntu-latest"]') }} | |
| runs-on: ${{ matrix.os }} | |
| permissions: | |
| checks: write | |
| contents: read | |
| env: | |
| JAVA_TOOL_OPTIONS: >- | |
| -XX:+UseCompactObjectHeaders | |
| -XX:+UseStringDeduplication | |
| --enable-native-access=ALL-UNNAMED | |
| GRADLE_OPTS: -Dorg.gradle.daemon=false | |
| defaults: | |
| run: | |
| working-directory: de.peeeq.wurstscript | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Setup Temurin JDK 25 | |
| uses: actions/setup-java@v4 | |
| with: | |
| distribution: temurin | |
| java-version: '25' | |
| cache: 'gradle' | |
| # Linux only: use a portable, pristine Temurin 25 for jlink | |
| - name: (Linux) Install portable Temurin 25 | |
| if: runner.os == 'Linux' | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| URL="https://github.com/adoptium/temurin25-binaries/releases/download/jdk-25%2B36/OpenJDK25U-jdk_x64_linux_hotspot_25_36.tar.gz" | |
| mkdir -p "$RUNNER_TEMP/temurin25" | |
| curl -fsSL "$URL" -o "$RUNNER_TEMP/temurin25/jdk.tar.gz" | |
| tar -xzf "$RUNNER_TEMP/temurin25/jdk.tar.gz" -C "$RUNNER_TEMP/temurin25" | |
| PORTABLE_JAVA_HOME="$(find "$RUNNER_TEMP/temurin25" -maxdepth 1 -type d -name 'jdk-25*' | head -n1)" | |
| echo "PORTABLE_JAVA_HOME=$PORTABLE_JAVA_HOME" >> "$GITHUB_ENV" | |
| echo "$PORTABLE_JAVA_HOME/bin" >> "$GITHUB_PATH" | |
| # Pin Gradle toolchain to the active JDK (portable on Linux, setup-java on Windows) | |
| - name: Pin Gradle toolchain | |
| shell: bash | |
| run: | | |
| ACTIVE_JAVA_HOME="${PORTABLE_JAVA_HOME:-$JAVA_HOME}" | |
| echo "JAVA_HOME=${ACTIVE_JAVA_HOME}" >> "$GITHUB_ENV" | |
| echo "${ACTIVE_JAVA_HOME}/bin" >> "$GITHUB_PATH" | |
| echo "org.gradle.java.installations.paths=${ACTIVE_JAVA_HOME}" >> gradle.properties | |
| echo "org.gradle.java.installations.auto-detect=false" >> gradle.properties | |
| - name: Show Java & jlink | |
| shell: bash | |
| run: | | |
| echo "JAVA_HOME=$JAVA_HOME" | |
| "$JAVA_HOME/bin/java" -version | |
| "$JAVA_HOME/bin/jlink" --version | |
| - name: Validate Gradle wrapper | |
| uses: gradle/actions/wrapper-validation@v4 | |
| - name: Setup Gradle (cache) | |
| uses: gradle/actions/setup-gradle@v4 | |
| # Packaging is a release artifact, not a pull-request gate. Keeping it on | |
| # master avoids paying for a second full build on every PR update. | |
| - name: Package slim runtime (fail fast) | |
| if: github.event_name == 'push' | |
| shell: bash | |
| run: ./gradlew packageSlimCompilerDist --no-daemon --stacktrace | |
| - name: Prepare bundled Lua runtime (Linux) | |
| if: runner.os == 'Linux' | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| # Use Ubuntu's maintained Lua 5.3 build. The checked-in portable | |
| # binary is linked against libreadline.so.6, which is absent from | |
| # current runner images. | |
| sudo apt-get update -qq | |
| sudo apt-get install -y --no-install-recommends lua5.3 | |
| lua5.3 -e 'assert(_VERSION == "Lua 5.3")' | |
| luac5.3 -v | |
| # These binaries are tracked with mode 0644 for cross-platform | |
| # checkouts; keep them usable as a fallback for local/older images. | |
| chmod +x src/test/resources/lua53 src/test/resources/luac53 | |
| - name: Install Lua compiler (macOS) | |
| if: runner.os == 'macOS' | |
| env: | |
| HOMEBREW_NO_AUTO_UPDATE: '1' | |
| shell: bash | |
| run: brew install lua | |
| - name: Run tests | |
| shell: bash | |
| run: | | |
| if [[ "${{ github.event_name }}" == "push" && "${{ runner.os }}" == "Linux" ]]; then | |
| ./gradlew test jacocoTestReport --no-daemon --stacktrace --quiet | |
| else | |
| ./gradlew test --no-daemon --stacktrace --quiet | |
| fi | |
| - name: Upload coverage to Coveralls | |
| if: github.event_name == 'push' && runner.os == 'Linux' | |
| uses: coverallsapp/github-action@v2 | |
| with: | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| file: de.peeeq.wurstscript/build/reports/jacoco/test/jacocoTestReport.xml | |
| format: jacoco | |
| - name: Report test results | |
| if: always() | |
| uses: mikepenz/action-junit-report@v4 | |
| with: | |
| report_paths: de.peeeq.wurstscript/build/test-results/**/*.xml | |
| check_name: Test Results (${{ matrix.os }}) | |
| fail_on_failure: false | |
| # luaOutputIsDeterministicForGenericOverrideSlots compiles one program twice and keeps both | |
| # scripts when they differ. They are written to the runner's filesystem, so without this the | |
| # evidence goes with the runner and the failure is as unactionable as it was before it kept | |
| # anything. Most failures are not this test, hence if-no-files-found: ignore. | |
| - name: Upload determinism scripts (on failure) | |
| if: failure() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: determinism-scripts-${{ matrix.os }} | |
| path: | | |
| de.peeeq.wurstscript/test-output/determinism-first.lua | |
| de.peeeq.wurstscript/test-output/determinism-second.lua | |
| if-no-files-found: ignore | |
| retention-days: 14 | |
| - name: Upload packaged artifact (per-OS) | |
| if: github.event_name == 'push' | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: wurst-compiler-${{ matrix.os }} | |
| path: | | |
| de.peeeq.wurstscript/build/releases/*.zip | |
| de.peeeq.wurstscript/build/releases/*.tar.gz | |
| de.peeeq.wurstscript/build/releases/*.sha256 | |
| if-no-files-found: error | |
| retention-days: 7 | |
| nightly_release: | |
| name: Nightly prerelease (master) | |
| needs: build | |
| if: github.ref == 'refs/heads/master' && github.event_name == 'push' | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: write | |
| steps: | |
| - name: Checkout (to update nightly tag) | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Move 'nightly' tag to this commit | |
| run: | | |
| git config user.name "github-actions[bot]" | |
| git config user.email "github-actions[bot]@users.noreply.github.com" | |
| git tag -f nightly "$GITHUB_SHA" | |
| git push origin nightly --force | |
| - name: Download all packaged artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| path: artifacts | |
| - name: Gather files (zip only) | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| mkdir -p upload | |
| find artifacts -type f -name '*.zip' -print0 | xargs -0 -I{} cp "{}" upload/ | |
| - name: Verify we have all platform zips | |
| shell: bash | |
| run: | | |
| shopt -s nullglob | |
| zips=(upload/*.zip) | |
| echo "Found ${#zips[@]} zip(s):"; ls -alh upload | |
| if (( ${#zips[@]} < 4 )); then | |
| echo "ERROR: expected Win + Linux + macOS arm64 + macOS x64 zips (got ${#zips[@]})." | |
| exit 1 | |
| fi | |
| - name: Normalize nightly filenames | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| for f in upload/*.zip; do | |
| base="$(basename "$f")" | |
| stem="${base%.zip}" | |
| new_stem="$(echo "$stem" | sed -E 's/-[0-9]+(\.[0-9]+)*-/-nightly-/' )" | |
| new="upload/${new_stem}.zip" | |
| if [[ "upload/$base" != "$new" ]]; then mv -f "upload/$base" "$new"; fi | |
| done | |
| echo "Renamed to:"; ls -alh upload | |
| # Keep the existing release metadata and stable download URLs. The release | |
| # action PATCHes the release before uploading, which GitHub currently | |
| # rejects for the Actions integration even with contents: write. | |
| - name: Ensure Nightly Release exists | |
| shell: bash | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| run: | | |
| set -euo pipefail | |
| if ! gh release view nightly >/dev/null 2>&1; then | |
| gh release create nightly \ | |
| --verify-tag \ | |
| --prerelease \ | |
| --title "Nightly Build (master)" \ | |
| --notes $'Nightly build for the latest commit on `master`.\nThis release is automatically updated on each push.' | |
| fi | |
| - name: Publish Nightly Release assets | |
| shell: bash | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| run: gh release upload nightly upload/*.zip --clobber |