DEV: Add plugin testing workflow

DEV: Add plugin testing workflow

diff --git a/.github/workflows/plugin-tests.yml b/.github/workflows/plugin-tests.yml
new file mode 100644
index 0000000..fb2afda
--- /dev/null
+++ b/.github/workflows/plugin-tests.yml
@@ -0,0 +1,162 @@
+name: Plugin Tests
+
+on: [push, pull_request]
+
+jobs:
+  build:
+    name: "${{ matrix.target }}-${{ matrix.build_types }}"
+    runs-on: ${{ matrix.os }}
+    timeout-minutes: 60
+
+    env:
+      DISCOURSE_HOSTNAME: www.example.com
+      RUBY_GLOBAL_METHOD_CACHE_SIZE: 131072
+      BUILD_TYPE: ${{ matrix.build_types }}
+      TARGET: ${{ matrix.target }}
+      RAILS_ENV: test
+      PGHOST: localhost
+      PGUSER: discourse
+      PGPASSWORD: discourse
+
+    strategy:
+      fail-fast: false
+
+      matrix:
+        build_types: ["BACKEND", "FRONTEND"]
+        target: ["PLUGINS", "CORE"]
+        os: [ubuntu-latest]
+        ruby: ["2.6"]
+        postgres: ["12"]
+        redis: ["4.x"]
+
+    services:
+      postgres:
+        image: postgres:${{ matrix.postgres }}
+        ports:
+          - 5432:5432
+        env:
+          POSTGRES_USER: discourse
+          POSTGRES_PASSWORD: discourse
+        options: >-
+          --mount type=tmpfs,destination=/var/lib/postgresql/data
+          --health-cmd pg_isready
+          --health-interval 10s
+          --health-timeout 5s
+          --health-retries 5
+
+    steps:
+      - uses: actions/checkout@master
+        with:
+          repository: discourse/discourse
+          fetch-depth: 1
+
+      - name: Install plugin
+        uses: actions/checkout@master
+        with:
+          path: plugins/${{ github.event.repository.name }}
+          fetch-depth: 1
+
+      - name: Check spec existence
+        id: check_spec
+        uses: andstor/file-existence-action@v1
+        with:
+          files: "plugins/${{ github.event.repository.name }}/spec"
+
+      - name: Check qunit existence
+        id: check_qunit
+        uses: andstor/file-existence-action@v1
+        with:
+          files: "plugins/${{ github.event.repository.name }}/test/javascripts"
+
+      - name: Setup Git
+        run: |
+          git config --global user.email "ci@ci.invalid"
+          git config --global user.name "Discourse CI"
+
+      - name: Setup packages
+        run: |
+          sudo apt-get update
+          sudo apt-get -yqq install postgresql-client libpq-dev gifsicle jpegoptim optipng jhead
+          wget -qO- https://raw.githubusercontent.com/discourse/discourse_docker/master/image/base/install-pngquant | sudo sh
+
+      - name: Update imagemagick
+        if: env.BUILD_TYPE == 'BACKEND'
+        run: |
+          wget https://raw.githubusercontent.com/discourse/discourse_docker/master/image/base/install-imagemagick
+          chmod +x install-imagemagick
+          sudo ./install-imagemagick
+
+      - name: Setup redis
+        uses: shogo82148/actions-setup-redis@v1
+        with:
+          redis-version: ${{ matrix.redis }}
+
+      - name: Setup ruby
+        uses: actions/setup-ruby@v1
+        with:
+          ruby-version: ${{ matrix.ruby }}
+
+      - name: Setup bundler
+        run: |
+          gem install bundler -v 2.1.4 --no-doc
+          bundle config deployment 'true'
+          bundle config without 'development'
+
+      - name: Bundler cache
+        uses: actions/cache@v1
+        id: bundler-cache
+        with:
+          path: vendor/bundle
+          key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile.lock') }}
+          restore-keys: |
+            ${{ runner.os }}-gem-
+
+      - name: Setup gems
+        run: bundle install --jobs 4
+
+      - name: Get yarn cache directory
+        id: yarn-cache-dir
+        run: echo "::set-output name=dir::$(yarn cache dir)"
+
+      - name: Yarn cache
+        uses: actions/cache@v1
+        id: yarn-cache
+        with:
+          path: ${{ steps.yarn-cache-dir.outputs.dir }}
+          key: ${{ runner.os }}-${{ matrix.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
+          restore-keys: |
+            ${{ runner.os }}-${{ matrix.os }}-yarn-
+
+      - name: Yarn install
+        run: yarn install --dev
+
+      - name: Migrate database
+        run: |
+          bin/rake db:create
+          bin/rake db:migrate
+
+      - name: Create parallel databases
+        if: env.BUILD_TYPE == 'BACKEND' && env.TARGET == 'CORE'
+        run: |
+          bin/rake parallel:create
+          bin/rake parallel:migrate
+
+      - name: Core RSpec
+        if: env.BUILD_TYPE == 'BACKEND' && env.TARGET == 'CORE'
+        run: |
+          bin/turbo_rspec
+          bin/rake plugin:spec
+
+      - name: Plugin RSpec
+        if: env.BUILD_TYPE == 'BACKEND' && env.TARGET == 'PLUGINS' && steps.check_spec.outputs.files_exists == 'true'
+        run: bin/rake plugin:spec[${{ github.event.repository.name }}]
+
+      - name: Core QUnit
+        if: env.BUILD_TYPE == 'FRONTEND' && env.TARGET == 'CORE'
+        run: bundle exec rake qunit:test['1200000']
+        timeout-minutes: 30
+
+      - name: Plugin QUnit
+        if: env.BUILD_TYPE == 'FRONTEND' && env.TARGET == 'PLUGINS' && steps.check_qunit.outputs.files_exists == 'true'
+        run: bundle exec rake plugin:qunit['${{ github.event.repository.name }}','1200000']
+        timeout-minutes: 30

GitHub sha: 56c13632