name: CI/CD
on: [push, pull_request]
jobs:
  setup:
    name: setup
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Setup
        uses: actions/setup-node@v1
        with:
          node-version: '12.x'
      - uses: actions/cache@v1
        id: yarn-cache
        with:
          path: node_modules
          key: ${{ runner.os }}-node_modules-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-node_modules-
      - name: Install
        if: steps.yarn-cache.outputs.cache-hit != 'true'
        run: yarn install

  test:
    name: Test
    runs-on: ubuntu-latest
    needs: setup
    env:
      NODE_ENV: test
      POSTGRES_PASSWORD: postgres
      POSTGRES_DATABASE: postgres
      POSTGRES_USER: postgres
    services:
      postgres:
        image: postgres:10.8
        env:
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: postgres
          POSTGRES_DB: postgres
        ports:
        - 5432:5432
        # needed because the postgres container does not provide a healthcheck
        options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Setup
        uses: actions/setup-node@v1
        with:
          node-version: '12.x'
      - uses: actions/cache@v1
        id: yarn-cache
        with:
          path: node_modules
          key: ${{ runner.os }}-node_modules-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-node_modules-
      - name: Install
        if: steps.yarn-cache.outputs.cache-hit != 'true'
        run: yarn install
      - name: Lint
        run: yarn lint
      - name: Migrate
        run: yarn typeorm migration:run
      - name: Test
        run: yarn test
 
  publish:
    name: Publish
    needs: test
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Setup
        uses: actions/setup-node@v1
        with:
          node-version: '12.x'
      - uses: actions/cache@v1
        id: yarn-cache
        with:
          path: node_modules
          key: ${{ runner.os }}-node_modules-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-node_modules-
      - name: Install
        if: steps.yarn-cache.outputs.cache-hit != 'true'
        run: yarn install
      - name: build
        run: yarn build
      - name: Release
        env:
          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
        run: yarn release