name: Bazel

on:
  workflow_call:
    inputs:
      name:
        description: Name of workflow
        required: false
        type: string
      run:
        description: Bazel command to run
        required: true
        type: string
      os:
        description: One of ubuntu, windows or macos
        required: false
        type: string
        default: ubuntu
      browser:
        description: One of chrome, firefox, or edge
        required: false
        type: string
        default: ''
      browser-version:
        description: One of stable, latest, latest-beta or latest-devedition
        required: false
        type: string
        default: ''
      caching:
        description: Toggle caching of Bazel
        required: false
        type: boolean
        default: true
      cache-key:
        description: Bazel disk cache key
        required: false
        type: string
        default: ''
      dotnet-version:
        description: Custom DotNet version to install
        required: false
        type: string
        default: ''
      java-version:
        description: Custom Java version to install
        required: false
        type: string
        default: ''
      node-version:
        description: Custom Node version to install
        required: false
        type: string
        default: ''
      ruby-version:
        description: Custom Ruby version to use
        required: false
        type: string
        default: ''
      nightly-release-files:
        description: Files to upload to the Nightly release tag
        required: false
        type: string
        default: ''
      artifact-name:
        description: Name of artifact to upload
        required: false
        type: string
        default: 'ignore-artifacts'

jobs:
  bazel:
    name: ${{ inputs.name }}
    runs-on: ${{ contains(inputs.os, '-') && inputs.os || format('{0}-latest', inputs.os) }}
    env:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      SEL_M2_USER: ${{ secrets.SEL_M2_USER }}
      SEL_M2_PASS: ${{ secrets.SEL_M2_PASS }}
      TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }}
      TWINE_USERNAME: ${{ secrets.TWINE_USERNAME }}
      NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      SE_AVOID_STATS: true
    steps:
      - name: Checkout source tree
        uses: actions/checkout@v4
      - name: Pull latest changes from head ref for PRs
        if: contains(github.head_ref, 'renovate/')
        run: git pull origin ${{ github.head_ref }}
      - name: Pull latest changes from ref for branch pushes
        if: contains(github.ref, 'renovate/')
        run: git pull origin ${{ github.ref }}
      - name: Free space
        if: inputs.os != 'windows'
        run: ./scripts/github-actions/free-disk-space.sh
      - name: Remove driver directories Windows
        if: inputs.os == 'windows'
        run: |
          rm "$env:ChromeWebDriver" -r -v
          rm "$env:EdgeWebDriver" -r -v
          rm "$env:GeckoWebDriver" -r -v
      - name: Remove driver directories Non-Windows
        if: inputs.os != 'windows'
        run: |
          sudo rm -rf "$CHROMEWEBDRIVER" "$EDGEWEBDRIVER" "$GECKOWEBDRIVER"
      - name: Set Ruby version
        if: inputs.ruby-version != ''
        run: echo '${{ inputs.ruby-version }}' > rb/.ruby-version
      - name: Setup DotNet
        if: inputs.dotnet-version != ''
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: ${{ inputs.dotnet-version }}
      - name: Setup Java
        if: inputs.java-version != ''
        uses: actions/setup-java@v3
        with:
          java-version: ${{ inputs.java-version }}
          distribution: 'temurin'
      - name: Setup Node
        if: inputs.node-version != ''
        uses: actions/setup-node@v4
        with:
          node-version: ${{ inputs.node-version }}
      - name: Setup Bazel with caching
        if: inputs.caching
        uses: bazel-contrib/setup-bazel@0.15.0
        with:
          bazelisk-cache: true
          bazelrc: common --color=yes
          cache-version: 2
          disk-cache: ${{ inputs.cache-key }}
          external-cache: |
            name: ${{ inputs.cache-key }}
            manifest:
              crates: rust/Cargo.Bazel.lock
              rules_ruby++ruby+ruby: ${{ inputs.os == 'windows' && 'false' || 'rb/.ruby-version' }}
          repository-cache: true
      - name: Setup Bazel without caching
        if: inputs.caching == false
        uses: bazel-contrib/setup-bazel@0.15.0
        with:
          bazelrc: common --color=yes
      - name: Setup curl for Ubuntu
        if: inputs.os == 'ubuntu'
        run: sudo apt-get update && sudo apt-get install -y libcurl4-openssl-dev
      - name: Setup Fluxbox and Xvfb
        if: inputs.os == 'ubuntu' && inputs.browser != ''
        run: |
          sudo apt-get -y install fluxbox
          Xvfb :99 &
          fluxbox -display :99 &
          echo "DISPLAY=:99" >> "$GITHUB_ENV"
      - name: Set resolution
        if: inputs.os == 'windows' && inputs.browser != ''
        run: Set-DisplayResolution -Width 1920 -Height 1080 -Force
      - name: Setup Safari
        if: inputs.browser == 'safari'
        run: sudo safaridriver --enable
      - name: Run Bazel
        run: ${{ inputs.run }}
      - name: Start SSH session
        if: failure() && runner.debug == '1'
        uses: mxschmitt/action-tmate@v3
        with:
          limit-access-to-actor: false
      - name: Release Nightly
        if: inputs.nightly-release-files != ''
        uses: marvinpinto/action-automatic-releases@latest
        with:
          repo_token: "${{ secrets.GITHUB_TOKEN }}"
          automatic_release_tag: "nightly"
          title: "Nightly"
          prerelease: true
          files: ${{ inputs.nightly-release-files }}
      - name: Save changes
        if: ${{ always() && inputs.artifact-name != 'ignore-artifacts' }}
        run: |
          git diff > changes.patch
      - name: "Upload changes"
        if: ${{ always() && inputs.artifact-name != 'ignore-artifacts' }}
        uses: actions/upload-artifact@v4
        with:
          name: ${{ inputs.artifact-name }}
          path: changes.patch
          retention-days: 6
