name: Migration Tests on: pull_request: paths: - ".github/workflows/migration-tests.yml" - "migrations/**" push: branches: - main - stable paths: - ".github/workflows/migration-tests.yml" - "migrations/**" concurrency: group: migration-tests-${{ format('{0}-{1}', github.head_ref || github.run_number, github.job) }} cancel-in-progress: true permissions: contents: read jobs: tests: if: github.event_name == 'pull_request' || github.repository != 'discourse/discourse-private-mirror' name: Tests with Ruby ${{ matrix.ruby }} runs-on: ${{ (github.repository != 'discourse/discourse' && 'ubuntu-latest') || 'debian-12' }} container: discourse/discourse_test:slim timeout-minutes: 20 env: RAILS_ENV: test PGUSER: discourse PGPASSWORD: discourse strategy: fail-fast: false matrix: ruby: ["3.3"] steps: - name: Set working directory owner run: chown root:root . - uses: actions/checkout@v4 with: fetch-depth: 1 - name: Setup Git run: | git config --global user.email "ci@ci.invalid" git config --global user.name "Discourse CI" - name: Start redis run: | redis-server /etc/redis/redis.conf & - name: Start Postgres run: | 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: Container envs id: container-envs run: | echo "ruby_version=$RUBY_VERSION" >> $GITHUB_OUTPUT echo "debian_release=$DEBIAN_RELEASE" >> $GITHUB_OUTPUT shell: bash - name: Bundler cache uses: actions/cache@v4 with: path: vendor/bundle key: >- ${{ runner.os }}- ${{ steps.container-envs.outputs.ruby_version }}- ${{ steps.container-envs.outputs.debian_release }}- ${{ hashFiles('**/Gemfile.lock') }}- migrations-tooling - 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 config --local with migrations bundle install --jobs $(($(nproc) - 1)) bundle clean - name: pnpm install run: pnpm install --frozen-lockfile - name: Fetch app state cache uses: actions/cache@v4 id: app-cache with: path: tmp/app-cache key: >- ${{ runner.os }}- ${{ hashFiles('.github/workflows/tests.yml') }}- ${{ hashFiles('db/**/*', 'plugins/**/db/**/*') }}- ${{ hashFiles('config/environments/test.rb') }} - name: Restore database from cache if: steps.app-cache.outputs.cache-hit == 'true' run: script/silence_successful_output psql --quiet -o /dev/null -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 script/silence_successful_output bin/rake db:migrate - 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: Check core database drift # run: | # mkdir /tmp/intermediate_db # ./migrations/scripts/schema_generator /tmp/intermediate_db/base_migration.sql # diff -u migrations/common/intermediate_db_schema/000_base_schema.sql /tmp/intermediate_db/base_migration.sql - name: RSpec run: bin/rspec --default-path migrations/spec