# This workflow is responsible for building, testing & packaging the Java server codebase
name: Appsmith Server Workflow

on:
  push:
    branches: [ release, master ]
    # Only trigger if files have changed in this specific path
    paths:
      - 'app/server/**'
  pull_request:
    branches: [ release, master ]
    paths:
      - 'app/server/**'
# Change the working directory for all the jobs in this workflow
defaults:
  run:
    working-directory: app/server

jobs:
  build:
    runs-on: ubuntu-latest

    # Service containers to run with this job. Required for running tests
    services:
      # Label used to access the service container
      redis:
        # Docker Hub image for Redis
        image: redis
        ports:
          # Opens tcp port 6379 on the host and service container
          - 6379:6379

    steps:
    # Checkout the code
    - uses: actions/checkout@v2

    # Setup Java
    - name: Set up JDK 1.11
      uses: actions/setup-java@v1
      with:
        java-version: 1.11

    # Retrieve maven dependencies from cache. After a successful run, these dependencies are cached again
    - name: Cache maven dependencies
      uses: actions/cache@v2
      env:
        cache-name: cache-maven-dependencies
      with:
        # maven dependencies are stored in `~/.m2` on Linux/macOS
        path: ~/.m2
        key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
        restore-keys: ${{ runner.os }}-m2

    # Build and test the code
    - name: Build and test
      env:
        APPSMITH_MONGODB_URI: "mongodb://localhost:27017/mobtools"
        APPSMITH_REDIS_URL: "redis://127.0.0.1:6379"
        APPSMITH_ENCRYPTION_PASSWORD: "password"
        APPSMITH_ENCRYPTION_SALT: "salt"
        APPSMITH_IS_SELF_HOSTED: false
      run: mvn -B package

    # Here, the GITHUB_REF is of type /refs/head/<branch_name>. We extract branch_name from this by removing the
    # first 11 characters. This can be used to build images for several branches
    - name: Get the version to tag the Docker image
      id: vars
      run: echo ::set-output name=tag::$(echo ${GITHUB_REF:11})

    # Build release Docker image and push to Docker Hub
    - name: Push release image to Docker Hub
      if: success() && github.ref == 'refs/heads/release'
      run: |
        docker build -t appsmith/appsmith-server:${{steps.vars.outputs.tag}} .
        echo ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} | docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} --password-stdin
        # This command pushes all the tags on the machine to Docker hub. This has been written for ease of reading. Be very careful 
        # with this command
        docker push appsmith/appsmith-server

    # Build master Docker image and push to Docker Hub
    - name: Push master image to Docker Hub with commit tag
      if: success() && github.ref == 'refs/heads/master'
      run: |
        docker build -t appsmith/appsmith-server:${GITHUB_SHA} .
        docker build -t appsmith/appsmith-server:nightly .
        echo ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} | docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} --password-stdin
        # This command pushes all the tags on the machine to Docker hub. This has been written for ease of reading. Be very careful 
        # with this command
        docker push appsmith/appsmith-server
  
  # These are dummy jobs in the CI build to satisfy required status checks for merging PRs. This is a hack because Github doesn't support conditional 
  # required checks in monorepos. These jobs are a clone of similarly named jobs in client.yml. 
  #
  # Check support request at: https://github.community/t/feature-request-conditional-required-checks/16761
  ui-test:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        job: [0, 1, 2, 3, 4, 5, 6]
    
    steps:
    # Checkout the code
    - uses: actions/checkout@v2
    
    - name: Do nothing as this is a dummy step
      shell: bash
      run: |
        exit 0
  
  package:
    runs-on: ubuntu-latest

    steps:
    # Checkout the code
    - uses: actions/checkout@v2
    
    - name: Do nothing as this is a dummy step
      shell: bash
      run: |
        exit 0
          