# Ref: https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions

on:
  workflow_dispatch:
    inputs:
      build_service:
        description: 'Name of a single service to build(in small letters). "all" to build everything'
        required: false
        default: 'false'
      skip_security_checks:
        description: 'Skip Security checks if there is a unfixable vuln or error. Value: true/false'
        required: false
        default: 'false'
  push:
    branches:
    - dev
    paths:
      - ee/backend/**
      - backend/**

name: Build and deploy workers EE

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v2
      with:
        # We need to diff with old commit 
        # to see which workers got changed.
        fetch-depth: 2
        # ref: staging

    - name: Docker login
      run: |
        docker login ${{ secrets.EE_REGISTRY_URL }} -u ${{ secrets.EE_DOCKER_USERNAME }} -p "${{ secrets.EE_REGISTRY_TOKEN }}" 

    - uses: azure/k8s-set-context@v1
      with:
        method: kubeconfig
        kubeconfig: ${{ secrets.EE_KUBECONFIG }} # Use content of kubeconfig in secret.
      id: setcontext

    # # Caching docker images
    # - uses: satackey/action-docker-layer-caching@v0.0.11
    #   # Ignore the failure of a step and avoid terminating the job.
    #   continue-on-error: true

    - name: Build, tag
      id: build-image
      env:
        DOCKER_REPO: ${{ secrets.EE_REGISTRY_URL }}
        IMAGE_TAG: ${{ github.ref_name }}_${{ github.sha }}-ee
        ENVIRONMENT: staging
      run: |
        #
        # TODO: Check the container tags are same, then skip the build and deployment.
        #
        # Build a docker container and push it to Docker Registry so that it can be deployed to Kubernetes cluster.
        #
        # Getting the images to build
        #
        set -x
        touch /tmp/images_to_build.txt
        skip_security_checks=${{ github.event.inputs.skip_security_checks }}
        tmp_param=${{ github.event.inputs.build_service }}
        build_param=${tmp_param:-'false'}
        case ${build_param} in
          false)
            {
              git diff --name-only HEAD HEAD~1 | grep -E "backend/pkg|backend/internal" | grep -vE ^ee/ | cut -d '/' -f3 | uniq | while read -r pkg_name ; do
                grep -rl "pkg/$pkg_name" backend/services backend/cmd | cut -d '/' -f3 
              done
            } | awk '!seen[$0]++' > /tmp/images_to_build.txt
          ;;
          all)
            ls backend/cmd > /tmp/images_to_build.txt
            ;;
          *)
            echo ${{github.event.inputs.build_service }} > /tmp/images_to_build.txt
            ;;
        esac

        if [[ $(cat /tmp/images_to_build.txt) == "" ]]; then
          echo "Nothing to build here"
          touch /tmp/nothing-to-build-here
          exit 0
        fi
        #
        # Pushing image to registry
        #
        cd backend
        cat /tmp/images_to_build.txt
        for image in $(cat /tmp/images_to_build.txt);
        do
          echo "Bulding $image"
          PUSH_IMAGE=0 bash -x ./build.sh ee $image
          [[ "x$skip_security_checks" == "xtrue" ]]  || {
            curl -L https://github.com/aquasecurity/trivy/releases/download/v0.34.0/trivy_0.34.0_Linux-64bit.tar.gz | tar -xzf - -C ./ 
            ./trivy image --exit-code 1 --vuln-type os,library --severity "HIGH,CRITICAL"  --ignore-unfixed $DOCKER_REPO/$image:$IMAGE_TAG 
            err_code=$?
            [[ $err_code -ne 0 ]] && {
              exit $err_code
            }
          } && {
            echo "Skipping Security Checks"
          }
          docker push $DOCKER_REPO/$image:$IMAGE_TAG 
          echo "::set-output name=image::$DOCKER_REPO/$image:$IMAGE_TAG"
        done

    - name: Deploying to kuberntes
      env:
        # We're not passing -ee flag, because helm will add that.
        IMAGE_TAG: ${{ github.ref_name }}_${{ github.sha }}
      run: |
        #
        # Deploying image to environment.
        #
        set -x
        [[ -f /tmp/nothing-to-build-here ]] && exit 0
        cd scripts/helmcharts/

        ## Update secerts
        sed -i "s#openReplayContainerRegistry.*#openReplayContainerRegistry: \"${{ secrets.OSS_REGISTRY_URL }}\"#g" vars.yaml
        sed -i "s/postgresqlPassword: \"changeMePassword\"/postgresqlPassword: \"${{ secrets.EE_PG_PASSWORD }}\"/g" vars.yaml
        sed -i "s/accessKey: \"changeMeMinioAccessKey\"/accessKey: \"${{ secrets.EE_MINIO_ACCESS_KEY }}\"/g" vars.yaml
        sed -i "s/secretKey: \"changeMeMinioPassword\"/secretKey: \"${{ secrets.EE_MINIO_SECRET_KEY }}\"/g" vars.yaml
        sed -i "s/jwt_secret: \"SetARandomStringHere\"/jwt_secret: \"${{ secrets.EE_JWT_SECRET }}\"/g" vars.yaml
        sed -i "s/domainName: \"\"/domainName: \"${{ secrets.EE_DOMAIN_NAME }}\"/g" vars.yaml
        sed -i "s/enterpriseEditionLicense: \"\"/enterpriseEditionLicense: \"${{ secrets.EE_LICENSE_KEY }}\"/g" vars.yaml

        set -x
        echo > /tmp/image_override.yaml
        mkdir /tmp/helmcharts
        mv openreplay/charts/ingress-nginx /tmp/helmcharts/
        mv openreplay/charts/quickwit /tmp/helmcharts/
        ## Update images
        for image in $(cat /tmp/images_to_build.txt);
        do
        mv openreplay/charts/$image /tmp/helmcharts/
        cat <<EOF>>/tmp/image_override.yaml
        ${image}:
          image:
            # We've to strip off the -ee, as helm will append it.
            tag: ${IMAGE_TAG}
        EOF
        done
        ls /tmp/helmcharts
        rm -rf openreplay/charts/*
        ls openreplay/charts
        mv /tmp/helmcharts/* openreplay/charts/
        ls openreplay/charts

        # Deploy command
        helm template openreplay -n app openreplay -f vars.yaml -f /tmp/image_override.yaml --set ingress-nginx.enabled=false --set skipMigration=true | kubectl apply -f -

    - name: Alert slack
      if: ${{ failure() }}
      uses: rtCamp/action-slack-notify@v2
      env:
        SLACK_CHANNEL: ee
        SLACK_TITLE: "Failed ${{ github.workflow }}"
        SLACK_COLOR: ${{ job.status }} # or a specific color like 'good' or '#ff00ff'
        SLACK_WEBHOOK: ${{ secrets.SLACK_WEB_HOOK }}
        SLACK_USERNAME: "OR Bot"
        SLACK_MESSAGE: 'Build failed :bomb:'

    # - name: Debug Job
    #   if: ${{ failure() }}
    #   uses: mxschmitt/action-tmate@v3
    #   env:
    #     DOCKER_REPO: ${{ secrets.EE_REGISTRY_URL }}
    #     IMAGE_TAG: ${{ github.sha }}
    #     ENVIRONMENT: staging
    #
