name: Continuous Integration on: push: branches: [main] pull_request: branches: [main] merge_group: branches: [main] jobs: linters: name: Linters runs-on: ubuntu-latest services: postgres: image: postgis/postgis:14-3.3 env: POSTGRES_USER: tps_test POSTGRES_DB: tps_test POSTGRES_PASSWORD: tps_test ports: [ "5432:5432" ] steps: - uses: actions/checkout@v4 - name: Setup the app code and dependancies uses: ./.github/actions/ci-setup-rails - name: Run linters run: | bundle exec rake lint bundle exec rake zeitwerk:check js_tests: name: JavaScript tests runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup Bun uses: oven-sh/setup-bun@v1 - name: Install Node modules run: | bun --version bun install shell: bash - name: Run tests run: | bun run test - name: Upload coverage to Codecov uses: codecov/codecov-action@v4 env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} unit_tests: name: Unit tests runs-on: ubuntu-latest timeout-minutes: 20 env: RUBY_YJIT_ENABLE: "1" services: postgres: image: postgis/postgis:14-3.3 env: POSTGRES_USER: tps_test POSTGRES_DB: tps_test POSTGRES_PASSWORD: tps_test ports: ["5432:5432"] strategy: matrix: instances: [0, 1, 2, 3, 4, 5] steps: - uses: actions/checkout@v4 - name: Install build dependancies # - fonts pickable by ImageMagick # - rust for YJIT support # - poppler-utils for pdf previews run: sudo apt-get update && sudo apt-get install -y gsfonts rustc redis-server poppler-utils - name: Setup the app runtime and dependencies uses: ./.github/actions/ci-setup-rails - name: Pre-compile assets uses: ./.github/actions/ci-setup-assets - name: Setup split tests uses: ./.github/actions/ci-setup-split-tests with: results_path: tmp/*.junit.xml - name: Run tests run: | SPEC_FILES=$(./split_tests -glob='spec/**/*_spec.rb' -exclude-glob='spec/system/**' -split-index=${{ strategy.job-index }} -split-total=${{ strategy.job-total }} -junit -junit-path=tmp/*.junit.xml) echo "Running tests for bin/rspec $SPEC_FILES" bin/rspec $SPEC_FILES --format progress --format RspecJunitFormatter --out tmp/rspec_${{ github.job }}_${{ strategy.job-index }}.junit.xml - name: Upload test results for this instance uses: actions/upload-artifact@v4 with: name: rspec-results-${{ github.job }}-${{ strategy.job-index }} path: tmp/rspec_${{ github.job }}_${{ strategy.job-index }}.junit.xml - name: Upload coverage to Codecov uses: codecov/codecov-action@v4 env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} system_tests: name: System tests runs-on: ubuntu-latest timeout-minutes: 20 env: RUBY_YJIT_ENABLE: "1" services: postgres: image: postgis/postgis:14-3.3 env: POSTGRES_USER: tps_test POSTGRES_DB: tps_test POSTGRES_PASSWORD: tps_test ports: ["5432:5432"] strategy: matrix: instances: [0, 1] steps: - uses: actions/checkout@v4 - name: Setup the app runtime and dependencies uses: ./.github/actions/ci-setup-rails - name: Setup playwright run: bunx playwright install chromium - name: Pre-compile assets uses: ./.github/actions/ci-setup-assets - name: Setup split tests uses: ./.github/actions/ci-setup-split-tests with: results_path: tmp/*.junit.xml - name: Run tests run: | SPEC_FILES=$(./split_tests -glob='spec/system/**/*_spec.rb' -split-index=${{ strategy.job-index }} -split-total=${{ strategy.job-total }} -junit -junit-path=tmp/*.junit.xml) echo "Running tests for bin/rspec $SPEC_FILES" RAILS_ENV=test bin/rspec $SPEC_FILES --format progress --format RspecJunitFormatter --out tmp/rspec_${{ github.job }}_${{ strategy.job-index }}.junit.xml - name: Upload test results for this instance uses: actions/upload-artifact@v4 with: name: rspec-results-${{ github.job }}-${{ strategy.job-index }} path: tmp/rspec_${{ github.job }}_${{ strategy.job-index }}.junit.xml - name: Upload coverage to Codecov uses: codecov/codecov-action@v4 env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} save_test_reports: name: Save test reports needs: [unit_tests, system_tests] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Collect test results from all instances uses: actions/download-artifact@v4 with: path: tmp pattern: rspec-results-* merge-multiple: true - name: Save test results and timing data, to better split future tests uses: ./.github/actions/ci-save-split-tests with: results_path: tmp/*.junit.xml