name: Nightly Builds

on:
  schedule:
    - cron: "0 0 * * *"
  workflow_dispatch:

permissions: {}

jobs:
  pekko-cluster-metrics-sigar:
    name: Pekko Cluster Metrics Test with Sigar
    runs-on: ubuntu-22.04
    if: github.repository == 'apache/pekko'
    steps:
      - name: Checkout
        uses: actions/checkout@v5
        with:
          fetch-depth: 0
          fetch-tags: true

      - name: Setup Java 17
        uses: actions/setup-java@v5
        with:
          distribution: temurin
          java-version: 17

      - name: Install sbt
        uses: sbt/setup-sbt@17575ea4e18dd928fe5968dbe32294b97923d65b # v1.1.13

      - name: Cache Coursier cache
        uses: coursier/cache-action@4e2615869d13561d626ed48655e1a39e5b192b3c # v6.4.7

      - name: Enable jvm-opts
        run: cp .jvmopts-ci .jvmopts

      - name: sbt cluster-metrics/test
        env:
          DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
        run: |-
          sbt \
            -Djava.security.egd=file:/dev/./urandom \
            -Dpekko.test.sigar=true \
            -Dpekko.cluster.assert=on \
            -Dpekko.test.timefactor=2 \
            -Dpekko.actor.testkit.typed.timefactor=2 \
            -Dpekko.test.tags.exclude=gh-exclude,timing \
            -Dpekko.log.timestamps=true \
            -Dio.netty.leakDetection.level=PARANOID \
            -Dmultinode.XX:MetaspaceSize=128M \
            -Dmultinode.Xms256M \
            -Dmultinode.Xmx256M \
            -Dmultinode.Xlog:gc \
            -Dmultinode.XX:+AlwaysActAsServerClassMachine \
            clean cluster-metrics/test

  pekko-classic-remoting-tests:
    name: Pekko Classic Remoting Tests
    runs-on: ubuntu-22.04
    if: github.repository == 'apache/pekko'
    strategy:
      fail-fast: false
      matrix:
        command:
          - cluster/test distributed-data/test cluster-tools/test cluster-metrics/test
          - cluster-sharding/test
          - cluster-typed/test cluster-sharding-typed/test
    steps:
      - name: Checkout
        uses: actions/checkout@v5
        with:
          # we don't know what commit the last tag was it's safer to get entire repo so previousStableVersion resolves
          fetch-depth: 0
          fetch-tags: true

      - name: Setup Java 17
        uses: actions/setup-java@v5
        with:
          distribution: temurin
          java-version: 17

      - name: Install sbt
        uses: sbt/setup-sbt@17575ea4e18dd928fe5968dbe32294b97923d65b # v1.1.13

      - name: Cache Coursier cache
        uses: coursier/cache-action@4e2615869d13561d626ed48655e1a39e5b192b3c # v6.4.7

      - name: Enable jvm-opts
        run: cp .jvmopts-ci .jvmopts

      - name: sbt ${{ matrix.command }}
        env:
          DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
        # note that this is not running any multi-jvm tests because multi-in-test=false
        run: |-
          sbt \
          -Djava.security.egd=file:/dev/./urandom \
          -Dpekko.remote.artery.enabled=off \
          -Dpekko.test.timefactor=2 \
          -Dpekko.actor.testkit.typed.timefactor=2 \
          -Dpekko.test.tags.exclude=gh-exclude,timing \
          -Dpekko.test.multi-in-test=false \
          -Dpekko.cluster.assert=on \
          -Dio.netty.leakDetection.level=PARANOID \
          clean ${{ matrix.command }}

  jdk-nightly-build:
    name: JDK ${{ matrix.javaVersion }} / Scala ${{ matrix.scalaVersion }}
    runs-on: ubuntu-22.04
    if: github.repository == 'apache/pekko'
    strategy:
      fail-fast: false
      matrix:
        # No need to specify the full Scala version. Only the Scala
        # binary version is required and Pekko build will set the right
        # full version from it.
        scalaVersion: ["2.13.x", "3.3.x"]
        javaVersion: [17, 21]
    env:
      DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
    steps:
      - name: Checkout
        uses: actions/checkout@v5
        with:
          fetch-depth: 0
          fetch-tags: true

      - name: Setup Java ${{ matrix.javaVersion }}
        uses: actions/setup-java@v5
        with:
          distribution: temurin
          java-version: ${{ matrix.javaVersion }}

      - name: Install sbt
        uses: sbt/setup-sbt@17575ea4e18dd928fe5968dbe32294b97923d65b # v1.1.13

      - name: Cache Coursier cache
        uses: coursier/cache-action@4e2615869d13561d626ed48655e1a39e5b192b3c # v6.4.7

      - name: Enable jvm-opts
        run: cp .jvmopts-ci .jvmopts

      - name: Check if the dependency task in the built correctly
        run: sbt dependWalkerCheck

      - name: Compile and Test
        # note that this is not running any multi-jvm tests because multi-in-test=false
        run: |-
          sbt \
            -Dpekko.cluster.assert=on \
            -Dpekko.log.timestamps=true \
            -Dpekko.test.timefactor=2 \
            -Dpekko.actor.testkit.typed.timefactor=2 \
            -Dpekko.test.tags.exclude=gh-exclude,timing \
            -Dpekko.test.multi-in-test=false \
            -Dio.netty.leakDetection.level=PARANOID \
            clean "++ ${{ matrix.scalaVersion }} test" checkTestsHaveRun

      - name: Docs
        # Docs generation requires JDK 11.
        if: ${{ matrix.javaVersion == 11 }}
        run: |-
          sudo apt-get install graphviz
          # genjavadoc does not support Scala 3.x
          sbt \
            -Dpekko.genjavadoc.enabled=${{ !startsWith(matrix.scalaVersion, '3') }} \
            "++ ${{ matrix.scalaVersion }} doc"

      - name: Publish
        # Publish (osgi bundle) not working with JDK 17, issue #31132
        if: ${{ matrix.javaVersion == 11 }}
        run: |-
          sudo apt-get install graphviz
          sbt \
            -Dpekko.build.scalaVersion=${{ matrix.scalaVersion }} \
            "++ ${{ matrix.scalaVersion }} ;publishLocal;publishM2"

      - name: Install scala-cli
        if: ${{ matrix.javaVersion == 11 }}
        uses: VirtusLab/scala-cli-setup@b1b5d003a3db8e351bbf705ef4378d6b0ff8bf4d # v1.9.0
        # run: |-
        #   curl -sS "https://virtuslab.github.io/scala-cli-packages/KEY.gpg" | sudo gpg --dearmor  -o /etc/apt/trusted.gpg.d/scala-cli.gpg 2>/dev/null
        #   sudo curl -s --compressed -o /etc/apt/sources.list.d/scala_cli_packages.list "https://virtuslab.github.io/scala-cli-packages/debian/scala_cli_packages.list"
        #   sudo apt update
        #   sudo apt install scala-cli

      - name: Use Scala-CLI to verify jdk 9 classes
        if: ${{ matrix.javaVersion == 11 }}
        run: |-
          chmod +x .github/workflows/verify-jdk9-classes.sh
          .github/workflows/verify-jdk9-classes.sh
