diff --git a/.github/workflows/plugin-tests.yml b/.github/workflows/plugin-tests.yml index efb7d18f..7c689d80 100644 --- a/.github/workflows/plugin-tests.yml +++ b/.github/workflows/plugin-tests.yml @@ -3,24 +3,25 @@ name: Plugin Tests on: push: branches: - - stable - - master - main + - stable pull_request: - schedule: - - cron: "0 */12 * * *" + +concurrency: + group: plugin-tests-${{ format('{0}-{1}', github.head_ref || github.run_number, github.job) }} + cancel-in-progress: true jobs: build: name: ${{ matrix.build_type }} runs-on: ubuntu-latest - timeout-minutes: 60 + container: discourse/discourse_test:slim${{ startsWith(matrix.build_type, 'frontend') && '-browsers' || '' }} + timeout-minutes: 30 env: DISCOURSE_HOSTNAME: www.example.com RUBY_GLOBAL_METHOD_CACHE_SIZE: 131072 RAILS_ENV: test - PGHOST: localhost PGUSER: discourse PGPASSWORD: discourse @@ -28,45 +29,18 @@ jobs: fail-fast: false matrix: - build_type: ["backend", "frontend"] - ruby: ["2.7"] - postgres: ["12"] - redis: ["6.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 + build_type: ["backend", "frontend-legacy", "frontend"] steps: - - uses: haya14busa/action-cond@v1 - id: discourse_branch - with: - cond: ${{ github.base_ref == 'stable' }} - if_true: "stable" - if_false: "tests-passed" - - uses: actions/checkout@v3 with: repository: discourse/discourse - ref: ${{ steps.discourse_branch.outputs.value }} fetch-depth: 1 - name: Install plugin - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: path: plugins/${{ github.event.repository.name }} - ref: "${{ github.head_ref }}" fetch-depth: 1 - name: Setup Git @@ -74,66 +48,89 @@ jobs: git config --global user.email "ci@ci.invalid" git config --global user.name "Discourse CI" - - name: Setup packages + - name: Start redis 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 + redis-server /etc/redis/redis.conf & - - name: Update imagemagick - if: matrix.build_type == 'backend' + - name: Start Postgres run: | - wget https://raw.githubusercontent.com/discourse/discourse_docker/master/image/base/install-imagemagick - chmod +x install-imagemagick - sudo ./install-imagemagick + chown -R postgres /var/run/postgresql + sudo -E -u postgres script/start_test_db.rb + sudo -u postgres psql -c "CREATE ROLE $PGUSER LOGIN SUPERUSER PASSWORD '$PGPASSWORD';" - - name: Setup redis - uses: shogo82148/actions-setup-redis@v1 + - name: Bundler cache + uses: actions/cache@v3 with: - redis-version: ${{ matrix.redis }} + path: vendor/bundle + key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile.lock') }} + restore-keys: | + ${{ runner.os }}-gem- - - name: Setup ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: ${{ matrix.ruby }} - bundler-cache: true + - name: Setup gems + run: | + gem install bundler --conservative -v $(awk '/BUNDLED WITH/ { getline; gsub(/ /,""); print $0 }' Gemfile.lock) + bundle config --local path vendor/bundle + bundle config --local deployment true + bundle config --local without development + bundle install --jobs 4 + bundle clean - name: Lint English locale if: matrix.build_type == 'backend' - run: bundle exec ruby script/i18n_lint.rb "plugins/${{ steps.repo-name.outputs.value }}/locales/{client,server}.en.yml" + run: bundle exec ruby script/i18n_lint.rb "plugins/${{ github.event.repository.name }}/locales/{client,server}.en.yml" - name: Get yarn cache directory id: yarn-cache-dir run: echo "::set-output name=dir::$(yarn cache dir)" - name: Yarn cache - uses: actions/cache@v2 + uses: actions/cache@v3 id: yarn-cache with: path: ${{ steps.yarn-cache-dir.outputs.dir }} - key: ${{ runner.os }}-${{ matrix.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} restore-keys: | - ${{ runner.os }}-${{ matrix.os }}-yarn- + ${{ runner.os }}-yarn- - name: Yarn install - run: yarn install --dev + run: yarn install - - name: Migrate database + - name: Fetch app state cache + uses: actions/cache@v3 + id: app-cache + with: + path: tmp/app-cache + key: >- + ${{ hashFiles('.github/workflows/tests.yml') }}- + ${{ hashFiles('db/**/*', 'plugins/**/db/**/*') }}- + + - name: Restore database from cache + if: steps.app-cache.outputs.cache-hit == 'true' + run: psql -f tmp/app-cache/cache.sql postgres + + - name: Restore uploads from cache + if: steps.app-cache.outputs.cache-hit == 'true' + run: rm -rf public/uploads && cp -r tmp/app-cache/uploads public/uploads + + - name: Create and migrate database + if: steps.app-cache.outputs.cache-hit != 'true' run: | bin/rake db:create bin/rake db:migrate - - name: Plugin RSpec with Coverage + - name: Dump database for cache + if: steps.app-cache.outputs.cache-hit != 'true' + run: mkdir -p tmp/app-cache && pg_dumpall > tmp/app-cache/cache.sql + + - name: Dump uploads for cache + if: steps.app-cache.outputs.cache-hit != 'true' + run: rm -rf tmp/app-cache/uploads && cp -r public/uploads tmp/app-cache/uploads + + - name: Plugin RSpec if: matrix.build_type == 'backend' - run: | - if [ -e plugins/${{ steps.repo-name.outputs.value }}/.simplecov ] - then - cp plugins/${{ steps.repo-name.outputs.value }}/.simplecov .simplecov - export COVERAGE=1 - fi - bin/rake plugin:spec[${{ steps.repo-name.outputs.value }}] + run: bin/rake plugin:spec[${{ github.event.repository.name }}] - name: Plugin QUnit if: matrix.build_type == 'frontend' - run: bin/rake plugin:qunit['${{ steps.repo-name.outputs.value }}','1200000'] - timeout-minutes: 30 + run: QUNIT_EMBER_CLI=1 bundle exec rake plugin:qunit['${{ github.event.repository.name }}','1200000'] + timeout-minutes: 10