@@ -11,19 +11,17 @@ jobs:
1111 matrix :
1212 include :
1313 - ruby : ' 3.4.4'
14- rails : ' 7.1.5.1 '
14+ rails : ' 7.2.2.2 '
1515 allowed_failure : false # ✅ required
16- # - ruby: '3.4.4'
17- # rails: '7.2'
18- # allowed_failure: true # ⚠️ allowed to fail
1916 - ruby : ' 3.4.4'
20- rails : ' 8.0'
21- allowed_failure : true # ⚠️ allowed to fail
17+ rails : ' 8.0.3 '
18+ allowed_failure : false # ✅ required
2219
2320 env :
2421 RAILS_ENV : test
2522 DATABASE_URL : " postgis://rails:password@localhost:5432/rails_test"
2623 ES_HOST : " http://localhost"
24+ ELASTICSEARCH_URL : " http://localhost:9200"
2725 RAILS_VERSION : ${{ matrix.rails }}
2826
2927 services :
@@ -51,18 +49,18 @@ jobs:
5149 with :
5250 ruby-version : ${{ matrix.ruby }}
5351
54- # Run the automatic bundle-install only on 7.1 .
52+ # Run the automatic bundle-install only on 7.2 .
5553 # For 7.2 / 8.0 it just sets up Ruby *and* restores a cache layer
5654 # that we’ll reuse in the later manual install.
57- bundler-cache : ${{ matrix.rails == '7.1.5.1 ' }}
55+ bundler-cache : ${{ matrix.rails == '8.0.3 ' }}
5856
5957 # One cache bucket per Rails version so they don’t clobber each other.
6058 cache-version : rails-${{ matrix.rails }}
6159
6260 # Updating Rails can legitimately blow up on the experimental tracks,
6361 # so we allow that *step* to error out without failing the job.
6462 - name : Update Rails & install gems
65- if : matrix.rails != '7.1.5.1 '
63+ if : matrix.rails != '8.0.3 '
6664 id : update
6765 run : |
6866 # turn off deployment mode
@@ -74,21 +72,52 @@ jobs:
7472 continue-on-error : ${{ matrix.allowed_failure }}
7573
7674 - name : Prepare DB schema
77- if : (matrix.rails == '7.1.5.1 ') || steps.update.outcome == 'success'
75+ if : (matrix.rails == '8.0.3 ') || steps.update.outcome == 'success'
7876 run : |
7977 rm -f spec/dummy/tmp/pids/server.pid
8078 bundle exec rake -f spec/dummy/Rakefile db:schema:load
8179 continue-on-error : ${{ matrix.allowed_failure }}
8280
81+ - name : Wait for Elasticsearch
82+ if : (matrix.rails == '8.0.3') || steps.update.outcome == 'success'
83+ run : |
84+ echo "Waiting for Elasticsearch to be healthy..."
85+ curl -s "http://localhost:9200/_cluster/health?wait_for_status=yellow&timeout=60s" || (echo "Elasticsearch not healthy" && exit 1)
86+
87+
8388 - name : Run RSpec
84- if : (matrix.rails == '7.1.5.1 ') || steps.update.outcome == 'success'
89+ if : (matrix.rails == '8.0.3 ') || steps.update.outcome == 'success'
8590 env :
8691 RAILS_MASTER_KEY : ${{ secrets.RAILS_MASTER_KEY }}
8792 run : |
8893 rm -f spec/dummy/tmp/pids/server.pid
8994 bundle exec rspec
9095 continue-on-error : ${{ matrix.allowed_failure }}
9196
97+ - name : Upload coverage report
98+ if : always()
99+ uses : actions/upload-artifact@v4
100+ with :
101+ name : coverage-report-ruby-${{ matrix.ruby }}-rails-${{ matrix.rails }}
102+ path : |
103+ coverage/
104+
105+ - name : Generate coverage badge
106+ if : ${{ github.ref == 'refs/heads/main' && success() }}
107+ continue-on-error : true
108+ run : |
109+ COVERAGE=$(jq -r '.result.covered_percent' coverage/.last_run.json)
110+ COLOR=$(node -e "cov=parseFloat(process.argv[1]);console.log(cov>=90?'green':cov>=75?'orange':'red')" $COVERAGE)
111+ npx badgen-cli --subject coverage --status ${COVERAGE}% --color $COLOR > coverage.svg
112+
113+ - name : Commit badge
114+ if : ${{ github.ref == 'refs/heads/main' && success() }}
115+ continue-on-error : true
116+ uses : stefanzweifel/git-auto-commit-action@v5
117+ with :
118+ commit_message : " chore: update coverage badge"
119+ file_pattern : coverage.svg
120+
92121 # ── style & security jobs (unchanged) ───────────────────────────────────────
93122 rubocop :
94123 runs-on : ubuntu-latest
0 commit comments