#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

name: Frontend

on:
  push:
    branches:
      - dev
    paths:
      - '.github/workflows/frontend.yml'
      - 'dolphinscheduler-ui/**'
  pull_request:
    paths:
      - '.github/workflows/frontend.yml'
      - 'dolphinscheduler-ui/**'

defaults:
  run:
    working-directory: dolphinscheduler-ui

concurrency:
  group: frontend-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true

jobs:
  build:
    name: Build
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ ubuntu-latest, macos-latest ]
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: true
      - if: matrix.os == 'ubuntu-latest'
        name: Sanity Check
        uses: ./.github/actions/sanity-check
      - name: Set up Node.js
        uses: actions/setup-node@v2
        with:
          node-version: 8
      - name: Compile and Build
        run: |
          npm install node-sass --unsafe-perm
          npm install
          npm run lint
          npm run build
