name: CI Redhat UBI - Daily

on:
  schedule:
    - cron: "0 0 * * *"
  pull_request:
    branches: [master]
    paths-ignore:
      - 'docs/**'
      - '**/*.md'
concurrency:
  group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.run_number || github.ref }}
  cancel-in-progress: true

permissions:
  contents: read

jobs:
  test_apisix:
    name: run ci on redhat ubi
    runs-on: ubuntu-20.04
    timeout-minutes: 90
    strategy:
      fail-fast: false
      matrix:
        events_module:
          - lua-resty-worker-events
          - lua-resty-events
        test_dir:
          - t/plugin/[a-k]*
          - t/plugin/[l-z]*
          - t/admin t/cli t/config-center-yaml t/control t/core t/debug t/discovery t/error_page t/misc
          - t/node t/pubsub t/router t/script t/secret t/stream-node t/utils t/xds-library

    steps:
    - name: Check out code
      uses: actions/checkout@v4
      with:
        submodules: recursive

    - name: Cache deps
      uses: actions/cache@v4
      env:
        cache-name: cache-deps
      with:
        path: deps
        key: ${{ runner.os }}-${{ env.cache-name }}-ubi8.6-${{ hashFiles('apisix-master-0.rockspec') }}

    - name: Extract branch name
      if: ${{ startsWith(github.ref, 'refs/heads/release/') }}
      id: branch_env
      shell: bash
      run: |
        echo "version=${GITHUB_REF##*/}" >>$GITHUB_OUTPUT

    - name: Extract test type
      shell: bash
      id: test_env
      run: |
        test_dir="${{ matrix.test_dir }}"
        if [[ $test_dir =~ 't/plugin' ]]; then
          echo "type=plugin" >>$GITHUB_OUTPUT
        fi
        if [[ $test_dir =~ 't/admin ' ]]; then
          echo "type=first" >>$GITHUB_OUTPUT
        fi
        if [[ $test_dir =~ ' t/xds-library' ]]; then
          echo "type=last" >>$GITHUB_OUTPUT
        fi

    - name: Free disk space
      run: |
        bash ./ci/free_disk_space.sh

    - name: Linux launch common services
      run: |
        make ci-env-up project_compose_ci=ci/pod/docker-compose.common.yml
        sudo ./ci/init-common-test-service.sh

    - name: Build rpm package
      if: ${{ startsWith(github.ref, 'refs/heads/release/') }}
      run: |
        export VERSION=${{ steps.branch_env.outputs.version }}
        sudo gem install --no-document fpm
        git clone --depth 1 https://github.com/api7/apisix-build-tools.git

        # move codes under build tool
        mkdir ./apisix-build-tools/apisix
        for dir in `ls|grep -v "^apisix-build-tools$"`;do cp -r $dir ./apisix-build-tools/apisix/;done

        cd apisix-build-tools
        make package type=rpm app=apisix version=${VERSION} checkout=release/${VERSION} image_base=ubi image_tag=8.6 local_code_path=./apisix
        cd ..
        rm -rf $(ls -1 -I apisix-build-tools -I t -I utils -I ci --ignore=Makefile -I "*.rockspec")

    - name: Start Dubbo Backend
      run: |
        cur_dir=$(pwd)
        sudo apt update
        sudo apt install -y maven
        cd t/lib/dubbo-backend
        mvn package
        cd dubbo-backend-provider/target
        java -Djava.net.preferIPv4Stack=true -jar dubbo-demo-provider.one-jar.jar > /tmp/java.log &
        cd $cur_dir/t/lib/dubbo-serialization-backend
        mvn package
        cd dubbo-serialization-backend-provider/target
        java -Djava.net.preferIPv4Stack=true -jar dubbo-demo-provider.one-jar.jar > /tmp/java2.log &

    - name: Build xDS library
      if: steps.test_env.outputs.type == 'last'
      run: |
        cd t/xds-library
        go build -o libxds.so -buildmode=c-shared main.go export.go

    - name: Run redhat docker and mapping apisix into container
      env:
        TEST_FILE_SUB_DIR: ${{ matrix.test_dir }}
        TEST_EVENTS_MODULE: ${{ matrix.events_module }}
      run: |
        docker run -itd -v ${{ github.workspace }}:/apisix --env TEST_FILE_SUB_DIR="$TEST_FILE_SUB_DIR" --env TEST_EVENTS_MODULE="$TEST_EVENTS_MODULE" --name ubiInstance --net="host" --dns 8.8.8.8 --dns-search apache.org registry.access.redhat.com/ubi8/ubi:8.6 /bin/bash

    - name: Cache images
      id: cache-images
      uses: actions/cache@v4
      env:
        cache-name: cache-apisix-docker-images
      with:
        path: docker-images-backup
        key: ${{ runner.os }}-${{ env.cache-name }}-${{ steps.test_env.outputs.type }}-${{ hashFiles(format('./ci/pod/docker-compose.{0}.yml', steps.test_env.outputs.type )) }}

    - if: ${{ steps.cache-images.outputs.cache-hit == 'true' }}
      name: Load saved docker images
      run: |
        if [[ -f docker-images-backup/apisix-images.tar ]]; then
          [[ ${{ steps.test_env.outputs.type }} != first ]] && sudo ./ci/init-${{ steps.test_env.outputs.type }}-test-service.sh before
          docker load --input docker-images-backup/apisix-images.tar
          rm docker-images-backup/apisix-images.tar
          make ci-env-up project_compose_ci=ci/pod/docker-compose.${{ steps.test_env.outputs.type }}.yml
          echo "loaded docker images"
          if [[ ${{ steps.test_env.outputs.type }} != first ]]; then
            sudo ./ci/init-${{ steps.test_env.outputs.type }}-test-service.sh after
          fi
        fi
    - if: ${{ steps.cache-images.outputs.cache-hit != 'true' }}
      name: Linux launch services
      run: |
        [[ ${{ steps.test_env.outputs.type }} != first ]] && sudo ./ci/init-${{ steps.test_env.outputs.type }}-test-service.sh before
        [[ ${{ steps.test_env.outputs.type }} == plugin ]] && ./ci/pod/openfunction/build-function-image.sh
        make ci-env-up project_compose_ci=ci/pod/docker-compose.${{ steps.test_env.outputs.type }}.yml
        [[ ${{ steps.test_env.outputs.type }} != first ]] && sudo ./ci/init-${{ steps.test_env.outputs.type }}-test-service.sh after
        echo "Linux launch services, done."

    - name: Install dependencies
      run: |
        docker exec ubiInstance bash -c "cd apisix && chmod +x ./ci/redhat-ci.sh && ./ci/redhat-ci.sh install_dependencies"

    - name: Install rpm package
      if: ${{ startsWith(github.ref, 'refs/heads/release/') }}
      run: |
        docker exec ubiInstance bash -c "cd apisix && rpm -iv --prefix=/apisix ./apisix-build-tools/output/apisix-${{ steps.branch_env.outputs.version }}-0.ubi8.6.x86_64.rpm"
        # Dependencies are attached with rpm, so revert `make deps`
        docker exec ubiInstance bash -c "cd apisix && rm -rf deps"
        docker exec ubiInstance bash -c "cd apisix && mv usr/bin . && mv usr/local/apisix/* ."

    - name: Run test cases
      run: |
        docker exec ubiInstance bash -c "cd apisix && chmod +x ./ci/redhat-ci.sh && ./ci/redhat-ci.sh run_case"

    - if: ${{ steps.cache-images.outputs.cache-hit != 'true' }}
      name: Save docker images
      run: |
        echo "start backing up, $(date)"
        bash ./ci/backup-docker-images.sh ${{ steps.test_env.outputs.type }}
        echo "backup done, $(date)"
