mysociety/alaveteli

View on GitHub
.github/workflows/ci.yml

Summary

Maintainability
Test Coverage
name: CI

on:
  push:
    branches: [master, develop]
  pull_request:
    types:
      - opened
      - synchronize

concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

permissions:
  contents: read

jobs:
  check:
    runs-on: ubuntu-latest

    outputs:
      skip_rspec: ${{ steps.skip.outputs.skip_rspec }}

    env:
      GH_TOKEN: ${{ github.token }}

    steps:
    - name: Check for [skip rspec]
      id: skip
      run: |
        if [ "${{ github.event_name }}" = "pull_request" ]; then
          PR_DESCRIPTION=$(gh pr view https://github.com/${{ github.repository }}/pull/${{ github.event.pull_request.number }} --json body -q '.body')
          if echo "$PR_DESCRIPTION" | grep -q "\[skip rspec\]"; then
            echo "Skip RSpec found in PR description. Passing the action."
            echo "skip_rspec=true" >> $GITHUB_OUTPUT
            exit
          fi
        fi
        echo "skip_rspec=false" >> $GITHUB_OUTPUT

  rspec:
    name: Ruby ${{ matrix.ruby }} / PostgreSQL ${{ matrix.postgres }}
    runs-on: ubuntu-latest

    needs: check
    if: needs.check.outputs.skip_rspec == 'false'

    permissions:
      checks: write # for coverallsapp/github-action to create new checks

    strategy:
      fail-fast: false
      matrix:
        include:
        - { ruby: '3.0', postgres: 13.5 }
        - { ruby: '3.1', postgres: 13.5 }
        - { ruby: '3.2', postgres: 13.5 }

    services:
      postgres:
        image: fixmystreet/postgres:${{ matrix.postgres }}
        env:
          POSTGRES_PASSWORD: postgres
        ports:
        - '5432:5432'
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    env:
      DATABASE_URL: postgres://postgres:postgres@localhost:5432/alaveteli_test
      RAILS_ENV: test

    steps:
    - name: Checkout repository
      uses: actions/checkout@v4
      with:
        submodules: true
        fetch-depth: 0

    - name: Install packages
      env:
        DEBIAN_FRONTEND: noninteractive
      run: |
        sudo apt-get -y update
        sudo apt-get -y install exim4-daemon-light
        sudo apt-get -y install `cut -d " " -f 1 config/packages | egrep -v "(^#|wkhtml|bundler|^ruby|^rake)"`

    - name: Install Ruby ${{ matrix.ruby }}
      uses: ruby/setup-ruby@v1
      with:
        ruby-version: ${{ matrix.ruby }}
        bundler-cache: true

    - name: Setup database
      run: |
        psql postgres://postgres:postgres@localhost:5432 <<-EOSQL
          CREATE DATABASE template_utf8 TEMPLATE template0 ENCODING "UTF-8";
          UPDATE pg_database SET datistemplate=true WHERE datname='template_utf8';
          CREATE DATABASE alaveteli_test TEMPLATE template_utf8;
        EOSQL

    - name: Configure application and storage
      run: |
        cp config/general.yml-example config/general.yml
        cp config/storage.yml-example config/storage.yml

    - name: Install theme
      run: |
        bundle exec rake themes:install

    - name: Migrate database
      run: |
        bundle exec rails db:migrate

    - name: Run core tests
      run: |
        bundle exec rspec --format Fivemat

    - name: Run nested gems tests
      run: |
        bundle exec rspec gems/*/spec --format Fivemat

    - name: Coveralls Parallel
      uses: coverallsapp/github-action@master
      continue-on-error: true
      with:
        github-token: ${{ secrets.github_token }}
        flag-name: run-${{ matrix.ruby }}-${{ matrix.gemfile || 'Gemfile' }}
        parallel: true

  coveralls:
    name: Coveralls
    runs-on: ubuntu-latest

    needs: rspec

    permissions:
      checks: write

    steps:
      - name: Coveralls Finished
        uses: coverallsapp/github-action@master
        with:
          github-token: ${{ secrets.github_token }}
          parallel-finished: true