117 lines
3.5 KiB
YAML
117 lines
3.5 KiB
YAML
name: Shared Gem Verify Rails/PostgreSQL
|
|
on:
|
|
workflow_call:
|
|
inputs:
|
|
test_commands:
|
|
description: 'Test commands'
|
|
required: false
|
|
default: "bundle exec rspec"
|
|
type: string
|
|
dependencies:
|
|
description: 'Array of system dependencies to install'
|
|
required: false
|
|
default: "[]"
|
|
type: string
|
|
additional_rails_versions:
|
|
description: 'Additional Rails version requirements as a JSON array (for example: ["~> 8.1.0"])'
|
|
required: false
|
|
default: "[]"
|
|
type: string
|
|
# Caller example:
|
|
# with:
|
|
# additional_rails_versions: '["~> 8.1.0", "~> 8.2.0"]'
|
|
|
|
jobs:
|
|
prepare_matrix:
|
|
runs-on: ubuntu-latest
|
|
outputs:
|
|
rails_versions: ${{ steps.merge_rails_versions.outputs.rails_versions }}
|
|
steps:
|
|
- name: Build Rails version matrix
|
|
id: merge_rails_versions
|
|
run: |
|
|
default_rails_versions='["~> 7.0.0","~> 7.1.0","~> 7.2.0"]'
|
|
additional_rails_versions='${{ inputs.additional_rails_versions }}'
|
|
|
|
rails_versions=$(jq -cn \
|
|
--argjson defaults "$default_rails_versions" \
|
|
--argjson extras "$additional_rails_versions" \
|
|
'$defaults + $extras | unique')
|
|
|
|
echo "rails_versions=$rails_versions" >> "$GITHUB_OUTPUT"
|
|
shell: bash
|
|
|
|
test:
|
|
needs: prepare_matrix
|
|
runs-on: ${{ matrix.os }}
|
|
timeout-minutes: 40
|
|
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
ruby:
|
|
- '3.2'
|
|
- '3.3'
|
|
- '3.4'
|
|
rails: ${{ fromJSON(needs.prepare_matrix.outputs.rails_versions) }}
|
|
postgres:
|
|
- '14.19'
|
|
- '16.8'
|
|
os:
|
|
- ubuntu-latest
|
|
|
|
env:
|
|
RAILS_ENV: test
|
|
RAILS_VERSION: ${{ matrix.rails }}
|
|
|
|
name: ${{ matrix.os }} - Ruby ${{ matrix.ruby }} - Rails ${{ matrix.rails }} - PostgreSQL ${{ matrix.postgres }}
|
|
steps:
|
|
- name: Install system dependencies
|
|
run: |
|
|
dependencies=$(echo '${{ inputs.dependencies }}' | jq -r '.[]')
|
|
for dep in $dependencies; do
|
|
sudo apt-get -y --no-install-recommends install "$dep"
|
|
done
|
|
shell: bash
|
|
|
|
- name: Set up PostgreSQL service
|
|
run: |
|
|
docker run --name postgres -d -p 5432:5432 \
|
|
-e POSTGRES_USER=postgres \
|
|
-e POSTGRES_PASSWORD=postgres \
|
|
--health-cmd="pg_isready" \
|
|
--health-interval="10s" \
|
|
--health-timeout="5s" \
|
|
--health-retries=5 \
|
|
postgres:${{ matrix.postgres }}
|
|
|
|
- name: Wait for PostgreSQL to be healthy
|
|
run: |
|
|
docker exec postgres sh -c 'until pg_isready -U postgres; do echo waiting for postgres; sleep 2; done; echo postgres is ready'
|
|
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Setup Ruby
|
|
uses: ruby/setup-ruby@v1
|
|
with:
|
|
ruby-version: ${{ matrix.ruby }}
|
|
bundler-cache: true
|
|
|
|
- name: Update Rails version
|
|
run: |
|
|
# Add the gem explicitly if it doesn't exist
|
|
if ! grep -q "gem ['\"]rails['\"]" Gemfile; then
|
|
echo 'gem "rails"' >> Gemfile
|
|
fi
|
|
|
|
# Ensure the gem is on the latest version
|
|
ruby -pi -e "gsub(/gem ['\"]rails['\"](, *['\"].*['\"])?/, \"gem 'rails', '${{ matrix.rails }}'\")" Gemfile
|
|
bundle update
|
|
bundle install
|
|
bundle show rails
|
|
shell: bash
|
|
|
|
- name: Test
|
|
run: ${{ inputs.test_commands }}
|