diff --git a/.coveralls.yml b/.coveralls.yml deleted file mode 100644 index 91600595a1..0000000000 --- a/.coveralls.yml +++ /dev/null @@ -1 +0,0 @@ -service_name: travis-ci diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 539fa4a1d1..7b28ebfcd6 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,3 +5,7 @@ updates: directory: "/" schedule: interval: "daily" + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000000..e9b7cfd4a7 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,115 @@ +name: Lint +on: + - push + - pull_request +env: + os: ubuntu-20.04 + ruby: 2.7 +jobs: + rubocop: + name: RuboCop + runs-on: ubuntu-20.04 + steps: + - name: Check out code + uses: actions/checkout@v2 + - name: Setup ruby + uses: actions/setup-ruby@v1.1.2 + with: + ruby-version: ${{ env.ruby }} + - name: Cache gems + uses: actions/cache@v2 + with: + path: vendor/bundle + key: bundle-${{ env.os }}-${{ env.ruby }}-${{ hashFiles('Gemfile.lock') }} + restore-keys: | + bundle-${{ env.os }}-${{ env.ruby }}- + - name: Install gems + run: | + gem install bundler + bundle config set deployment true + bundle install --jobs 4 --retry 3 + - name: Run rubocop + run: bundle exec rubocop --format fuubar + erblint: + name: ERB Lint + runs-on: ubuntu-20.04 + steps: + - name: Check out code + uses: actions/checkout@v2 + - name: Setup ruby + uses: actions/setup-ruby@v1.1.2 + with: + ruby-version: ${{ env.ruby }} + - name: Cache gems + uses: actions/cache@v2 + with: + path: vendor/bundle + key: bundle-${{ env.os }}-${{ env.ruby }}-${{ hashFiles('Gemfile.lock') }} + restore-keys: | + bundle-${{ env.os }}-${{ env.ruby }}- + - name: Install gems + run: | + gem install bundler + bundle config set deployment true + bundle install --jobs 4 --retry 3 + - name: Run erblint + run: bundle exec erblint . + eslint: + name: ESLint + runs-on: ubuntu-20.04 + steps: + - name: Check out code + uses: actions/checkout@v2 + - name: Setup ruby + uses: actions/setup-ruby@v1.1.2 + with: + ruby-version: ${{ env.ruby }} + - name: Cache gems + uses: actions/cache@v2 + with: + path: vendor/bundle + key: bundle-${{ env.os }}-${{ env.ruby }}-${{ hashFiles('Gemfile.lock') }} + restore-keys: | + bundle-${{ env.os }}-${{ env.ruby }}- + - name: Cache node modules + uses: actions/cache@v1 + with: + path: node_modules + key: yarn-${{ env.os }}-${{ hashFiles('yarn.lock') }} + restore-keys: | + yarn-${{ env.os }}- + - name: Install gems + run: | + gem install bundler + bundle config set deployment true + bundle install --jobs 4 --retry 3 + - name: Install node modules + run: bundle exec rake yarn:install + - name: Create dummy database configuration + run: cp config/example.database.yml config/database.yml + - name: Run eslint + run: bundle exec rake eslint + brakeman: + name: Brakeman + runs-on: ubuntu-20.04 + steps: + - name: Check out code + uses: actions/checkout@v2 + - name: Setup ruby + uses: actions/setup-ruby@v1.1.2 + with: + ruby-version: ${{ env.ruby }} + - name: Cache gems + uses: actions/cache@v2 + with: + path: vendor/bundle + key: bundle-${{ env.os }}-${{ env.ruby }}-${{ hashFiles('Gemfile.lock') }} + restore-keys: | + bundle-${{ env.os }}-${{ env.ruby }}- + - name: Install gems + run: | + gem install bundler + bundle config set deployment true + bundle install --jobs 4 --retry 3 + - name: Run brakeman + run: bundle exec brakeman -q diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000000..b111da9338 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,85 @@ +name: Tests +on: + - push + - pull_request +jobs: + test: + name: Ubuntu ${{ matrix.ubuntu }}, Ruby ${{ matrix.ruby }} + strategy: + matrix: + ubuntu: [18.04, 20.04] + ruby: [2.5, 2.7] + runs-on: ubuntu-${{ matrix.ubuntu }} + env: + RAILS_ENV: test + OPENSTREETMAP_MEMCACHE_SERVERS: 127.0.0.1 + steps: + - name: Checkout source + uses: actions/checkout@v1 + - name: Setup ruby + uses: actions/setup-ruby@v1 + with: + ruby-version: ${{ matrix.ruby }} + - name: Cache gems + uses: actions/cache@v1 + with: + path: vendor/bundle + key: bundle-ubuntu-${{ matrix.ubuntu }}-ruby-${{ matrix.ruby }}-${{ hashFiles('Gemfile.lock') }} + restore-keys: | + bundle-ubuntu-${{ matrix.ubuntu }}-ruby-${{ matrix.ruby }}- + - name: Cache node modules + uses: actions/cache@v1 + with: + path: node_modules + key: yarn-ubuntu-${{ matrix.ubuntu }}-${{ hashFiles('yarn.lock') }} + restore-keys: | + yarn-ubuntu-${{ matrix.ubuntu }}- + - name: Install packages + run: | + sudo apt-get -yqq update + sudo apt-get -yqq install memcached + - name: Install gems + run: | + gem install bundler + bundle config set deployment true + bundle install --jobs 4 --retry 3 + - name: Create database + run: | + sudo systemctl start postgresql + sudo -u postgres createuser -s $(id -un) + createdb openstreetmap + psql -c "CREATE EXTENSION btree_gist" openstreetmap + psql -f db/functions/functions.sql openstreetmap + - name: Configure rails + run: | + cp config/github.database.yml config/database.yml + cp config/example.storage.yml config/storage.yml + touch config/settings.local.yml + - name: Populate database + run: | + sed -f script/normalise-structure db/structure.sql > db/structure.expected + bundle exec rake db:migrate + sed -f script/normalise-structure db/structure.sql > db/structure.actual + diff -uw db/structure.expected db/structure.actual + - name: Export javascript strings + run: bundle exec rake i18n:js:export + - name: Install node modules + run: bundle exec rake yarn:install + - name: Run tests + run: bundle exec rake test:db + - name: Report completion to Coveralls + uses: coverallsapp/github-action@v1.1.2 + with: + github-token: ${{ secrets.github_token }} + flag-name: ubuntu-${{ matrix.ubuntu }}-ruby-${{ matrix.ruby }} + parallel: true + finish: + name: Finalise + needs: test + runs-on: ubuntu-latest + steps: + - name: Report completion to Coveralls + uses: coverallsapp/github-action@v1.1.2 + with: + github-token: ${{ secrets.github_token }} + parallel-finished: true diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 77b17cf9dc..0000000000 --- a/.travis.yml +++ /dev/null @@ -1,38 +0,0 @@ -dist: bionic -language: ruby -rvm: - - 2.7.0 -cache: - - bundler -addons: - postgresql: 9.5 - apt: - packages: - - firefox-geckodriver - - libarchive-dev - - libgd-dev - - libffi-dev - - libbz2-dev -services: - - memcached -before_script: - - sed -e 's/ IMMUTABLE / /' -e "/^--/d" db/structure.sql > db/structure.expected - - psql -U postgres -c "CREATE DATABASE openstreetmap" - - psql -U postgres -c "CREATE EXTENSION btree_gist" openstreetmap - - psql -U postgres -f db/functions/functions.sql openstreetmap - - cp config/travis.database.yml config/database.yml - - cp config/example.storage.yml config/storage.yml - - touch config/settings.local.yml - - echo -e "---\nmemcache_servers:\n - 127.0.0.1" > config/settings/test.local.yml - - bundle exec rake db:migrate - - bundle exec rake i18n:js:export - - bundle exec rake yarn:install -script: - - bundle exec rubocop -f fuubar - - bundle exec rake eslint - - bundle exec erblint . - - bundle exec brakeman -q - - bundle exec rake db:structure:dump - - sed -e "/idle_in_transaction_session_timeout/d" -e 's/ IMMUTABLE / /' -e "/^--/d" db/structure.sql > db/structure.actual - - diff -uw db/structure.expected db/structure.actual - - bundle exec rake test:db diff --git a/Gemfile b/Gemfile index 10cfb970e4..8869fb37cf 100644 --- a/Gemfile +++ b/Gemfile @@ -141,7 +141,6 @@ end group :test do gem "brakeman" gem "capybara", ">= 2.15" - gem "coveralls", :require => false gem "erb_lint", :require => false gem "factory_bot_rails" gem "minitest", "~> 5.1" @@ -152,5 +151,7 @@ group :test do gem "rubocop-performance" gem "rubocop-rails" gem "selenium-webdriver" + gem "simplecov", :require => false + gem "simplecov-lcov", :require => false gem "webmock" end diff --git a/Gemfile.lock b/Gemfile.lock index 61fe25c093..1390383783 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -137,12 +137,6 @@ GEM config (2.2.1) deep_merge (~> 1.2, >= 1.2.1) dry-validation (~> 1.0, >= 1.0.0) - coveralls (0.8.23) - json (>= 1.8, < 3) - simplecov (~> 0.16.1) - term-ansicolor (~> 1.3) - thor (>= 0.19.4, < 2.0) - tins (~> 1.6) crack (0.4.4) crass (1.0.6) dalli (2.7.11) @@ -435,6 +429,7 @@ GEM json (>= 1.8, < 3) simplecov-html (~> 0.10.0) simplecov-html (0.10.2) + simplecov-lcov (0.8.0) smart_properties (1.15.0) sprockets (4.0.2) concurrent-ruby (~> 1.0) @@ -445,14 +440,9 @@ GEM sprockets (>= 3.0.0) strong_migrations (0.7.3) activerecord (>= 5) - sync (0.5.0) - term-ansicolor (1.7.1) - tins (~> 1.0) thor (1.0.1) thread_safe (0.3.6) tilt (2.0.10) - tins (1.26.0) - sync tzinfo (1.2.8) thread_safe (~> 0.1) uglifier (4.2.0) @@ -498,7 +488,6 @@ DEPENDENCIES capybara (>= 2.15) composite_primary_keys (~> 12.0.0) config - coveralls dalli delayed_job_active_record dynamic_form @@ -552,6 +541,8 @@ DEPENDENCIES sassc-rails secure_headers selenium-webdriver + simplecov + simplecov-lcov strong_migrations uglifier (>= 1.3.0) validates_email_format_of (>= 1.5.1) diff --git a/README.md b/README.md index 81b8ce7bf6..9d5ac53ebe 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # "The Rails Port" -[![Build Status](https://travis-ci.org/openstreetmap/openstreetmap-website.svg?branch=master)](https://travis-ci.org/openstreetmap/openstreetmap-website) +[![Lint](https://github.com/openstreetmap/openstreetmap-website/workflows/Lint/badge.svg?branch=master&event=push)](https://github.com/openstreetmap/openstreetmap-website/actions?query=workflow%3ALint%20branch%3Amaster%20event%3Apush) +[![Tests](https://github.com/openstreetmap/openstreetmap-website/workflows/Tests/badge.svg?branch=master&event=push)](https://github.com/openstreetmap/openstreetmap-website/actions?query=workflow%3ATests%20branch%3Amaster%20event%3Apush) [![Coverage Status](https://coveralls.io/repos/openstreetmap/openstreetmap-website/badge.svg?branch=master)](https://coveralls.io/r/openstreetmap/openstreetmap-website?branch=master) This is The Rails Port, the [Ruby on Rails](http://rubyonrails.org/) diff --git a/config/github.database.yml b/config/github.database.yml new file mode 100644 index 0000000000..9f9c4b1dee --- /dev/null +++ b/config/github.database.yml @@ -0,0 +1,4 @@ +test: + adapter: postgresql + database: openstreetmap + encoding: utf8 diff --git a/script/normalise-structure b/script/normalise-structure new file mode 100644 index 0000000000..9cf0b6cae9 --- /dev/null +++ b/script/normalise-structure @@ -0,0 +1,10 @@ +/^$/d +/^--/d +/^CREATE EXTENSION IF NOT EXISTS plpgsql /d +/^COMMENT ON EXTENSION plpgsql /d +/^SET default_with_oids /d +/^SET default_table_access_method /d +/^SET idle_in_transaction_session_timeout /d +/^ AS integer$/d + +s/ IMMUTABLE / / diff --git a/test/test_helper.rb b/test/test_helper.rb index 720618ba09..41dac890a4 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,21 +1,30 @@ -require "coveralls" -Coveralls.wear!("rails") - -# Override the simplecov output message, since it is mostly unwanted noise -module SimpleCov - module Formatter - class HTMLFormatter - def output_message(_result); end +require "simplecov" +require "simplecov-lcov" + +# Fix incompatibility of simplecov-lcov with older versions of simplecov that are not expresses in its gemspec. +# https://github.com/fortissimo1997/simplecov-lcov/pull/25 +unless SimpleCov.respond_to?(:branch_coverage) + module SimpleCov + def self.branch_coverage? + false end end end -# Output both the local simplecov html and the coveralls report -SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new( - [SimpleCov::Formatter::HTMLFormatter, - Coveralls::SimpleCov::Formatter] +SimpleCov::Formatter::LcovFormatter.config do |config| + config.report_with_single_file = true + config.single_report_path = "coverage/lcov.info" +end + +SimpleCov.formatters = SimpleCov::Formatter::MultiFormatter.new( + [ + SimpleCov::Formatter::HTMLFormatter, + SimpleCov::Formatter::LcovFormatter + ] ) +SimpleCov.start("rails") + require "securerandom" require "digest/sha1"