name: CI
on:
  push: { branches: [ main ] }
  pull_request:
  release: { types: [ published ] }

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

jobs:
  lint:
    name: Lint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-go@v3
        with: { go-version: '1.19', cache: true }
      - run: |
          mkdir -p ui/dist/img
          touch ui/dist/index.html ui/dist/favicon.ico ui/dist/manifest.json ui/dist/img/fake.png
      - uses: golangci/golangci-lint-action@v3

  test:
    name: Test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with: { node-version: '14', cache: 'yarn', cache-dependency-path: 'ui/yarn.lock' }
      - uses: actions/setup-go@v3
        with: { go-version: '1.19', cache: true }
      - run: |
          mkdir -p ui/dist/img
          touch ui/dist/index.html ui/dist/favicon.ico ui/dist/manifest.json ui/dist/img/fake.png
      - run: docker compose -f docker-compose-with-keycloak.yml up --quiet-pull --detach
        working-directory: dev
      - name: Install ArangoDB
        run: |
          curl -OL https://download.arangodb.com/arangodb38/DEBIAN/Release.key
          sudo apt-key add Release.key
          sudo apt-add-repository 'deb https://download.arangodb.com/arangodb38/DEBIAN/ /'
          sudo apt-get update -y && sudo apt-get -y install arangodb3
      - run: go test -coverprofile=cover.out -coverpkg=./... ./...
      - run: go tool cover -func=cover.out
      - uses: codecov/codecov-action@v3

  cypress:
    strategy:
      matrix:
        test: [ tickets, templates, playbooks ]
        auth: [ keycloak ] # simple
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-go@v3
        with: { go-version: '1.18' }
      - uses: actions/setup-node@v3
        with: { node-version: '14' }
      # run UI
      - run: |
          yarn install
          yarn serve &
        working-directory: ui
      - run: curl --head -X GET --retry 60 --retry-connrefused --retry-delay 10 http://localhost:8080
      # run containers
      - run: | 
          sed -i 's/host.docker.internal/172.17.0.1/g' dev/nginx.conf
          sed -i 's/host.docker.internal/172.17.0.1/g' dev/nginx-with-keycloak.conf
      - run: docker compose up --quiet-pull --detach
        working-directory: dev
        if: matrix.auth == 'simple'
      - run: docker compose -f docker-compose-with-keycloak.yml up --quiet-pull --detach
        working-directory: dev
        if: matrix.auth == 'keycloak'
      - run: curl --head -X GET --retry 60 --retry-connrefused --retry-delay 10 http://localhost:9002/auth/realms/catalyst
        if: matrix.auth == 'keycloak'
      # run catalyst
      - run: |
          mkdir -p ui/dist/img
          touch ui/dist/index.html ui/dist/favicon.ico ui/dist/manifest.json ui/dist/img/fake.png
      - run: go mod download
      - run: bash start_dev.sh &
        working-directory: dev
        if: matrix.auth == 'simple'
      - run: bash start_dev_with_keycloak.sh &
        working-directory: dev
        if: matrix.auth == 'keycloak'
      - run: curl --head -X GET --retry 60 --retry-connrefused --retry-delay 10 http://localhost:8000
      # run cypress
      - uses: cypress-io/github-action@v4
        env:
          CYPRESS_AUTH: ${{ matrix.auth }}
          CYPRESS_TEST: ${{ matrix.test }}
        with:
          browser: chrome
          working-directory: ui
      - uses: actions/upload-artifact@v3
        if: always() && matrix.auth == 'simple'
        with:
          name: cypress-videos
          path: ui/cypress/videos
          retention-days: 1

  build-npm:
    name: Build npm
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with: { node-version: '14', cache: 'yarn', cache-dependency-path: 'ui/yarn.lock' }
      - run: yarn install && yarn build
        working-directory: ui
      - uses: actions/upload-artifact@v3
        with: { name: ui, path: ui/dist, retention-days: 1 }

  build:
    if: github.event_name != 'pull_request'
    name: Build
    runs-on: ubuntu-latest
    needs: [ build-npm, test ]
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-go@v3
        with: { go-version: '1.19', cache: true }
      - uses: actions/download-artifact@v3
        with: { name: ui, path: ui/dist }
      - name: Version
        if: github.ref_type == 'tag' && github.ref_name != ''
        run: |
          echo ${{ github.ref_name }}
          echo ${{ github.ref_name }} > VERSION
      - run: go build -o catalyst ./cmd/catalyst/.
      - uses: docker/login-action@v2
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@v4
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
      - uses: docker/build-push-action@v3
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
