name: Ruby Testing on: merge_group: push: branches: - 'main' - 'stable-*' pull_request: env: BUNDLE_CLEAN: true BUNDLE_FROZEN: true concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: build: runs-on: ubuntu-latest strategy: fail-fast: true matrix: mode: - production - test env: RAILS_ENV: ${{ matrix.mode }} BUNDLE_WITH: ${{ matrix.mode }} SECRET_KEY_BASE_DUMMY: 1 steps: - uses: actions/checkout@v4 - name: Set up Ruby environment uses: ./.github/actions/setup-ruby - name: Set up Javascript environment uses: ./.github/actions/setup-javascript with: onlyProduction: 'true' - name: Cache assets from compilation uses: actions/cache@v4 with: path: | public/assets public/packs public/packs-test tmp/cache/webpacker key: ${{ matrix.mode }}-assets-${{ github.head_ref || github.ref_name }}-${{ github.sha }} restore-keys: | ${{ matrix.mode }}-assets-${{ github.head_ref || github.ref_name }}-${{ github.sha }} ${{ matrix.mode }}-assets-${{ github.head_ref || github.ref_name }} ${{ matrix.mode }}-assets-main ${{ matrix.mode }}-assets - name: Precompile assets run: |- bin/rails assets:precompile - name: Archive asset artifacts run: | tar --exclude={"*.br","*.gz"} -zcf artifacts.tar.gz public/assets public/packs* - uses: actions/upload-artifact@v4 if: matrix.mode == 'test' with: path: |- ./artifacts.tar.gz name: ${{ github.sha }} retention-days: 0 test: runs-on: ubuntu-latest needs: - build services: postgres: image: postgres:14-alpine env: POSTGRES_PASSWORD: postgres POSTGRES_USER: postgres options: >- --health-cmd pg_isready --health-interval 10ms --health-timeout 3s --health-retries 50 ports: - 5432:5432 redis: image: redis:7-alpine options: >- --health-cmd "redis-cli ping" --health-interval 10ms --health-timeout 3s --health-retries 50 ports: - 6379:6379 env: DB_HOST: localhost DB_USER: postgres DB_PASS: postgres DISABLE_SIMPLECOV: ${{ matrix.ruby-version != '.ruby-version' }} RAILS_ENV: test ALLOW_NOPAM: true PAM_ENABLED: true PAM_DEFAULT_SERVICE: pam_test PAM_CONTROLLED_SERVICE: pam_test_controlled OIDC_ENABLED: true OIDC_SCOPE: read SAML_ENABLED: true CAS_ENABLED: true BUNDLE_WITH: 'pam_authentication test' GITHUB_RSPEC: ${{ matrix.ruby-version == '.ruby-version' && github.event.pull_request && 'true' }} strategy: fail-fast: false matrix: ruby-version: - '3.2' - '.ruby-version' steps: - uses: actions/checkout@v4 - uses: actions/download-artifact@v4 with: path: './' name: ${{ github.sha }} - name: Expand archived asset artifacts run: | tar xvzf artifacts.tar.gz - name: Set up Ruby environment uses: ./.github/actions/setup-ruby with: ruby-version: ${{ matrix.ruby-version}} additional-system-dependencies: ffmpeg imagemagick libpam-dev - name: Load database schema run: | bin/rails db:setup bin/flatware fan bin/rails db:test:prepare - name: Cache RSpec persistence file uses: actions/cache@v4 with: path: | tmp/rspec/examples.txt key: rspec-persistence-${{ github.head_ref || github.ref_name }}-${{ github.sha }} restore-keys: | rspec-persistence-${{ github.head_ref || github.ref_name }}-${{ github.sha }}-${{ matrix.ruby-version }} rspec-persistence-${{ github.head_ref || github.ref_name }}-${{ github.sha }} rspec-persistence-${{ github.head_ref || github.ref_name }} rspec-persistence-main rspec-persistence - run: bin/flatware rspec -r ./spec/flatware_helper.rb - name: Upload coverage reports to Codecov if: matrix.ruby-version == '.ruby-version' uses: codecov/codecov-action@v4 with: files: coverage/lcov/*.lcov env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} test-libvips: name: Libvips tests runs-on: ubuntu-24.04 needs: - build services: postgres: image: postgres:14-alpine env: POSTGRES_PASSWORD: postgres POSTGRES_USER: postgres options: >- --health-cmd pg_isready --health-interval 10ms --health-timeout 3s --health-retries 50 ports: - 5432:5432 redis: image: redis:7-alpine options: >- --health-cmd "redis-cli ping" --health-interval 10ms --health-timeout 3s --health-retries 50 ports: - 6379:6379 env: DB_HOST: localhost DB_USER: postgres DB_PASS: postgres DISABLE_SIMPLECOV: ${{ matrix.ruby-version != '.ruby-version' }} RAILS_ENV: test ALLOW_NOPAM: true PAM_ENABLED: true PAM_DEFAULT_SERVICE: pam_test PAM_CONTROLLED_SERVICE: pam_test_controlled OIDC_ENABLED: true OIDC_SCOPE: read SAML_ENABLED: true CAS_ENABLED: true BUNDLE_WITH: 'pam_authentication test' GITHUB_RSPEC: ${{ matrix.ruby-version == '.ruby-version' && github.event.pull_request && 'true' }} MASTODON_USE_LIBVIPS: true strategy: fail-fast: false matrix: ruby-version: - '3.2' - '.ruby-version' steps: - uses: actions/checkout@v4 - uses: actions/download-artifact@v4 with: path: './' name: ${{ github.sha }} - name: Expand archived asset artifacts run: | tar xvzf artifacts.tar.gz - name: Set up Ruby environment uses: ./.github/actions/setup-ruby with: ruby-version: ${{ matrix.ruby-version}} additional-system-dependencies: ffmpeg libpam-dev - name: Load database schema run: './bin/rails db:create db:schema:load db:seed' - run: bin/rspec --tag attachment_processing - name: Upload coverage reports to Codecov if: matrix.ruby-version == '.ruby-version' uses: codecov/codecov-action@v4 with: files: coverage/lcov/mastodon.lcov env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} test-e2e: name: End to End testing runs-on: ubuntu-latest needs: - build services: postgres: image: postgres:14-alpine env: POSTGRES_PASSWORD: postgres POSTGRES_USER: postgres options: >- --health-cmd pg_isready --health-interval 10ms --health-timeout 3s --health-retries 50 ports: - 5432:5432 redis: image: redis:7-alpine options: >- --health-cmd "redis-cli ping" --health-interval 10ms --health-timeout 3s --health-retries 50 ports: - 6379:6379 env: DB_HOST: localhost DB_USER: postgres DB_PASS: postgres DISABLE_SIMPLECOV: true RAILS_ENV: test BUNDLE_WITH: test LOCAL_DOMAIN: localhost:3000 LOCAL_HTTPS: false strategy: fail-fast: false matrix: ruby-version: - '3.2' - '.ruby-version' steps: - uses: actions/checkout@v4 - uses: actions/download-artifact@v4 with: path: './' name: ${{ github.sha }} - name: Expand archived asset artifacts run: | tar xvzf artifacts.tar.gz - name: Set up Ruby environment uses: ./.github/actions/setup-ruby with: ruby-version: ${{ matrix.ruby-version}} additional-system-dependencies: ffmpeg imagemagick - name: Set up Javascript environment uses: ./.github/actions/setup-javascript - name: Load database schema run: './bin/rails db:create db:schema:load db:seed' - run: bin/rspec spec/system --tag streaming --tag js - name: Archive logs uses: actions/upload-artifact@v4 if: failure() with: name: e2e-logs-${{ matrix.ruby-version }} path: log/ - name: Archive test screenshots uses: actions/upload-artifact@v4 if: failure() with: name: e2e-screenshots path: tmp/capybara/ test-search: name: Elastic Search integration testing runs-on: ubuntu-latest needs: - build services: postgres: image: postgres:14-alpine env: POSTGRES_PASSWORD: postgres POSTGRES_USER: postgres options: >- --health-cmd pg_isready --health-interval 10ms --health-timeout 3s --health-retries 50 ports: - 5432:5432 redis: image: redis:7-alpine options: >- --health-cmd "redis-cli ping" --health-interval 10ms --health-timeout 3s --health-retries 50 ports: - 6379:6379 elasticsearch: image: ${{ contains(matrix.search-image, 'elasticsearch') && matrix.search-image || '' }} env: discovery.type: single-node xpack.security.enabled: false options: >- --health-cmd "curl http://localhost:9200/_cluster/health" --health-interval 2s --health-timeout 3s --health-retries 50 ports: - 9200:9200 opensearch: image: ${{ contains(matrix.search-image, 'opensearch') && matrix.search-image || '' }} env: discovery.type: single-node DISABLE_INSTALL_DEMO_CONFIG: true DISABLE_SECURITY_PLUGIN: true options: >- --health-cmd "curl http://localhost:9200/_cluster/health" --health-interval 2s --health-timeout 3s --health-retries 50 ports: - 9200:9200 env: DB_HOST: localhost DB_USER: postgres DB_PASS: postgres DISABLE_SIMPLECOV: true RAILS_ENV: test BUNDLE_WITH: test ES_ENABLED: true ES_HOST: localhost ES_PORT: 9200 strategy: fail-fast: false matrix: ruby-version: - '3.2' - '.ruby-version' search-image: - docker.elastic.co/elasticsearch/elasticsearch:7.17.13 include: - ruby-version: '.ruby-version' search-image: docker.elastic.co/elasticsearch/elasticsearch:8.10.2 - ruby-version: '.ruby-version' search-image: opensearchproject/opensearch:2 steps: - uses: actions/checkout@v4 - uses: actions/download-artifact@v4 with: path: './' name: ${{ github.sha }} - name: Set up Ruby environment uses: ./.github/actions/setup-ruby with: ruby-version: ${{ matrix.ruby-version}} additional-system-dependencies: ffmpeg imagemagick - name: Set up Javascript environment uses: ./.github/actions/setup-javascript - name: Load database schema run: './bin/rails db:create db:schema:load db:seed' - run: bin/rspec --tag search - name: Archive logs uses: actions/upload-artifact@v4 if: failure() with: name: test-search-logs-${{ matrix.ruby-version }} path: log/ - name: Archive test screenshots uses: actions/upload-artifact@v4 if: failure() with: name: test-search-screenshots path: tmp/capybara/