re-add nightly releases #77
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: | |
| build: | |
| name: Gradle build on ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: [ubuntu-latest, windows-latest] | |
| runs-on: ${{ matrix.os }} | |
| permissions: | |
| contents: read | |
| env: | |
| 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 | |
| # ---- FAIL FAST: package first (so jlink issues show immediately) ---- | |
| - name: Package slim runtime (fail fast) | |
| shell: bash | |
| run: ./gradlew checksumSlimCompilerDist --no-daemon --stacktrace | |
| - name: Run tests | |
| shell: bash | |
| run: ./gradlew test --no-daemon --stacktrace | |
| - name: Upload packaged artifact (per-OS) | |
| 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 # needed to publish a Release with GITHUB_TOKEN | |
| steps: | |
| - name: Download all packaged artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| path: artifacts | |
| # Copy only archives (skip .sha256 for nightly) | |
| - name: Gather files (zip + tar.gz, no checksums) | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| mkdir -p upload | |
| find artifacts -type f \( -name '*.zip' -o -name '*.tar.gz' \) -print0 | xargs -0 -I{} cp "{}" upload/ | |
| # Ensure both Windows (.zip) and Linux (.tar.gz) exist | |
| - name: Verify we have both archive types | |
| shell: bash | |
| run: | | |
| shopt -s nullglob | |
| zips=(upload/*.zip) | |
| tars=(upload/*.tar.gz) | |
| echo "Found ${#zips[@]} zip(s) and ${#tars[@]} tar.gz file(s)." | |
| if (( ${#zips[@]} == 0 || ${#tars[@]} == 0 )); then | |
| echo "ERROR: Expected both .zip (Windows) and .tar.gz (Linux) artifacts." | |
| ls -alR upload || true | |
| exit 1 | |
| fi | |
| # Rename artifacts to include 'nightly' instead of version | |
| - name: Normalize nightly filenames | |
| shell: bash | |
| run: | | |
| shopt -s nullglob | |
| for f in upload/*; do | |
| base="$(basename "$f")" | |
| new="$(echo "$base" | sed -E 's/([0-9]+\.[0-9]+(\.[0-9]+)*([.-][0-9A-Za-z]+)*)/nightly/; s/--/-/g')" | |
| if [[ "$base" != "$new" ]]; then | |
| mv -f "upload/$base" "upload/$new" | |
| fi | |
| done | |
| echo "After rename:" | |
| ls -alh upload | |
| - name: Publish Nightly Release (rolling 'nightly' tag) | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| tag_name: nightly # reuse same tag; no new tag per run | |
| name: Nightly Build (master) # stable title | |
| prerelease: true | |
| draft: false | |
| make_latest: false | |
| generate_release_notes: false | |
| body: | | |
| Nightly build for the latest commit on `master`. | |
| This release is automatically updated in-place (same tag). | |
| files: | | |
| upload/** | |
| fail_on_unmatched_files: false # single glob; we've verified both types exist | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |