name: Test Mixed Version Clusters
on:
  push:
    branches:
      - main
      - v3.12.x
      - v3.11.x
      - v3.10.x
      - v3.9.x
      - v3.8.x
      - bump-otp-*
      - bump-elixir-*
      - bump-rbe-*
      - bump-rules_erlang
    paths:
      - 'deps/**'
      - 'scripts/**'
      - Makefile
      - plugins.mk
      - rabbitmq-components.mk
      - .bazelrc
      - .bazelversion
      - BUILD.*
      - '*.bzl'
      - '*.bazel'
      - .github/workflows/test-mixed-versions.yaml
  pull_request:
concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true
jobs:
  ensure-mixed-version-archive:
    name: Prepare Artifacts
    runs-on: ubuntu-22.04
    steps:
    - name: CHECKOUT REPOSITORY
      uses: actions/checkout@v4
      with:
        path: primary-umbrella
    #! - name: Setup tmate session
    #!   uses: mxschmitt/action-tmate@v3
    - name: CHECK FOR ARCHIVE ON S3
      id: check
      working-directory: primary-umbrella
      run: |
        set -u

        ARCHIVE_URL="$(grep -Eo 'https://rabbitmq-github-actions.s3.eu-west-1.amazonaws.com.*.tar.xz' bazel/bzlmod/secondary_umbrella.bzl)"
        echo "ARCHIVE_URL: ${ARCHIVE_URL}"

        curl -LO "${ARCHIVE_URL}"

        if xzcat --test package-generic-unix-for-mixed-version-testing-v*.tar.xz; then
          exists=true
        else
          exists=false
        fi
        echo "exists=${exists}" | tee $GITHUB_ENV

        OTP_VERSION_ID=${ARCHIVE_URL#*secondary-umbrellas/rbe-}
        OTP_VERSION_ID=${OTP_VERSION_ID%*/package-generic-unix-for-mixed-version-testing-v*.tar.xz}
        echo "otp_version_id=${OTP_VERSION_ID}" | tee -a $GITHUB_OUTPUT

        VERSION=${ARCHIVE_URL#*package-generic-unix-for-mixed-version-testing-v}
        VERSION=${VERSION%*.tar.xz}
        echo "version=${VERSION}" | tee -a $GITHUB_OUTPUT
    - name: CHECKOUT REPOSITORY (MIXED VERSION)
      if: env.exists != 'true'
      uses: actions/checkout@v4
      with:
        ref: v${{ steps.check.outputs.version }}
        path: secondary-umbrella
    - name: BUILD SECONDARY UMBRELLA ARCHIVE
      if: env.exists != 'true'
      working-directory: secondary-umbrella
      run: |
        if [ -n "${{ secrets.BUILDBUDDY_API_KEY }}" ]; then
        cat << EOF >> user.bazelrc
          build:buildbuddy --remote_header=x-buildbuddy-api-key=${{ secrets.BUILDBUDDY_API_KEY }}
        EOF
        fi
        cat << EOF >> user.bazelrc
          build:buildbuddy --build_metadata=ROLE=CI
          build:buildbuddy --build_metadata=VISIBILITY=PRIVATE
          build:buildbuddy --remote_instance_name=buildbuddy-io/buildbuddy/ci-secondary-umbrella
          build:buildbuddy --color=yes

          build:buildbuddy --remote_download_toplevel
        EOF

        sed -i"_orig" -E "/APP_VERSION/ s/3\.[0-9]+\.[0-9]+/${{ steps.check.outputs.version }}/" rabbitmq.bzl
        bazelisk build :package-generic-unix \
          --config=rbe-${{ steps.check.outputs.otp_version_id }} \
          --test_build \
          --verbose_failures

        OUTPUT_DIR=${{ github.workspace }}/output
        mkdir -p ${OUTPUT_DIR}/rbe-${{ steps.check.outputs.otp_version_id }}
        cp \
          bazel-bin/package-generic-unix.tar.xz \
          ${OUTPUT_DIR}/rbe-${{ steps.check.outputs.otp_version_id }}/package-generic-unix-for-mixed-version-testing-v${{ steps.check.outputs.version }}.tar.xz
    - name: UPLOAD THE ARCHIVE TO S3
      if: env.exists != 'true'
      uses: jakejarvis/s3-sync-action@v0.5.1
      with:
        args: --acl public-read --follow-symlinks
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY}}
        AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }}
        AWS_REGION: ${{ secrets.AWS_REGION }}
        SOURCE_DIR: output
        DEST_DIR: secondary-umbrellas

  test-mixed-versions:
    name: Test (Mixed Version Cluster)
    runs-on: ubuntu-22.04
    needs: ensure-mixed-version-archive
    strategy:
      fail-fast: false
      matrix:
        otp_version_id:
        - "26_1"
        metadata_store:
          - mnesia
          - khepri
    timeout-minutes: 120
    steps:
    - name: CHECKOUT REPOSITORY
      uses: actions/checkout@v4
    - name: CONFIGURE BAZEL
      run: |
        if [ -n "${{ secrets.BUILDBUDDY_API_KEY }}" ]; then
        cat << EOF >> user.bazelrc
          build:buildbuddy --remote_header=x-buildbuddy-api-key=${{ secrets.BUILDBUDDY_API_KEY }}
        EOF
        fi
        cat << EOF >> user.bazelrc
          build:buildbuddy --build_metadata=ROLE=CI
          build:buildbuddy --build_metadata=VISIBILITY=PUBLIC
          build:buildbuddy --color=yes
        EOF
    #! - name: Setup tmate session
    #!   uses: mxschmitt/action-tmate@v3
    - name: RUN TESTS
      run: |
        sudo sysctl -w net.ipv4.tcp_keepalive_time=60
        sudo ethtool -K eth0 tso off gso off gro off tx off rx off lro off
        bazelisk test //... \
          --config=rbe-${{ matrix.otp_version_id }} \
          --test_env RABBITMQ_METADATA_STORE=${{ matrix.metadata_store }} \
          --test_tag_filters=mixed-version-cluster,-aws,-docker \
          --build_tests_only \
          --verbose_failures
  summary-mixed-versions:
    needs:
    - test-mixed-versions
    runs-on: ubuntu-latest
    steps:
    - name: SUMMARY
      run: |
        echo "SUCCESS"
