diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 082349abf873428fb8e7ca37b505060d670c784b..242e64f96c6f12ec029e30f2f85fa659ded09588 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -108,18 +108,6 @@ stages:
 
 # END EE-only service helpers
 
-.rails4: &rails4
-  allow_failure: false
-  except:
-    variables:
-      - $CI_COMMIT_REF_NAME =~ /(^docs[\/-].*|.*-docs$)/
-      - $CI_COMMIT_REF_NAME =~ /(^qa[\/-].*|.*-qa$)/
-      - $CI_COMMIT_REF_NAME =~ /norails4/
-      - $RAILS5_DISABLED
-  variables:
-    BUNDLE_GEMFILE: "Gemfile.rails4"
-    RAILS5: "false"
-
 # Skip all jobs except the ones that begin with 'docs/'.
 # Used for commits including ONLY documentation changes.
 # https://docs.gitlab.com/ce/development/documentation/#testing
@@ -211,18 +199,10 @@ stages:
   <<: *rspec-metadata
   <<: *use-pg
 
-.rspec-metadata-pg-rails4: &rspec-metadata-pg-rails4
-  <<: *rspec-metadata-pg
-  <<: *rails4
-
 .rspec-metadata-mysql: &rspec-metadata-mysql
   <<: *rspec-metadata
   <<: *use-mysql
 
-.rspec-metadata-mysql-rails4: &rspec-metadata-mysql-rails4
-  <<: *rspec-metadata-mysql
-  <<: *rails4
-
 .rspec-metadata-ee: &rspec-metadata-ee
   <<: *rspec-metadata
   stage: test
@@ -265,22 +245,6 @@ stages:
     - scripts/gitaly-test-spawn
     - bundle exec rspec --color --format documentation --format RspecJunitFormatter --out junit_rspec.xml --tag geo ee/spec/
 
-.rspec-ee-pg-rails4: &rspec-ee-pg-rails4
-  <<: *rspec-ee-pg
-  <<: *rails4
-
-.rspec-ee-mysql-rails4: &rspec-ee-mysql-rails4
-  <<: *rspec-ee-mysql
-  <<: *rails4
-
-.rspec-geo-pg-9-6-rails4: &rspec-metadata-pg-geo-9-6-rails4
-  <<: *rspec-metadata-pg-geo-9-6
-  <<: *rails4
-
-.rspec-geo-pg-10-2-rails4: &rspec-metadata-pg-geo-10-2-rails4
-  <<: *rspec-metadata-pg-geo-10-2
-  <<: *rails4
-
 .only-canonical-masters: &only-canonical-masters
   only:
     - master@gitlab-org/gitlab-ce
@@ -569,7 +533,6 @@ setup-test-env:
   script:
     - bundle exec ruby -Ispec -e 'require "spec_helper" ; TestEnv.init'
     - scripts/gitaly-test-build # Do not use 'bundle exec' here
-    - BUNDLE_GEMFILE=Gemfile.rails4 bundle install $BUNDLE_INSTALL_FLAGS
   artifacts:
     expire_in: 7d
     paths:
@@ -650,14 +613,6 @@ rspec-mysql:
   <<: *rspec-metadata-mysql
   parallel: 50
 
-rspec-pg-rails4:
-  <<: *rspec-metadata-pg-rails4
-  parallel: 50
-
-rspec-mysql-rails4:
-  <<: *rspec-metadata-mysql-rails4
-  parallel: 50
-
 # EE jobs START
 rspec-pg-ee:
   <<: *rspec-ee-pg
@@ -669,17 +624,6 @@ rspec-mysql-ee:
 
 rspec-pg geo: *rspec-metadata-pg-geo-9-6
 rspec-pg-10 geo: *rspec-metadata-pg-geo-10-2
-
-rspec-pg-ee-rails4:
-  <<: *rspec-ee-pg-rails4
-  parallel: 10
-
-rspec-mysql-ee-rails4:
-  <<: *rspec-ee-mysql-rails4
-  parallel: 10
-
-rspec-pg-geo-rails4: *rspec-metadata-pg-geo-9-6-rails4
-rspec-pg-10-geo-rails4: *rspec-metadata-pg-geo-10-2-rails4
 # EE jobs END
 
 static-analysis:
@@ -728,12 +672,6 @@ downtime_check:
     - /(^docs[\/-].*|.*-docs$)/
     - /(^qa[\/-].*|.*-qa$)/
 
-rails4_gemfile_lock_check:
-  <<: *dedicated-no-docs-no-db-pull-cache-job
-  <<: *except-docs-and-qa
-  script:
-    - scripts/rails4-gemfile-lock-check
-
 ee_compat_check:
   <<: *rake-exec
   dependencies: []
diff --git a/Gemfile b/Gemfile
index ae7c445b3ca064cfda8126451ba578c17af5ac78..f4e836af148b10908e26cd33ae37a079de52ebec 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,22 +1,6 @@
-# --- Special code for migrating to Rails 5.0 ---
-def rails5?
-  !%w[0 false].include?(ENV["RAILS5"])
-end
-
-gem_versions = {}
-gem_versions['activerecord_sane_schema_dumper'] = rails5? ? '1.0'    : '0.2'
-gem_versions['rails']                           = rails5? ? '5.0.7'  : '4.2.11'
-gem_versions['rails-i18n']                      = rails5? ? '~> 5.1' : '~> 4.0.9'
-
-# The 2.0.6 version of rack requires monkeypatch to be present in
-# `config.ru`. This can be removed once a new update for Rack
-# is available that contains https://github.com/rack/rack/pull/1201.
-gem_versions['rack']                            = rails5? ? '2.0.6' : '1.6.11'
-# --- The end of special code for migrating to Rails 5.0 ---
-
 source 'https://rubygems.org'
 
-gem 'rails', gem_versions['rails']
+gem 'rails', '5.0.7'
 gem 'rails-deprecated_sanitizer', '~> 1.0.3'
 
 # Improves copy-on-write performance for MRI
@@ -28,11 +12,7 @@ gem 'responders', '~> 2.0'
 gem 'sprockets', '~> 3.7.0'
 
 # Default values for AR models
-if rails5?
-  gem 'gitlab-default_value_for', '~> 3.1.1', require: 'default_value_for'
-else
-  gem 'default_value_for', '~> 3.0.0'
-end
+gem 'gitlab-default_value_for', '~> 3.1.1', require: 'default_value_for'
 
 # Supported DBs
 gem 'mysql2', '~> 0.4.10', group: :mysql
@@ -169,7 +149,10 @@ gem 'icalendar'
 gem 'diffy', '~> 3.1.0'
 
 # Application server
-gem 'rack', gem_versions['rack']
+# The 2.0.6 version of rack requires monkeypatch to be present in
+# `config.ru`. This can be removed once a new update for Rack
+# is available that contains https://github.com/rack/rack/pull/1201.
+gem 'rack', '2.0.6'
 
 group :unicorn do
   gem 'unicorn', '~> 5.1.0'
@@ -309,7 +292,7 @@ gem 'premailer-rails', '~> 1.9.7'
 
 # I18n
 gem 'ruby_parser', '~> 3.8', require: false
-gem 'rails-i18n', gem_versions['rails-i18n']
+gem 'rails-i18n', '~> 5.1'
 gem 'gettext_i18n_rails', '~> 1.8.0'
 gem 'gettext_i18n_rails_js', '~> 1.3'
 gem 'gettext', '~> 3.2.2', require: false, group: :development
@@ -395,7 +378,7 @@ group :development, :test do
   gem 'license_finder', '~> 5.4', require: false
   gem 'knapsack', '~> 1.17'
 
-  gem 'activerecord_sane_schema_dumper', gem_versions['activerecord_sane_schema_dumper']
+  gem 'activerecord_sane_schema_dumper', '1.0'
 
   gem 'stackprof', '~> 0.2.10', require: false
 
@@ -409,8 +392,7 @@ group :test do
   gem 'email_spec', '~> 2.2.0'
   gem 'json-schema', '~> 2.8.0'
   gem 'webmock', '~> 2.3.2'
-  gem 'rails-controller-testing' if rails5? # Rails5 only gem.
-  gem 'test_after_commit', '~> 1.1' unless rails5? # Remove this gem when migrated to rails 5.0. It's been integrated to rails 5.0.
+  gem 'rails-controller-testing'
   gem 'sham_rack', '~> 1.3.6'
   gem 'concurrent-ruby', '~> 1.1'
   gem 'test-prof', '~> 0.2.5'
diff --git a/Gemfile.rails4 b/Gemfile.rails4
deleted file mode 100644
index 0ec00e702aadaa066ccf13bc59fce8a1409ba859..0000000000000000000000000000000000000000
--- a/Gemfile.rails4
+++ /dev/null
@@ -1,7 +0,0 @@
-# BUNDLE_GEMFILE=Gemfile.rails4 bundle install
-
-ENV["RAILS5"] = "false"
-
-gemfile = File.expand_path("../Gemfile", __FILE__)
-
-eval(File.read(gemfile), nil, gemfile)
diff --git a/Gemfile.rails4.lock b/Gemfile.rails4.lock
deleted file mode 100644
index 0ab5afed24abb1d1e2a688a178ac042071cd776a..0000000000000000000000000000000000000000
--- a/Gemfile.rails4.lock
+++ /dev/null
@@ -1,1201 +0,0 @@
-GEM
-  remote: https://rubygems.org/
-  specs:
-    RedCloth (4.3.2)
-    abstract_type (0.0.7)
-    ace-rails-ap (4.1.2)
-    actionmailer (4.2.10)
-      actionpack (= 4.2.10)
-      actionview (= 4.2.10)
-      activejob (= 4.2.10)
-      mail (~> 2.5, >= 2.5.4)
-      rails-dom-testing (~> 1.0, >= 1.0.5)
-    actionpack (4.2.10)
-      actionview (= 4.2.10)
-      activesupport (= 4.2.10)
-      rack (~> 1.6)
-      rack-test (~> 0.6.2)
-      rails-dom-testing (~> 1.0, >= 1.0.5)
-      rails-html-sanitizer (~> 1.0, >= 1.0.2)
-    actionview (4.2.10)
-      activesupport (= 4.2.10)
-      builder (~> 3.1)
-      erubis (~> 2.7.0)
-      rails-dom-testing (~> 1.0, >= 1.0.5)
-      rails-html-sanitizer (~> 1.0, >= 1.0.3)
-    activejob (4.2.10)
-      activesupport (= 4.2.10)
-      globalid (>= 0.3.0)
-    activemodel (4.2.10)
-      activesupport (= 4.2.10)
-      builder (~> 3.1)
-    activerecord (4.2.10)
-      activemodel (= 4.2.10)
-      activesupport (= 4.2.10)
-      arel (~> 6.0)
-    activerecord_sane_schema_dumper (0.2)
-      rails (>= 4, < 5)
-    activesupport (4.2.10)
-      i18n (~> 0.7)
-      minitest (~> 5.1)
-      thread_safe (~> 0.3, >= 0.3.4)
-      tzinfo (~> 1.1)
-    acts-as-taggable-on (5.0.0)
-      activerecord (>= 4.2.8)
-    adamantium (0.2.0)
-      ice_nine (~> 0.11.0)
-      memoizable (~> 0.4.0)
-    addressable (2.5.2)
-      public_suffix (>= 2.0.2, < 4.0)
-    aes_key_wrap (1.0.1)
-    akismet (2.0.0)
-    arel (6.0.4)
-    asana (0.8.1)
-      faraday (~> 0.9)
-      faraday_middleware (~> 0.9)
-      faraday_middleware-multi_json (~> 0.0)
-      oauth2 (~> 1.0)
-    asciidoctor (1.5.8)
-    asciidoctor-plantuml (0.0.8)
-      asciidoctor (~> 1.5)
-    ast (2.4.0)
-    atomic (1.1.99)
-    attr_encrypted (3.1.0)
-      encryptor (~> 3.0.0)
-    attr_required (1.0.0)
-    awesome_print (1.8.0)
-    aws-sdk (2.9.32)
-      aws-sdk-resources (= 2.9.32)
-    aws-sdk-core (2.9.32)
-      aws-sigv4 (~> 1.0)
-      jmespath (~> 1.0)
-    aws-sdk-resources (2.9.32)
-      aws-sdk-core (= 2.9.32)
-    aws-sigv4 (1.0.0)
-    axiom-types (0.1.1)
-      descendants_tracker (~> 0.0.4)
-      ice_nine (~> 0.11.0)
-      thread_safe (~> 0.3, >= 0.3.1)
-    babosa (1.0.2)
-    base32 (0.3.2)
-    batch-loader (1.2.2)
-    bcrypt (3.1.12)
-    bcrypt_pbkdf (1.0.0)
-    benchmark-ips (2.3.0)
-    better_errors (2.5.0)
-      coderay (>= 1.0.0)
-      erubi (>= 1.0.0)
-      rack (>= 0.9.0)
-    bindata (2.4.3)
-    binding_ninja (0.2.2)
-    binding_of_caller (0.8.0)
-      debug_inspector (>= 0.0.1)
-    bootsnap (1.3.2)
-      msgpack (~> 1.0)
-    bootstrap_form (2.7.0)
-    brakeman (4.2.1)
-    browser (2.5.3)
-    builder (3.2.3)
-    bullet (5.5.1)
-      activesupport (>= 3.0.0)
-      uniform_notifier (~> 1.10.0)
-    bundler-audit (0.5.0)
-      bundler (~> 1.2)
-      thor (~> 0.18)
-    byebug (9.0.6)
-    capybara (2.15.1)
-      addressable
-      mini_mime (>= 0.1.3)
-      nokogiri (>= 1.3.3)
-      rack (>= 1.0.0)
-      rack-test (>= 0.5.4)
-      xpath (~> 2.0)
-    capybara-screenshot (1.0.14)
-      capybara (>= 1.0, < 3)
-      launchy
-    carrierwave (1.2.3)
-      activemodel (>= 4.0.0)
-      activesupport (>= 4.0.0)
-      mime-types (>= 1.16)
-    cause (0.1)
-    charlock_holmes (0.7.6)
-    childprocess (0.9.0)
-      ffi (~> 1.0, >= 1.0.11)
-    chronic (0.10.2)
-    chronic_duration (0.10.6)
-      numerizer (~> 0.1.1)
-    chunky_png (1.3.5)
-    citrus (3.0.2)
-    coderay (1.1.2)
-    coercible (1.0.0)
-      descendants_tracker (~> 0.0.1)
-    commonmarker (0.17.13)
-      ruby-enum (~> 0.5)
-    concord (0.1.5)
-      adamantium (~> 0.2.0)
-      equalizer (~> 0.0.9)
-    concurrent-ruby (1.1.3)
-    concurrent-ruby-ext (1.1.3)
-      concurrent-ruby (= 1.1.3)
-    connection_pool (2.2.2)
-    crack (0.4.3)
-      safe_yaml (~> 1.0.0)
-    crass (1.0.4)
-    creole (0.5.0)
-    css_parser (1.5.0)
-      addressable
-    daemons (1.2.6)
-    database_cleaner (1.5.3)
-    debug_inspector (0.0.3)
-    debugger-ruby_core_source (1.3.8)
-    deckar01-task_list (2.0.0)
-      html-pipeline
-    declarative (0.0.10)
-    declarative-option (0.1.0)
-    default_value_for (3.0.2)
-      activerecord (>= 3.2.0, < 5.1)
-    descendants_tracker (0.0.4)
-      thread_safe (~> 0.3, >= 0.3.1)
-    device_detector (1.0.0)
-    devise (4.4.3)
-      bcrypt (~> 3.0)
-      orm_adapter (~> 0.1)
-      railties (>= 4.1.0, < 6.0)
-      responders
-      warden (~> 1.2.3)
-    devise-two-factor (3.0.0)
-      activesupport
-      attr_encrypted (>= 1.3, < 4, != 2)
-      devise (~> 4.0)
-      railties
-      rotp (~> 2.0)
-    diff-lcs (1.3)
-    diffy (3.1.0)
-    discordrb-webhooks-blackst0ne (3.3.0)
-      rest-client (~> 2.0)
-    docile (1.1.5)
-    domain_name (0.5.20180417)
-      unf (>= 0.0.5, < 1.0.0)
-    doorkeeper (4.3.2)
-      railties (>= 4.2)
-    doorkeeper-openid_connect (1.5.0)
-      doorkeeper (~> 4.3)
-      json-jwt (~> 1.6)
-    ed25519 (1.2.4)
-    elasticsearch (5.0.3)
-      elasticsearch-api (= 5.0.3)
-      elasticsearch-transport (= 5.0.3)
-    elasticsearch-api (5.0.3)
-      multi_json
-    elasticsearch-model (0.1.9)
-      activesupport (> 3)
-      elasticsearch (> 0.4)
-      hashie
-    elasticsearch-rails (0.1.9)
-    elasticsearch-transport (5.0.3)
-      faraday
-      multi_json
-    email_reply_trimmer (0.1.6)
-    email_spec (2.2.0)
-      htmlentities (~> 4.3.3)
-      launchy (~> 2.1)
-      mail (~> 2.7)
-    encryptor (3.0.0)
-    equalizer (0.0.11)
-    erubi (1.7.1)
-    erubis (2.7.0)
-    escape_utils (1.2.1)
-    et-orbi (1.0.3)
-      tzinfo
-    eventmachine (1.2.7)
-    excon (0.62.0)
-    execjs (2.6.0)
-    expression_parser (0.9.0)
-    factory_bot (4.8.2)
-      activesupport (>= 3.0.0)
-    factory_bot_rails (4.8.2)
-      factory_bot (~> 4.8.2)
-      railties (>= 3.0.0)
-    faraday (0.12.2)
-      multipart-post (>= 1.2, < 3)
-    faraday_middleware (0.12.2)
-      faraday (>= 0.7.4, < 1.0)
-    faraday_middleware-aws-signers-v4 (0.1.7)
-      aws-sdk-resources (~> 2)
-      faraday (~> 0.9)
-    faraday_middleware-multi_json (0.0.6)
-      faraday_middleware
-      multi_json
-    fast_blank (1.0.0)
-    fast_gettext (1.6.0)
-    ffaker (2.10.0)
-    ffi (1.9.25)
-    flipper (0.13.0)
-    flipper-active_record (0.13.0)
-      activerecord (>= 3.2, < 6)
-      flipper (~> 0.13.0)
-    flipper-active_support_cache_store (0.13.0)
-      activesupport (>= 3.2, < 6)
-      flipper (~> 0.13.0)
-    flowdock (0.7.1)
-      httparty (~> 0.7)
-      multi_json
-    fog-aliyun (0.2.0)
-      fog-core (~> 1.27)
-      fog-json (~> 1.0)
-      ipaddress (~> 0.8)
-      xml-simple (~> 1.1)
-    fog-aws (2.0.1)
-      fog-core (~> 1.38)
-      fog-json (~> 1.0)
-      fog-xml (~> 0.1)
-      ipaddress (~> 0.8)
-    fog-core (1.45.0)
-      builder
-      excon (~> 0.58)
-      formatador (~> 0.2)
-    fog-google (1.7.1)
-      fog-core
-      fog-json
-      fog-xml
-      google-api-client (~> 0.23.0)
-    fog-json (1.0.2)
-      fog-core (~> 1.0)
-      multi_json (~> 1.10)
-    fog-local (0.3.1)
-      fog-core (~> 1.27)
-    fog-openstack (0.1.21)
-      fog-core (>= 1.40)
-      fog-json (>= 1.0)
-      ipaddress (>= 0.8)
-    fog-rackspace (0.1.1)
-      fog-core (>= 1.35)
-      fog-json (>= 1.0)
-      fog-xml (>= 0.1)
-      ipaddress (>= 0.8)
-    fog-xml (0.1.3)
-      fog-core
-      nokogiri (>= 1.5.11, < 2.0.0)
-    font-awesome-rails (4.7.0.1)
-      railties (>= 3.2, < 5.1)
-    foreman (0.84.0)
-      thor (~> 0.19.1)
-    formatador (0.2.5)
-    fuubar (2.2.0)
-      rspec-core (~> 3.0)
-      ruby-progressbar (~> 1.4)
-    gemojione (3.3.0)
-      json
-    get_process_mem (0.2.0)
-    gettext (3.2.9)
-      locale (>= 2.0.5)
-      text (>= 1.3.0)
-    gettext_i18n_rails (1.8.0)
-      fast_gettext (>= 0.9.0)
-    gettext_i18n_rails_js (1.3.0)
-      gettext (>= 3.0.2)
-      gettext_i18n_rails (>= 0.7.1)
-      po_to_json (>= 1.0.0)
-      rails (>= 3.2.0)
-    gitaly-proto (1.3.0)
-      grpc (~> 1.0)
-    github-markup (1.7.0)
-    gitlab-license (1.0.0)
-    gitlab-markup (1.6.5)
-    gitlab-sidekiq-fetcher (0.3.0)
-      sidekiq (~> 5)
-    gitlab-styles (2.4.1)
-      rubocop (~> 0.54.0)
-      rubocop-gitlab-security (~> 0.1.0)
-      rubocop-rspec (~> 1.19)
-    gitlab_omniauth-ldap (2.0.4)
-      net-ldap (~> 0.16)
-      omniauth (~> 1.3)
-      pyu-ruby-sasl (>= 0.0.3.3, < 0.1)
-      rubyntlm (~> 0.5)
-    globalid (0.4.1)
-      activesupport (>= 4.2.0)
-    gon (6.2.0)
-      actionpack (>= 3.0)
-      multi_json
-      request_store (>= 1.0)
-    google-api-client (0.23.4)
-      addressable (~> 2.5, >= 2.5.1)
-      googleauth (>= 0.5, < 0.7.0)
-      httpclient (>= 2.8.1, < 3.0)
-      mime-types (~> 3.0)
-      representable (~> 3.0)
-      retriable (>= 2.0, < 4.0)
-    google-protobuf (3.6.1)
-    googleapis-common-protos-types (1.0.2)
-      google-protobuf (~> 3.0)
-    googleauth (0.6.6)
-      faraday (~> 0.12)
-      jwt (>= 1.4, < 3.0)
-      memoist (~> 0.12)
-      multi_json (~> 1.11)
-      os (>= 0.9, < 2.0)
-      signet (~> 0.7)
-    gpgme (2.0.18)
-      mini_portile2 (~> 2.3)
-    grape (1.1.0)
-      activesupport
-      builder
-      mustermann-grape (~> 1.0.0)
-      rack (>= 1.3.0)
-      rack-accept
-      virtus (>= 1.0.0)
-    grape-entity (0.7.1)
-      activesupport (>= 4.0)
-      multi_json (>= 1.3.2)
-    grape-path-helpers (1.0.6)
-      activesupport (>= 4, < 5.1)
-      grape (~> 1.0)
-      rake (~> 12)
-    grape_logging (1.7.0)
-      grape
-    graphiql-rails (1.4.10)
-      railties
-      sprockets-rails
-    graphql (1.8.1)
-    grpc (1.15.0)
-      google-protobuf (~> 3.1)
-      googleapis-common-protos-types (~> 1.0.0)
-    gssapi (1.2.0)
-      ffi (>= 1.0.1)
-    haml (5.0.4)
-      temple (>= 0.8.0)
-      tilt
-    haml_lint (0.28.0)
-      haml (>= 4.0, < 5.1)
-      rainbow
-      rake (>= 10, < 13)
-      rubocop (>= 0.50.0)
-      sysexits (~> 1.1)
-    hamlit (2.8.8)
-      temple (>= 0.8.0)
-      thor
-      tilt
-    hangouts-chat (0.0.5)
-    hashdiff (0.3.4)
-    hashie (3.5.7)
-    hashie-forbidden_attributes (0.1.1)
-      hashie (>= 3.0)
-    health_check (2.6.0)
-      rails (>= 4.0)
-    hipchat (1.5.2)
-      httparty
-      mimemagic
-    html-pipeline (2.8.4)
-      activesupport (>= 2)
-      nokogiri (>= 1.4)
-    html2text (0.2.0)
-      nokogiri (~> 1.6)
-    htmlentities (4.3.4)
-    http (3.3.0)
-      addressable (~> 2.3)
-      http-cookie (~> 1.0)
-      http-form_data (~> 2.0)
-      http_parser.rb (~> 0.6.0)
-    http-cookie (1.0.3)
-      domain_name (~> 0.5)
-    http-form_data (2.1.1)
-    http_parser.rb (0.6.0)
-    httparty (0.13.7)
-      json (~> 1.8)
-      multi_xml (>= 0.5.2)
-    httpclient (2.8.3)
-    i18n (0.9.5)
-      concurrent-ruby (~> 1.0)
-    icalendar (2.4.1)
-    ice_nine (0.11.2)
-    influxdb (0.2.3)
-      cause
-      json
-    ipaddress (0.8.3)
-    jira-ruby (1.4.1)
-      activesupport
-      multipart-post
-      oauth (~> 0.5, >= 0.5.0)
-    jmespath (1.3.1)
-    jquery-atwho-rails (1.3.2)
-    js_regex (2.2.1)
-      regexp_parser (>= 0.4.11, <= 0.5.0)
-    json (1.8.6)
-    json-jwt (1.9.4)
-      activesupport
-      aes_key_wrap
-      bindata
-    json-schema (2.8.0)
-      addressable (>= 2.4)
-    jwt (1.5.6)
-    kaminari (1.0.1)
-      activesupport (>= 4.1.0)
-      kaminari-actionview (= 1.0.1)
-      kaminari-activerecord (= 1.0.1)
-      kaminari-core (= 1.0.1)
-    kaminari-actionview (1.0.1)
-      actionview
-      kaminari-core (= 1.0.1)
-    kaminari-activerecord (1.0.1)
-      activerecord
-      kaminari-core (= 1.0.1)
-    kaminari-core (1.0.1)
-    kgio (2.10.0)
-    knapsack (1.17.0)
-      rake
-    kubeclient (4.0.0)
-      http (~> 3.0)
-      recursive-open-struct (~> 1.0, >= 1.0.4)
-      rest-client (~> 2.0)
-    launchy (2.4.3)
-      addressable (~> 2.3)
-    letter_opener (1.4.1)
-      launchy (~> 2.2)
-    letter_opener_web (1.3.0)
-      actionmailer (>= 3.2)
-      letter_opener (~> 1.0)
-      railties (>= 3.2)
-    license_finder (5.4.0)
-      bundler
-      rubyzip
-      thor
-      toml (= 0.2.0)
-      with_env (= 1.1.0)
-      xml-simple
-    licensee (8.9.2)
-      rugged (~> 0.24)
-    locale (2.1.2)
-    lograge (0.10.0)
-      actionpack (>= 4)
-      activesupport (>= 4)
-      railties (>= 4)
-      request_store (~> 1.0)
-    loofah (2.2.3)
-      crass (~> 1.0.2)
-      nokogiri (>= 1.5.9)
-    mail (2.7.0)
-      mini_mime (>= 0.1.1)
-    mail_room (0.9.1)
-    memoist (0.16.0)
-    memoizable (0.4.2)
-      thread_safe (~> 0.3, >= 0.3.1)
-    method_source (0.9.0)
-    mime-types (3.2.2)
-      mime-types-data (~> 3.2015)
-    mime-types-data (3.2018.0812)
-    mimemagic (0.3.2)
-    mini_magick (4.8.0)
-    mini_mime (1.0.1)
-    mini_portile2 (2.3.0)
-    minitest (5.7.0)
-    msgpack (1.2.4)
-    multi_json (1.13.1)
-    multi_xml (0.6.0)
-    multipart-post (2.0.0)
-    mustermann (1.0.3)
-    mustermann-grape (1.0.0)
-      mustermann (~> 1.0.0)
-    mysql2 (0.4.10)
-    nakayoshi_fork (0.0.4)
-    net-ldap (0.16.0)
-    net-ntp (2.1.3)
-    net-ssh (5.0.1)
-    netrc (0.11.0)
-    nokogiri (1.8.5)
-      mini_portile2 (~> 2.3.0)
-    nokogumbo (1.5.0)
-      nokogiri
-    numerizer (0.1.1)
-    oauth (0.5.4)
-    oauth2 (1.4.0)
-      faraday (>= 0.8, < 0.13)
-      jwt (~> 1.0)
-      multi_json (~> 1.3)
-      multi_xml (~> 0.5)
-      rack (>= 1.2, < 3)
-    octokit (4.9.0)
-      sawyer (~> 0.8.0, >= 0.5.3)
-    omniauth (1.8.1)
-      hashie (>= 3.4.6, < 3.6.0)
-      rack (>= 1.6.2, < 3)
-    omniauth-auth0 (2.0.0)
-      omniauth-oauth2 (~> 1.4)
-    omniauth-authentiq (0.3.3)
-      jwt (>= 1.5)
-      omniauth-oauth2 (>= 1.5)
-    omniauth-azure-oauth2 (0.0.9)
-      jwt (~> 1.0)
-      omniauth (~> 1.0)
-      omniauth-oauth2 (~> 1.4)
-    omniauth-cas3 (1.1.4)
-      addressable (~> 2.3)
-      nokogiri (~> 1.7, >= 1.7.1)
-      omniauth (~> 1.2)
-    omniauth-facebook (4.0.0)
-      omniauth-oauth2 (~> 1.2)
-    omniauth-github (1.3.0)
-      omniauth (~> 1.5)
-      omniauth-oauth2 (>= 1.4.0, < 2.0)
-    omniauth-gitlab (1.0.3)
-      omniauth (~> 1.0)
-      omniauth-oauth2 (~> 1.0)
-    omniauth-google-oauth2 (0.5.3)
-      jwt (>= 1.5)
-      omniauth (>= 1.1.1)
-      omniauth-oauth2 (>= 1.5)
-    omniauth-kerberos (0.3.0)
-      omniauth-multipassword
-      timfel-krb5-auth (~> 0.8)
-    omniauth-multipassword (0.4.2)
-      omniauth (~> 1.0)
-    omniauth-oauth (1.1.0)
-      oauth
-      omniauth (~> 1.0)
-    omniauth-oauth2 (1.5.0)
-      oauth2 (~> 1.1)
-      omniauth (~> 1.2)
-    omniauth-oauth2-generic (0.2.2)
-      omniauth-oauth2 (~> 1.0)
-    omniauth-saml (1.10.0)
-      omniauth (~> 1.3, >= 1.3.2)
-      ruby-saml (~> 1.7)
-    omniauth-shibboleth (1.3.0)
-      omniauth (>= 1.0.0)
-    omniauth-twitter (1.4.0)
-      omniauth-oauth (~> 1.1)
-      rack
-    omniauth_crowd (2.2.3)
-      activesupport
-      nokogiri (>= 1.4.4)
-      omniauth (~> 1.0)
-    org-ruby (0.9.12)
-      rubypants (~> 0.2)
-    orm_adapter (0.5.0)
-    os (1.0.0)
-    parallel (1.12.1)
-    parser (2.5.3.0)
-      ast (~> 2.4.0)
-    parslet (1.8.2)
-    peek (1.0.1)
-      concurrent-ruby (>= 0.9.0)
-      concurrent-ruby-ext (>= 0.9.0)
-      railties (>= 4.0.0)
-    peek-gc (0.0.2)
-      peek
-    peek-mysql2 (1.1.0)
-      atomic (>= 1.0.0)
-      mysql2
-      peek
-    peek-pg (1.3.0)
-      concurrent-ruby
-      concurrent-ruby-ext
-      peek
-      pg
-    peek-rblineprof (0.2.0)
-      peek
-      rblineprof
-    peek-redis (1.2.0)
-      atomic (>= 1.0.0)
-      peek
-      redis
-    pg (0.18.4)
-    po_to_json (1.0.1)
-      json (>= 1.6.0)
-    powerpack (0.1.1)
-    premailer (1.10.4)
-      addressable
-      css_parser (>= 1.4.10)
-      htmlentities (>= 4.0.0)
-    premailer-rails (1.9.7)
-      actionmailer (>= 3, < 6)
-      premailer (~> 1.7, >= 1.7.9)
-    proc_to_ast (0.1.0)
-      coderay
-      parser
-      unparser
-    procto (0.0.3)
-    prometheus-client-mmap (0.9.4)
-    pry (0.11.3)
-      coderay (~> 1.1.0)
-      method_source (~> 0.9.0)
-    pry-byebug (3.4.3)
-      byebug (>= 9.0, < 9.1)
-      pry (~> 0.10)
-    pry-rails (0.3.6)
-      pry (>= 0.10.4)
-    public_suffix (3.0.3)
-    puma (3.12.0)
-    puma_worker_killer (0.1.0)
-      get_process_mem (~> 0.2)
-      puma (>= 2.7, < 4)
-    pyu-ruby-sasl (0.0.3.3)
-    rack (1.6.11)
-    rack-accept (0.4.5)
-      rack (>= 0.4)
-    rack-attack (4.4.1)
-      rack
-    rack-cors (1.0.2)
-    rack-oauth2 (1.2.3)
-      activesupport (>= 2.3)
-      attr_required (>= 0.0.5)
-      httpclient (>= 2.4)
-      multi_json (>= 1.3.6)
-      rack (>= 1.1)
-    rack-protection (2.0.4)
-      rack
-    rack-proxy (0.6.0)
-      rack
-    rack-test (0.6.3)
-      rack (>= 1.0)
-    rails (4.2.11)
-      actionmailer (= 4.2.11)
-      actionpack (= 4.2.11)
-      actionview (= 4.2.11)
-      activejob (= 4.2.11)
-      activemodel (= 4.2.11)
-      activerecord (= 4.2.11)
-      activesupport (= 4.2.11)
-      bundler (>= 1.3.0, < 2.0)
-      railties (= 4.2.11)
-      sprockets-rails
-    rails-deprecated_sanitizer (1.0.3)
-      activesupport (>= 4.2.0.alpha)
-    rails-dom-testing (1.0.9)
-      activesupport (>= 4.2.0, < 5.0)
-      nokogiri (~> 1.6)
-      rails-deprecated_sanitizer (>= 1.0.1)
-    rails-html-sanitizer (1.0.4)
-      loofah (~> 2.2, >= 2.2.2)
-    rails-i18n (4.0.9)
-      i18n (~> 0.7)
-      railties (~> 4.0)
-    railties (4.2.10)
-      actionpack (= 4.2.10)
-      activesupport (= 4.2.10)
-      rake (>= 0.8.7)
-      thor (>= 0.18.1, < 2.0)
-    rainbow (3.0.0)
-    raindrops (0.18.0)
-    rake (12.3.1)
-    rb-fsevent (0.10.2)
-    rb-inotify (0.9.10)
-      ffi (>= 0.5.0, < 2)
-    rblineprof (0.3.6)
-      debugger-ruby_core_source (~> 1.3)
-    rbtrace (0.4.10)
-      ffi (>= 1.0.6)
-      msgpack (>= 0.4.3)
-      trollop (>= 1.16.2)
-    rdoc (6.0.4)
-    re2 (1.1.1)
-    recaptcha (3.0.0)
-      json
-    recursive-open-struct (1.1.0)
-    redcarpet (3.4.0)
-    redis (3.3.5)
-    redis-actionpack (5.0.2)
-      actionpack (>= 4.0, < 6)
-      redis-rack (>= 1, < 3)
-      redis-store (>= 1.1.0, < 2)
-    redis-activesupport (5.0.4)
-      activesupport (>= 3, < 6)
-      redis-store (>= 1.3, < 2)
-    redis-namespace (1.6.0)
-      redis (>= 3.0.4)
-    redis-rack (2.0.4)
-      rack (>= 1.5, < 3)
-      redis-store (>= 1.2, < 2)
-    redis-rails (5.0.2)
-      redis-actionpack (>= 5.0, < 6)
-      redis-activesupport (>= 5.0, < 6)
-      redis-store (>= 1.2, < 2)
-    redis-store (1.6.0)
-      redis (>= 2.2, < 5)
-    regexp_parser (0.5.0)
-    representable (3.0.4)
-      declarative (< 0.1.0)
-      declarative-option (< 0.2.0)
-      uber (< 0.2.0)
-    request_store (1.3.1)
-    responders (2.4.0)
-      actionpack (>= 4.2.0, < 5.3)
-      railties (>= 4.2.0, < 5.3)
-    rest-client (2.0.2)
-      http-cookie (>= 1.0.2, < 2.0)
-      mime-types (>= 1.16, < 4.0)
-      netrc (~> 0.8)
-    retriable (3.1.2)
-    rinku (2.0.0)
-    rotp (2.1.2)
-    rouge (3.3.0)
-    rqrcode (0.7.0)
-      chunky_png
-    rqrcode-rails3 (0.1.7)
-      rqrcode (>= 0.4.2)
-    rspec (3.7.0)
-      rspec-core (~> 3.7.0)
-      rspec-expectations (~> 3.7.0)
-      rspec-mocks (~> 3.7.0)
-    rspec-core (3.7.1)
-      rspec-support (~> 3.7.0)
-    rspec-expectations (3.7.0)
-      diff-lcs (>= 1.2.0, < 2.0)
-      rspec-support (~> 3.7.0)
-    rspec-mocks (3.7.0)
-      diff-lcs (>= 1.2.0, < 2.0)
-      rspec-support (~> 3.7.0)
-    rspec-parameterized (0.4.1)
-      binding_ninja (>= 0.2.1)
-      parser
-      proc_to_ast
-      rspec (>= 2.13, < 4)
-      unparser
-    rspec-rails (3.7.2)
-      actionpack (>= 3.0)
-      activesupport (>= 3.0)
-      railties (>= 3.0)
-      rspec-core (~> 3.7.0)
-      rspec-expectations (~> 3.7.0)
-      rspec-mocks (~> 3.7.0)
-      rspec-support (~> 3.7.0)
-    rspec-retry (0.4.5)
-      rspec-core
-    rspec-set (0.1.3)
-    rspec-support (3.7.1)
-    rspec_junit_formatter (0.2.3)
-      builder (< 4)
-      rspec-core (>= 2, < 4, != 2.12.0)
-    rspec_profiling (0.0.5)
-      activerecord
-      pg
-      rails
-      sqlite3
-    rubocop (0.54.0)
-      parallel (~> 1.10)
-      parser (>= 2.5)
-      powerpack (~> 0.1)
-      rainbow (>= 2.2.2, < 4.0)
-      ruby-progressbar (~> 1.7)
-      unicode-display_width (~> 1.0, >= 1.0.1)
-    rubocop-gitlab-security (0.1.1)
-      rubocop (>= 0.51)
-    rubocop-rspec (1.22.2)
-      rubocop (>= 0.52.1)
-    ruby-enum (0.7.2)
-      i18n
-    ruby-fogbugz (0.2.1)
-      crack (~> 0.4)
-    ruby-prof (0.17.0)
-    ruby-progressbar (1.9.0)
-    ruby-saml (1.7.2)
-      nokogiri (>= 1.5.10)
-    ruby_parser (3.11.0)
-      sexp_processor (~> 4.9)
-    rubyntlm (0.6.2)
-    rubypants (0.2.0)
-    rubyzip (1.2.2)
-    rufus-scheduler (3.4.0)
-      et-orbi (~> 1.0)
-    rugged (0.27.5)
-    safe_yaml (1.0.4)
-    sanitize (4.6.6)
-      crass (~> 1.0.2)
-      nokogiri (>= 1.4.4)
-      nokogumbo (~> 1.4)
-    sass (3.5.5)
-      sass-listen (~> 4.0.0)
-    sass-listen (4.0.0)
-      rb-fsevent (~> 0.9, >= 0.9.4)
-      rb-inotify (~> 0.9, >= 0.9.7)
-    sass-rails (5.0.6)
-      railties (>= 4.0.0, < 6)
-      sass (~> 3.1)
-      sprockets (>= 2.8, < 4.0)
-      sprockets-rails (>= 2.0, < 4.0)
-      tilt (>= 1.1, < 3)
-    sawyer (0.8.1)
-      addressable (>= 2.3.5, < 2.6)
-      faraday (~> 0.8, < 1.0)
-    scss_lint (0.56.0)
-      rake (>= 0.9, < 13)
-      sass (~> 3.5.3)
-    seed-fu (2.3.7)
-      activerecord (>= 3.1)
-      activesupport (>= 3.1)
-    select2-rails (3.5.9.3)
-      thor (~> 0.14)
-    selenium-webdriver (3.12.0)
-      childprocess (~> 0.5)
-      rubyzip (~> 1.2)
-    sentry-raven (2.7.2)
-      faraday (>= 0.7.6, < 1.0)
-    settingslogic (2.0.9)
-    sexp_processor (4.11.0)
-    sham_rack (1.3.6)
-      rack
-    shoulda-matchers (3.1.2)
-      activesupport (>= 4.0.0)
-    sidekiq (5.2.3)
-      connection_pool (~> 2.2, >= 2.2.2)
-      rack-protection (>= 1.5.0)
-      redis (>= 3.3.5, < 5)
-    sidekiq-cron (0.6.0)
-      rufus-scheduler (>= 3.3.0)
-      sidekiq (>= 4.2.1)
-    signet (0.11.0)
-      addressable (~> 2.3)
-      faraday (~> 0.9)
-      jwt (>= 1.5, < 3.0)
-      multi_json (~> 1.10)
-    simple_po_parser (1.1.2)
-    simplecov (0.14.1)
-      docile (~> 1.1.0)
-      json (>= 1.8, < 3)
-      simplecov-html (~> 0.10.0)
-    simplecov-html (0.10.0)
-    slack-notifier (1.5.1)
-    spring (2.0.2)
-      activesupport (>= 4.2)
-    spring-commands-rspec (1.0.4)
-      spring (>= 0.9.1)
-    sprockets (3.7.2)
-      concurrent-ruby (~> 1.0)
-      rack (> 1, < 3)
-    sprockets-rails (3.2.1)
-      actionpack (>= 4.0)
-      activesupport (>= 4.0)
-      sprockets (>= 3.0.0)
-    sqlite3 (1.3.13)
-    sshkey (1.9.0)
-    stackprof (0.2.10)
-    state_machines (0.5.0)
-    state_machines-activemodel (0.5.1)
-      activemodel (>= 4.1, < 6.0)
-      state_machines (>= 0.5.0)
-    state_machines-activerecord (0.5.1)
-      activerecord (>= 4.1, < 6.0)
-      state_machines-activemodel (>= 0.5.0)
-    sys-filesystem (1.1.6)
-      ffi
-    sysexits (1.2.0)
-    temple (0.8.0)
-    test-prof (0.2.5)
-    test_after_commit (1.1.0)
-      activerecord (>= 3.2)
-    text (1.3.1)
-    thin (1.7.2)
-      daemons (~> 1.0, >= 1.0.9)
-      eventmachine (~> 1.0, >= 1.0.4)
-      rack (>= 1, < 3)
-    thor (0.19.4)
-    thread_safe (0.3.6)
-    tilt (2.0.8)
-    timecop (0.8.1)
-    timfel-krb5-auth (0.8.3)
-    toml (0.2.0)
-      parslet (~> 1.8.0)
-    toml-rb (1.0.0)
-      citrus (~> 3.0, > 3.0)
-    trollop (2.1.3)
-    truncato (0.7.10)
-      htmlentities (~> 4.3.1)
-      nokogiri (~> 1.8.0, >= 1.7.0)
-    tzinfo (1.2.5)
-      thread_safe (~> 0.1)
-    u2f (0.2.1)
-    uber (0.1.0)
-    uglifier (2.7.2)
-      execjs (>= 0.3.0)
-      json (>= 1.8.0)
-    unf (0.1.4)
-      unf_ext
-    unf_ext (0.0.7.5)
-    unicode-display_width (1.3.2)
-    unicorn (5.1.0)
-      kgio (~> 2.6)
-      raindrops (~> 0.7)
-    unicorn-worker-killer (0.4.4)
-      get_process_mem (~> 0)
-      unicorn (>= 4, < 6)
-    uniform_notifier (1.10.0)
-    unparser (0.4.2)
-      abstract_type (~> 0.0.7)
-      adamantium (~> 0.2.0)
-      concord (~> 0.1.5)
-      diff-lcs (~> 1.3)
-      equalizer (~> 0.0.9)
-      parser (>= 2.3.1.2, < 2.6)
-      procto (~> 0.0.2)
-    validates_hostname (1.0.6)
-      activerecord (>= 3.0)
-      activesupport (>= 3.0)
-    version_sorter (2.1.0)
-    virtus (1.0.5)
-      axiom-types (~> 0.1)
-      coercible (~> 1.0)
-      descendants_tracker (~> 0.0, >= 0.0.3)
-      equalizer (~> 0.0, >= 0.0.9)
-    vmstat (2.3.0)
-    warden (1.2.7)
-      rack (>= 1.0)
-    webmock (2.3.2)
-      addressable (>= 2.3.6)
-      crack (>= 0.3.2)
-      hashdiff
-    webpack-rails (0.9.11)
-      railties (>= 3.2.0)
-    wikicloth (0.8.1)
-      builder
-      expression_parser
-      rinku
-    with_env (1.1.0)
-    xml-simple (1.1.5)
-    xpath (2.1.0)
-      nokogiri (~> 1.3)
-
-PLATFORMS
-  ruby
-
-DEPENDENCIES
-  RedCloth (~> 4.3.2)
-  ace-rails-ap (~> 4.1.0)
-  activerecord_sane_schema_dumper (= 0.2)
-  acts-as-taggable-on (~> 5.0)
-  addressable (~> 2.5.2)
-  akismet (~> 2.0)
-  asana (~> 0.8.1)
-  asciidoctor (~> 1.5.8)
-  asciidoctor-plantuml (= 0.0.8)
-  attr_encrypted (~> 3.1.0)
-  awesome_print
-  aws-sdk
-  babosa (~> 1.0.2)
-  base32 (~> 0.3.0)
-  batch-loader (~> 1.2.2)
-  bcrypt_pbkdf (~> 1.0)
-  benchmark-ips (~> 2.3.0)
-  better_errors (~> 2.5.0)
-  binding_of_caller (~> 0.8.0)
-  bootsnap (~> 1.3)
-  bootstrap_form (~> 2.7.0)
-  brakeman (~> 4.2)
-  browser (~> 2.5)
-  bullet (~> 5.5.0)
-  bundler-audit (~> 0.5.0)
-  capybara (~> 2.15)
-  capybara-screenshot (~> 1.0.0)
-  carrierwave (= 1.2.3)
-  charlock_holmes (~> 0.7.5)
-  chronic (~> 0.10.2)
-  chronic_duration (~> 0.10.6)
-  commonmarker (~> 0.17)
-  concurrent-ruby (~> 1.1)
-  connection_pool (~> 2.0)
-  creole (~> 0.5.0)
-  database_cleaner (~> 1.5.0)
-  deckar01-task_list (= 2.0.0)
-  default_value_for (~> 3.0.0)
-  device_detector
-  devise (~> 4.4)
-  devise-two-factor (~> 3.0.0)
-  diffy (~> 3.1.0)
-  discordrb-webhooks-blackst0ne (~> 3.3)
-  doorkeeper (~> 4.3)
-  doorkeeper-openid_connect (~> 1.5)
-  ed25519 (~> 1.2)
-  elasticsearch-api (= 5.0.3)
-  elasticsearch-model (~> 0.1.9)
-  elasticsearch-rails (~> 0.1.9)
-  email_reply_trimmer (~> 0.1)
-  email_spec (~> 2.2.0)
-  escape_utils (~> 1.1)
-  factory_bot_rails (~> 4.8.2)
-  faraday (~> 0.12)
-  faraday_middleware-aws-signers-v4
-  fast_blank
-  ffaker (~> 2.10)
-  flipper (~> 0.13.0)
-  flipper-active_record (~> 0.13.0)
-  flipper-active_support_cache_store (~> 0.13.0)
-  flowdock (~> 0.7)
-  fog-aliyun (~> 0.2.0)
-  fog-aws (~> 2.0.1)
-  fog-core (~> 1.44)
-  fog-google (~> 1.7.1)
-  fog-local (~> 0.3)
-  fog-openstack (~> 0.1)
-  fog-rackspace (~> 0.1.1)
-  font-awesome-rails (~> 4.7)
-  foreman (~> 0.84.0)
-  fuubar (~> 2.2.0)
-  gemojione (~> 3.3)
-  gettext (~> 3.2.2)
-  gettext_i18n_rails (~> 1.8.0)
-  gettext_i18n_rails_js (~> 1.3)
-  gitaly-proto (~> 1.3.0)
-  github-markup (~> 1.7.0)
-  gitlab-license (~> 1.0)
-  gitlab-markup (~> 1.6.5)
-  gitlab-sidekiq-fetcher
-  gitlab-styles (~> 2.4)
-  gitlab_omniauth-ldap (~> 2.0.4)
-  gon (~> 6.2)
-  google-api-client (~> 0.23)
-  google-protobuf (~> 3.6)
-  gpgme (~> 2.0.18)
-  grape (~> 1.1.0)
-  grape-entity (~> 0.7.1)
-  grape-path-helpers (~> 1.0)
-  grape_logging (~> 1.7)
-  graphiql-rails (~> 1.4.10)
-  graphql (~> 1.8.0)
-  grpc (~> 1.15.0)
-  gssapi
-  haml_lint (~> 0.28.0)
-  hamlit (~> 2.8.8)
-  hangouts-chat (~> 0.0.5)
-  hashie-forbidden_attributes
-  health_check (~> 2.6.0)
-  hipchat (~> 1.5.0)
-  html-pipeline (~> 2.8)
-  html2text
-  httparty (~> 0.13.3)
-  icalendar
-  influxdb (~> 0.2)
-  jira-ruby (~> 1.4)
-  jquery-atwho-rails (~> 1.3.2)
-  js_regex (~> 2.2.1)
-  json-schema (~> 2.8.0)
-  jwt (~> 1.5.6)
-  kaminari (~> 1.0)
-  knapsack (~> 1.17)
-  kubeclient (~> 4.0.0)
-  letter_opener_web (~> 1.3.0)
-  license_finder (~> 5.4)
-  licensee (~> 8.9)
-  lograge (~> 0.5)
-  loofah (~> 2.2)
-  mail_room (~> 0.9.1)
-  method_source (~> 0.8)
-  mimemagic (~> 0.3.2)
-  mini_magick
-  minitest (~> 5.7.0)
-  mysql2 (~> 0.4.10)
-  nakayoshi_fork (~> 0.0.4)
-  net-ldap
-  net-ntp
-  net-ssh (~> 5.0)
-  nokogiri (~> 1.8.2)
-  oauth2 (~> 1.4)
-  octokit (~> 4.9)
-  omniauth (~> 1.8)
-  omniauth-auth0 (~> 2.0.0)
-  omniauth-authentiq (~> 0.3.3)
-  omniauth-azure-oauth2 (~> 0.0.9)
-  omniauth-cas3 (~> 1.1.4)
-  omniauth-facebook (~> 4.0.0)
-  omniauth-github (~> 1.3)
-  omniauth-gitlab (~> 1.0.2)
-  omniauth-google-oauth2 (~> 0.5.3)
-  omniauth-kerberos (~> 0.3.0)
-  omniauth-oauth2-generic (~> 0.2.2)
-  omniauth-saml (~> 1.10)
-  omniauth-shibboleth (~> 1.3.0)
-  omniauth-twitter (~> 1.4)
-  omniauth_crowd (~> 2.2.0)
-  org-ruby (~> 0.9.12)
-  peek (~> 1.0.1)
-  peek-gc (~> 0.0.2)
-  peek-mysql2 (~> 1.1.0)
-  peek-pg (~> 1.3.0)
-  peek-rblineprof (~> 0.2.0)
-  peek-redis (~> 1.2.0)
-  pg (~> 0.18.2)
-  premailer-rails (~> 1.9.7)
-  prometheus-client-mmap (~> 0.9.4)
-  pry-byebug (~> 3.4.1)
-  pry-rails (~> 0.3.4)
-  puma (~> 3.12)
-  puma_worker_killer
-  rack (= 1.6.11)
-  rack-attack (~> 4.4.1)
-  rack-cors (~> 1.0.0)
-  rack-oauth2 (~> 1.2.1)
-  rack-proxy (~> 0.6.0)
-  rails (= 4.2.11)
-  rails-deprecated_sanitizer (~> 1.0.3)
-  rails-i18n (~> 4.0.9)
-  rainbow (~> 3.0)
-  raindrops (~> 0.18)
-  rblineprof (~> 0.3.6)
-  rbtrace (~> 0.4)
-  rdoc (~> 6.0)
-  re2 (~> 1.1.1)
-  recaptcha (~> 3.0)
-  redcarpet (~> 3.4)
-  redis (~> 3.2)
-  redis-namespace (~> 1.6.0)
-  redis-rails (~> 5.0.2)
-  request_store (~> 1.3)
-  responders (~> 2.0)
-  rouge (~> 3.1)
-  rqrcode-rails3 (~> 0.1.7)
-  rspec-parameterized
-  rspec-rails (~> 3.7.0)
-  rspec-retry (~> 0.4.5)
-  rspec-set (~> 0.1.3)
-  rspec_junit_formatter
-  rspec_profiling (~> 0.0.5)
-  rubocop (~> 0.54.0)
-  rubocop-rspec (~> 1.22.1)
-  ruby-fogbugz (~> 0.2.1)
-  ruby-prof (~> 0.17.0)
-  ruby-progressbar
-  ruby_parser (~> 3.8)
-  rufus-scheduler (~> 3.4)
-  rugged (~> 0.27)
-  sanitize (~> 4.6)
-  sass (~> 3.5)
-  sass-rails (~> 5.0.6)
-  scss_lint (~> 0.56.0)
-  seed-fu (~> 2.3.7)
-  select2-rails (~> 3.5.9)
-  selenium-webdriver (~> 3.12)
-  sentry-raven (~> 2.7)
-  settingslogic (~> 2.0.9)
-  sham_rack (~> 1.3.6)
-  shoulda-matchers (~> 3.1.2)
-  sidekiq (~> 5.2.1)
-  sidekiq-cron (~> 0.6.0)
-  simple_po_parser (~> 1.1.2)
-  simplecov (~> 0.14.0)
-  slack-notifier (~> 1.5.1)
-  spring (~> 2.0.0)
-  spring-commands-rspec (~> 1.0.4)
-  sprockets (~> 3.7.0)
-  sshkey (~> 1.9.0)
-  stackprof (~> 0.2.10)
-  state_machines-activerecord (~> 0.5.1)
-  sys-filesystem (~> 1.1.6)
-  test-prof (~> 0.2.5)
-  test_after_commit (~> 1.1)
-  thin (~> 1.7.0)
-  timecop (~> 0.8.0)
-  toml-rb (~> 1.0.0)
-  truncato (~> 0.7.9)
-  u2f (~> 0.2.1)
-  uglifier (~> 2.7.2)
-  unf (~> 0.1.4)
-  unicorn (~> 5.1.0)
-  unicorn-worker-killer (~> 0.4.4)
-  validates_hostname (~> 1.0.6)
-  version_sorter (~> 2.1.0)
-  virtus (~> 1.0.1)
-  vmstat (~> 2.3.0)
-  webmock (~> 2.3.2)
-  webpack-rails (~> 0.9.10)
-  wikicloth (= 0.8.1)
-
-BUNDLED WITH
-   1.17.1
diff --git a/bin/rails b/bin/rails
index d21b64b3007d3e0f10fd13934028e572a91d8ed1..073966023774750c90fe9c89910c769a92da604b 100755
--- a/bin/rails
+++ b/bin/rails
@@ -1,14 +1,4 @@
 #!/usr/bin/env ruby
-
-# Remove this block when upgraded to rails 5.0.
-if %w[0 false].include?(ENV["RAILS5"])
-  begin
-    load File.expand_path('../spring', __FILE__)
-  rescue LoadError => e
-    raise unless e.message.include?('spring')
-  end
-end
-
 APP_PATH = File.expand_path('../config/application', __dir__)
 require_relative '../config/boot'
 require 'rails/commands'
diff --git a/bin/rake b/bin/rake
index 1362d51e3d6b6044b7aafdd342d75ac0af68648c..17240489f64832c9ce080088e27780d3dc3ee29a 100755
--- a/bin/rake
+++ b/bin/rake
@@ -1,14 +1,4 @@
 #!/usr/bin/env ruby
-
-# Remove this block when upgraded to rails 5.0.
-if %w[0 false].include?(ENV["RAILS5"])
-  begin
-    load File.expand_path('../spring', __FILE__)
-  rescue LoadError => e
-    raise unless e.message.include?('spring')
-  end
-end
-
 require_relative '../config/boot'
 require 'rake'
 Rake.application.run
diff --git a/bin/rspec b/bin/rspec
index b0770e30a706dcc657364e52beea63a2db12bb29..4236753c9c143873d97803284aaa3b5c2711aa1b 100755
--- a/bin/rspec
+++ b/bin/rspec
@@ -1,10 +1,5 @@
 #!/usr/bin/env ruby
 
-# Remove these two lines below when upgraded to rails 5.0.
-# Allow run `rspec` command as `RAILS5=1 rspec ...` instead of `BUNDLE_GEMFILE=Gemfile.rails5 rspec ...`
-gemfile = %w[0 false].include?(ENV["RAILS5"]) ? "Gemfile.rails4" : "Gemfile"
-ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../#{gemfile}", __dir__)
-
 begin
   load File.expand_path('../spring', __FILE__)
 rescue LoadError => e
diff --git a/bin/setup b/bin/setup
index 34bb667087abe68e4807563cbe2c48af11277f80..883825bc0a25a9b50755c3e6c3e5766ded140adc 100755
--- a/bin/setup
+++ b/bin/setup
@@ -1,18 +1,12 @@
 #!/usr/bin/env ruby
 
-def rails5?
-  !%w[0 false].include?(ENV["RAILS5"])
-end
-
 require "pathname"
 
 # path to your application root.
 APP_ROOT = Pathname.new File.expand_path("../../", __FILE__)
 
-if rails5?
-  def system!(*args)
-    system(*args) || abort("\n== Command #{args} failed ==")
-  end
+def system!(*args)
+  system(*args) || abort("\n== Command #{args} failed ==")
 end
 
 Dir.chdir APP_ROOT do
@@ -20,14 +14,8 @@ Dir.chdir APP_ROOT do
   # Add necessary setup steps to this file:
 
   puts "== Installing dependencies =="
-
-  if rails5?
-    system! "gem install bundler --conservative"
-    system("bundle check") || system!("bundle install")
-  else
-    system "gem install bundler --conservative"
-    system "bundle check || bundle install"
-  end
+  system! "gem install bundler --conservative"
+  system("bundle check") || system!("bundle install")
 
   # puts "\n== Copying sample files =="
   # unless File.exist?("config/database.yml")
@@ -35,27 +23,11 @@ Dir.chdir APP_ROOT do
   # end
 
   puts "\n== Preparing database =="
-
-  if rails5?
-    system! "bin/rails db:setup"
-  else
-    system "bin/rake db:reset"
-  end
+  system! "bin/rails db:setup"
 
   puts "\n== Removing old logs and tempfiles =="
-
-  if rails5?
-    system! "bin/rails log:clear tmp:clear"
-  else
-    system "rm -f log/*"
-    system "rm -rf tmp/cache"
-  end
+  system! "bin/rails log:clear tmp:clear"
 
   puts "\n== Restarting application server =="
-
-  if rails5?
-    system! "bin/rails restart"
-  else
-    system "touch tmp/restart.txt"
-  end
+  system! "bin/rails restart"
 end
diff --git a/changelogs/unreleased/remove-rails4-support.yml b/changelogs/unreleased/remove-rails4-support.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a05c913a70c885254a84f6f97925bde7c0ca6aa0
--- /dev/null
+++ b/changelogs/unreleased/remove-rails4-support.yml
@@ -0,0 +1,5 @@
+---
+title: Remove rails 4 support in CI, Gemfiles, bin/ and config/
+merge_request: 23717
+author: Jasper Maes
+type: other
diff --git a/config/application.rb b/config/application.rb
index e2ea6232f87462aa73e79970c75510cbb751dba0..c7309dc6fbc1eb144896a44fc8205a899b017da8 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -10,7 +10,7 @@ module Gitlab
   # This method is used for smooth upgrading from the current Rails 4.x to Rails 5.0.
   # https://gitlab.com/gitlab-org/gitlab-ce/issues/14286
   def self.rails5?
-    !%w[0 false].include?(ENV["RAILS5"])
+    true
   end
 
   class Application < Rails::Application
@@ -28,9 +28,6 @@ class Application < Rails::Application
     # setting disabled
     require_dependency Rails.root.join('lib/mysql_zero_date')
 
-    # This can be removed when we drop support for rails 4
-    require_dependency Rails.root.join('lib/rails4_migration_version')
-
     # Settings in config/environments/* take precedence over those specified here.
     # Application configuration should go into files in config/initializers
     # -- all .rb files in that directory are automatically loaded.
@@ -100,7 +97,7 @@ class Application < Rails::Application
     # namespaces/users.
     # https://github.com/rails/rails/blob/5-0-stable/actioncable/lib/action_cable.rb#L38
     # Please change this value when configuring ActionCable for real usage.
-    config.action_cable.mount_path = "/-/cable" if rails5?
+    config.action_cable.mount_path = "/-/cable"
 
     # Configure sensitive parameters which will be filtered from the log file.
     #
@@ -242,8 +239,6 @@ class Application < Rails::Application
 
     config.cache_store = :redis_store, caching_config_hash
 
-    config.active_record.raise_in_transactional_callbacks = true unless rails5?
-
     config.active_job.queue_adapter = :sidekiq
 
     # This is needed for gitlab-shell
diff --git a/config/boot.rb b/config/boot.rb
index 725473ac7f6adf0df5ad1d1b38ee2dad51085272..2811f0e61889c9ebdbb317412280655e840a4644 100644
--- a/config/boot.rb
+++ b/config/boot.rb
@@ -1,11 +1,4 @@
-def rails5?
-  !%w[0 false].include?(ENV["RAILS5"])
-end
-
-require 'rubygems' unless rails5?
-
-gemfile = rails5? ? "Gemfile" : "Gemfile.rails4"
-ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../#{gemfile}", __dir__)
+ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
 
 # Set up gems listed in the Gemfile.
 require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
diff --git a/config/environment.rb b/config/environment.rb
index 3a52656a2c1c48d44af156ac9ceb82513b6a02ab..7e55c7803d31fcbc829df137966847e3a130d5a1 100644
--- a/config/environment.rb
+++ b/config/environment.rb
@@ -1,11 +1,6 @@
 # Load the rails application
 
-# Remove this condition when upgraded to rails 5.0.
-if %w[0 false].include?(ENV["RAILS5"])
-  require File.expand_path('application', __dir__)
-else
-  require_relative 'application'
-end
+require_relative 'application'
 
 # Initialize the rails application
 Rails.application.initialize!
diff --git a/config/environments/production.rb b/config/environments/production.rb
index 49a4e873093a066eaf103b7b3ba9adc2af0b3c95..09bcf49a9a5231db4b4fb5cf4fabb3a318881305 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -9,11 +9,7 @@
   config.action_controller.perform_caching = true
 
   # Disable Rails's static asset server (Apache or nginx will already do this)
-  if Gitlab.rails5?
-    config.public_file_server.enabled = false
-  else
-    config.serve_static_files = false
-  end
+  config.public_file_server.enabled = false
 
   # Compress JavaScripts and CSS.
   config.assets.js_compressor = :uglifier
diff --git a/config/environments/test.rb b/config/environments/test.rb
index 072f93150a38aab6f3fb8ee467c692fdc72fafeb..3461099253a3b2b5c473c87f7c156c54d634ee79 100644
--- a/config/environments/test.rb
+++ b/config/environments/test.rb
@@ -19,13 +19,8 @@
   # Configure static asset server for tests with Cache-Control for performance
   config.assets.compile = false if ENV['CI']
 
-  if Gitlab.rails5?
-    config.public_file_server.enabled = true
-    config.public_file_server.headers = { 'Cache-Control' => 'public, max-age=3600' }
-  else
-    config.serve_static_files = true
-    config.static_cache_control = "public, max-age=3600"
-  end
+  config.public_file_server.enabled = true
+  config.public_file_server.headers = { 'Cache-Control' => 'public, max-age=3600' }
 
   # Show full error reports and disable caching
   config.consider_all_requests_local       = true
diff --git a/config/initializers/active_record_array_type_casting.rb b/config/initializers/active_record_array_type_casting.rb
deleted file mode 100644
index a149e048ee2e77726d190443b843c204fe820f2e..0000000000000000000000000000000000000000
--- a/config/initializers/active_record_array_type_casting.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# Remove this initializer when upgraded to Rails 5.0
-unless Gitlab.rails5?
-  module ActiveRecord
-    class PredicateBuilder
-      class ArrayHandler
-        module TypeCasting
-          def call(attribute, value)
-            # This is necessary because by default ActiveRecord does not respect
-            # custom type definitions (like our `ShaAttribute`) when providing an
-            # array in `where`, like in `where(commit_sha: [sha1, sha2, sha3])`.
-            model = attribute.relation&.engine
-            type = model.user_provided_columns[attribute.name] if model
-            value = value.map { |value| type.type_cast_for_database(value) } if type
-
-            super(attribute, value)
-          end
-        end
-
-        prepend TypeCasting
-      end
-    end
-  end
-end
diff --git a/config/initializers/active_record_avoid_type_casting_in_uniqueness_validator.rb b/config/initializers/active_record_avoid_type_casting_in_uniqueness_validator.rb
index ef4abb77bd70c4eb779b43673e553daa7bb59e3f..3e765469995b9ad865a8116d85055c19c6442ef2 100644
--- a/config/initializers/active_record_avoid_type_casting_in_uniqueness_validator.rb
+++ b/config/initializers/active_record_avoid_type_casting_in_uniqueness_validator.rb
@@ -20,75 +20,73 @@
 #
 # This bug was fixed in Rails 5.1 by https://github.com/rails/rails/pull/24745/commits/aa062318c451512035c10898a1af95943b1a3803
 
-if Gitlab.rails5?
-  if Rails.version.start_with?("5.1")
-    raise "Remove this monkey patch: #{__FILE__}"
-  end
+if Rails.version.start_with?("5.1")
+  raise "Remove this monkey patch: #{__FILE__}"
+end
 
-  # Copy-paste from https://github.com/kamipo/rails/blob/aa062318c451512035c10898a1af95943b1a3803/activerecord/lib/active_record/validations/uniqueness.rb
-  # including local fixes to make Rubocop happy again.
-  module ActiveRecord
-    module Validations
-      class UniquenessValidator < ActiveModel::EachValidator # :nodoc:
-        def validate_each(record, attribute, value)
-          finder_class = find_finder_class_for(record)
-          table = finder_class.arel_table
-          value = map_enum_attribute(finder_class, attribute, value)
+# Copy-paste from https://github.com/kamipo/rails/blob/aa062318c451512035c10898a1af95943b1a3803/activerecord/lib/active_record/validations/uniqueness.rb
+# including local fixes to make Rubocop happy again.
+module ActiveRecord
+  module Validations
+    class UniquenessValidator < ActiveModel::EachValidator # :nodoc:
+      def validate_each(record, attribute, value)
+        finder_class = find_finder_class_for(record)
+        table = finder_class.arel_table
+        value = map_enum_attribute(finder_class, attribute, value)
 
-          relation = build_relation(finder_class, table, attribute, value)
+        relation = build_relation(finder_class, table, attribute, value)
 
-          if record.persisted?
-            if finder_class.primary_key
-              relation = relation.where.not(finder_class.primary_key => record.id_was || record.id)
-            else
-              raise UnknownPrimaryKey.new(finder_class, "Can not validate uniqueness for persisted record without primary key.")
-            end
+        if record.persisted?
+          if finder_class.primary_key
+            relation = relation.where.not(finder_class.primary_key => record.id_was || record.id)
+          else
+            raise UnknownPrimaryKey.new(finder_class, "Can not validate uniqueness for persisted record without primary key.")
           end
+        end
 
-          relation = scope_relation(record, table, relation)
-          relation = relation.merge(options[:conditions]) if options[:conditions]
+        relation = scope_relation(record, table, relation)
+        relation = relation.merge(options[:conditions]) if options[:conditions]
 
-          if relation.exists?
-            error_options = options.except(:case_sensitive, :scope, :conditions)
-            error_options[:value] = value
+        if relation.exists?
+          error_options = options.except(:case_sensitive, :scope, :conditions)
+          error_options[:value] = value
 
-            record.errors.add(attribute, :taken, error_options)
-          end
-        rescue RangeError
+          record.errors.add(attribute, :taken, error_options)
         end
+      rescue RangeError
+      end
 
-        protected
-
-        def build_relation(klass, table, attribute, value) #:nodoc:
-          if reflection = klass._reflect_on_association(attribute)
-            attribute = reflection.foreign_key
-            value = value.attributes[reflection.klass.primary_key] unless value.nil?
-          end
+      protected
 
-          # the attribute may be an aliased attribute
-          if klass.attribute_alias?(attribute)
-            attribute = klass.attribute_alias(attribute)
-          end
+      def build_relation(klass, table, attribute, value) #:nodoc:
+        if reflection = klass._reflect_on_association(attribute)
+          attribute = reflection.foreign_key
+          value = value.attributes[reflection.klass.primary_key] unless value.nil?
+        end
 
-          attribute_name = attribute.to_s
+        # the attribute may be an aliased attribute
+        if klass.attribute_alias?(attribute)
+          attribute = klass.attribute_alias(attribute)
+        end
 
-          column = klass.columns_hash[attribute_name]
-          cast_type = klass.type_for_attribute(attribute_name)
+        attribute_name = attribute.to_s
 
-          comparison =
-            if !options[:case_sensitive] && !value.nil?
-              # will use SQL LOWER function before comparison, unless it detects a case insensitive collation
-              klass.connection.case_insensitive_comparison(table, attribute, column, value)
-            else
-              klass.connection.case_sensitive_comparison(table, attribute, column, value)
-            end
+        column = klass.columns_hash[attribute_name]
+        cast_type = klass.type_for_attribute(attribute_name)
 
-          if value.nil?
-            klass.unscoped.where(comparison)
+        comparison =
+          if !options[:case_sensitive] && !value.nil?
+            # will use SQL LOWER function before comparison, unless it detects a case insensitive collation
+            klass.connection.case_insensitive_comparison(table, attribute, column, value)
           else
-            bind = Relation::QueryAttribute.new(attribute_name, value, cast_type)
-            klass.unscoped.where(comparison, bind)
+            klass.connection.case_sensitive_comparison(table, attribute, column, value)
           end
+
+        if value.nil?
+          klass.unscoped.where(comparison)
+        else
+          bind = Relation::QueryAttribute.new(attribute_name, value, cast_type)
+          klass.unscoped.where(comparison, bind)
         end
       end
     end
diff --git a/config/initializers/active_record_data_types.rb b/config/initializers/active_record_data_types.rb
index 717e30b5b7eb8167d0810bf6bf6484e637e8306b..e95157bfde5648cfc4f040c0fcb92c64d5c6a91b 100644
--- a/config/initializers/active_record_data_types.rb
+++ b/config/initializers/active_record_data_types.rb
@@ -65,7 +65,7 @@ class ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter
     prepend RegisterDateTimeWithTimeZone
 
     # Add the class `DateTimeWithTimeZone` so we can map `timestamp` to it.
-    class MysqlDateTimeWithTimeZone < (Gitlab.rails5? ? ActiveRecord::Type::DateTime : MysqlDateTime)
+    class MysqlDateTimeWithTimeZone < ActiveRecord::Type::DateTime
       def type
         :datetime_with_timezone
       end
diff --git a/config/initializers/active_record_locking.rb b/config/initializers/active_record_locking.rb
index 21ff323927baa9a6126c35f94fe30fd9bea82fc7..bfe41e6029aa912038e47f642df6126b707c1cf5 100644
--- a/config/initializers/active_record_locking.rb
+++ b/config/initializers/active_record_locking.rb
@@ -64,21 +64,13 @@ def relation_for_destroy
 
     # This is patched because we want `lock_version` default to `NULL`
     # rather than `0`
-    if Gitlab.rails5?
-      class LockingType
-        def deserialize(value)
-          super
-        end
-
-        def serialize(value)
-          super
-        end
+    class LockingType
+      def deserialize(value)
+        super
       end
-    else
-      class LockingType < SimpleDelegator
-        def type_cast_from_database(value)
-          super
-        end
+
+      def serialize(value)
+        super
       end
     end
   end
diff --git a/config/initializers/application_controller_renderer.rb b/config/initializers/application_controller_renderer.rb
deleted file mode 100644
index a65f8aecf9ea80fcd265ace29701144441fbe911..0000000000000000000000000000000000000000
--- a/config/initializers/application_controller_renderer.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# Remove this `if` condition when upgraded to rails 5.0.
-# The body must be kept.
-if Gitlab.rails5?
-  # Be sure to restart your server when you modify this file.
-
-  # ActiveSupport::Reloader.to_prepare do
-  #   ApplicationController.renderer.defaults.merge!(
-  #     http_host: 'example.org',
-  #     https: false
-  #   )
-  # end
-end
diff --git a/config/initializers/ar5_batching.rb b/config/initializers/ar5_batching.rb
deleted file mode 100644
index 874455ce5af5d466d3587528788593ad966642d5..0000000000000000000000000000000000000000
--- a/config/initializers/ar5_batching.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-# Remove this file when upgraded to rails 5.0.
-unless Gitlab.rails5?
-  module ActiveRecord
-    module Batches
-      # Differences from upstream: enumerator support was removed, and custom
-      # order/limit clauses are ignored without a warning.
-      def in_batches(of: 1000, start: nil, finish: nil, load: false)
-        raise "Must provide a block" unless block_given?
-
-        relation = self.reorder(batch_order).limit(of)
-        relation = relation.where(arel_table[primary_key].gteq(start)) if start
-        relation = relation.where(arel_table[primary_key].lteq(finish)) if finish
-        batch_relation = relation
-
-        loop do
-          if load
-            records = batch_relation.records
-            ids = records.map(&:id)
-            yielded_relation = self.where(primary_key => ids)
-            yielded_relation.load_records(records)
-          else
-            ids = batch_relation.pluck(primary_key)
-            yielded_relation = self.where(primary_key => ids)
-          end
-
-          break if ids.empty?
-
-          primary_key_offset = ids.last
-          raise ArgumentError.new("Primary key not included in the custom select clause") unless primary_key_offset
-
-          yield yielded_relation
-
-          break if ids.length < of
-
-          batch_relation = relation.where(arel_table[primary_key].gt(primary_key_offset))
-        end
-      end
-    end
-  end
-end
diff --git a/config/initializers/ar5_pg_10_support.rb b/config/initializers/ar5_pg_10_support.rb
deleted file mode 100644
index 40548290ce8e8c89495eb3ddc90c5f9e2c93f8f6..0000000000000000000000000000000000000000
--- a/config/initializers/ar5_pg_10_support.rb
+++ /dev/null
@@ -1,58 +0,0 @@
-# Remove this file when upgraded to rails 5.0.
-if !Gitlab.rails5? && Gitlab::Database.postgresql?
-  require 'active_record/connection_adapters/postgresql_adapter'
-  require 'active_record/connection_adapters/postgresql/schema_statements'
-
-  #
-  # Monkey-patch the refused Rails 4.2 patch at https://github.com/rails/rails/pull/31330
-  #
-  # Updates sequence logic to support PostgreSQL 10.
-  #
-  # rubocop:disable all
-  module ActiveRecord
-    module ConnectionAdapters
-
-      # We need #postgresql_version to be public as in ActiveRecord 5 for seed_fu
-      # to work. In ActiveRecord 4, it is protected.
-      # https://github.com/mbleigh/seed-fu/issues/123
-      class PostgreSQLAdapter
-        public :postgresql_version
-      end
-
-      module PostgreSQL
-        module SchemaStatements
-          # Resets the sequence of a table's primary key to the maximum value.
-          def reset_pk_sequence!(table, pk = nil, sequence = nil) #:nodoc:
-            unless pk and sequence
-              default_pk, default_sequence = pk_and_sequence_for(table)
-
-              pk ||= default_pk
-              sequence ||= default_sequence
-            end
-
-            if @logger && pk && !sequence
-              @logger.warn "#{table} has primary key #{pk} with no default sequence"
-            end
-
-            if pk && sequence
-              quoted_sequence = quote_table_name(sequence)
-              max_pk = select_value("SELECT MAX(#{quote_column_name pk}) FROM #{quote_table_name(table)}")
-              if max_pk.nil?
-                if postgresql_version >= 100000
-                  minvalue = select_value("SELECT seqmin FROM pg_sequence WHERE seqrelid = #{quote(quoted_sequence)}::regclass")
-                else
-                  minvalue = select_value("SELECT min_value FROM #{quoted_sequence}")
-                end
-              end
-
-              select_value <<-end_sql, 'SCHEMA'
-                SELECT setval(#{quote(quoted_sequence)}, #{max_pk ? max_pk : minvalue}, #{max_pk ? true : false})
-              end_sql
-            end
-          end
-        end
-      end
-    end
-  end
-  # rubocop:enable all
-end
diff --git a/config/initializers/mysql_set_length_for_binary_indexes.rb b/config/initializers/mysql_set_length_for_binary_indexes.rb
index 5ba35523881c30ae349d002bb0e027798e39224f..644a305e57da7c5ba2fe63615bb29faf4e7674ee 100644
--- a/config/initializers/mysql_set_length_for_binary_indexes.rb
+++ b/config/initializers/mysql_set_length_for_binary_indexes.rb
@@ -2,28 +2,6 @@
 # using the MySQL adapter apply a length of 20. Otherwise MySQL can't create an
 # index on binary columns.
 
-# This module can be removed once a Rails 5 schema is used.
-# It can't be wrapped in a check that checks Gitlab.rails5? because
-# the old Rails 4 schema layout is still used
-module MysqlSetLengthForBinaryIndex
-  def add_index(table_name, column_names, options = {})
-    options[:length] ||= {}
-    Array(column_names).each do |column_name|
-      column = ActiveRecord::Base.connection.columns(table_name).find { |c| c.name == column_name }
-
-      if column&.type == :binary
-        options[:length][column_name] = 20
-      end
-    end
-
-    super(table_name, column_names, options)
-  end
-end
-
-if defined?(ActiveRecord::ConnectionAdapters::Mysql2Adapter)
-  ActiveRecord::ConnectionAdapters::Mysql2Adapter.send(:prepend, MysqlSetLengthForBinaryIndex)
-end
-
 module MysqlSetLengthForBinaryIndexAndIgnorePostgresOptionsForSchema
   # This method is used in Rails 5 schema loading as t.index
   def index(column_names, options = {})
@@ -34,15 +12,6 @@ def index(column_names, options = {})
       return
     end
 
-    # when running rails 4 with rails 5 schema, rails 4 doesn't support multiple
-    # indexes on the same set of columns. Mysql doesn't support partial indexes, so if
-    # an index already exists and we add another index, skip it if it's partial:
-    # see https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/21492#note_102821326
-    if !Gitlab.rails5? && indexes[column_names] && options[:where]
-      warn "WARNING: index on columns #{column_names} already exists and partial index is not supported, skipping."
-      return
-    end
-
     options[:length] ||= {}
     Array(column_names).each do |column_name|
       column = columns.find { |c| c.name == column_name }
@@ -56,14 +25,6 @@ def index(column_names, options = {})
   end
 end
 
-def mysql_adapter?
-  defined?(ActiveRecord::ConnectionAdapters::Mysql2Adapter) && ActiveRecord::Base.connection.is_a?(ActiveRecord::ConnectionAdapters::Mysql2Adapter)
-end
-
-if Gitlab.rails5?
-  if defined?(ActiveRecord::ConnectionAdapters::MySQL::TableDefinition)
-    ActiveRecord::ConnectionAdapters::MySQL::TableDefinition.send(:prepend, MysqlSetLengthForBinaryIndexAndIgnorePostgresOptionsForSchema)
-  end
-elsif mysql_adapter? && defined?(ActiveRecord::ConnectionAdapters::TableDefinition)
-  ActiveRecord::ConnectionAdapters::TableDefinition.send(:prepend, MysqlSetLengthForBinaryIndexAndIgnorePostgresOptionsForSchema)
+if defined?(ActiveRecord::ConnectionAdapters::MySQL::TableDefinition)
+  ActiveRecord::ConnectionAdapters::MySQL::TableDefinition.send(:prepend, MysqlSetLengthForBinaryIndexAndIgnorePostgresOptionsForSchema)
 end
diff --git a/config/initializers/new_framework_defaults.rb b/config/initializers/new_framework_defaults.rb
index 2d130bc0bf8a9ee145dbec431f9b7f63c101c62f..5adb9f7a4b4731d36f01d1dd92db62ada1f4022c 100644
--- a/config/initializers/new_framework_defaults.rb
+++ b/config/initializers/new_framework_defaults.rb
@@ -1,29 +1,27 @@
 # Remove this `if` condition when upgraded to rails 5.0.
 # The body must be kept.
-if Gitlab.rails5?
-  # Be sure to restart your server when you modify this file.
-  #
-  # This file contains migration options to ease your Rails 5.0 upgrade.
-  #
-  # Once upgraded flip defaults one by one to migrate to the new default.
-  #
-  # Read the Guide for Upgrading Ruby on Rails for more info on each option.
+# Be sure to restart your server when you modify this file.
+#
+# This file contains migration options to ease your Rails 5.0 upgrade.
+#
+# Once upgraded flip defaults one by one to migrate to the new default.
+#
+# Read the Guide for Upgrading Ruby on Rails for more info on each option.
 
-  Rails.application.config.action_controller.raise_on_unfiltered_parameters = true
+Rails.application.config.action_controller.raise_on_unfiltered_parameters = true
 
-  # Enable per-form CSRF tokens. Previous versions had false.
-  Rails.application.config.action_controller.per_form_csrf_tokens = false
+# Enable per-form CSRF tokens. Previous versions had false.
+Rails.application.config.action_controller.per_form_csrf_tokens = false
 
-  # Enable origin-checking CSRF mitigation. Previous versions had false.
-  Rails.application.config.action_controller.forgery_protection_origin_check = false
+# Enable origin-checking CSRF mitigation. Previous versions had false.
+Rails.application.config.action_controller.forgery_protection_origin_check = false
 
-  # Make Ruby 2.4 preserve the timezone of the receiver when calling `to_time`.
-  # Previous versions had false.
-  ActiveSupport.to_time_preserves_timezone = false
+# Make Ruby 2.4 preserve the timezone of the receiver when calling `to_time`.
+# Previous versions had false.
+ActiveSupport.to_time_preserves_timezone = false
 
-  # Require `belongs_to` associations by default. Previous versions had false.
-  Rails.application.config.active_record.belongs_to_required_by_default = false
+# Require `belongs_to` associations by default. Previous versions had false.
+Rails.application.config.active_record.belongs_to_required_by_default = false
 
-  # Do not halt callback chains when a callback returns false. Previous versions had true.
-  ActiveSupport.halt_callback_chains_on_return_false = true
-end
+# Do not halt callback chains when a callback returns false. Previous versions had true.
+ActiveSupport.halt_callback_chains_on_return_false = true
diff --git a/config/initializers/postgresql_opclasses_support.rb b/config/initializers/postgresql_opclasses_support.rb
index 5d643b75dd83aa3f1b888161b552382c43b1ea8c..70b530415f56cd4c3f82e2c4475e7f92e2006594 100644
--- a/config/initializers/postgresql_opclasses_support.rb
+++ b/config/initializers/postgresql_opclasses_support.rb
@@ -41,10 +41,7 @@ module ConnectionAdapters #:nodoc:
     # Abstract representation of an index definition on a table. Instances of
     # this type are typically created and returned by methods in database
     # adapters. e.g. ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter#indexes
-    attrs = [:table, :name, :unique, :columns, :lengths, :orders, :where, :type, :using, :opclasses]
-
-    # In Rails 5 the second last attribute is newly `:comment`
-    attrs.insert(-2, :comment) if Gitlab.rails5?
+    attrs = [:table, :name, :unique, :columns, :lengths, :orders, :where, :type, :using, :comment, :opclasses]
 
     class IndexDefinition < Struct.new(*attrs) #:nodoc:
     end
@@ -112,15 +109,8 @@ def indexes(table_name, name = nil)
 
           result.map do |row|
             index_name = row[0]
-            unique = if Gitlab.rails5?
-                       row[1]
-                     else
-                       row[1] == 't'
-                     end
-            indkey = row[2].split(" ")
-            if Gitlab.rails5?
-              indkey = indkey.map(&:to_i)
-            end
+            unique = row[1]
+            indkey = row[2].split(" ").map(&:to_i)
             inddef = row[3]
             oid = row[4]
 
@@ -144,8 +134,7 @@ def indexes(table_name, name = nil)
                                  [column, opclass] if opclass
                                end.compact]
 
-              index_attrs = [table_name, index_name, unique, column_names, [], orders, where, nil, using, opclasses]
-              index_attrs.insert(-2, nil) if Gitlab.rails5? # include index comment for Rails 5
+              index_attrs = [table_name, index_name, unique, column_names, [], orders, where, nil, using, nil, opclasses]
 
               IndexDefinition.new(*index_attrs)
             end
@@ -205,7 +194,7 @@ def index_parts(index)
         index_parts << "using: #{index.using.inspect}" if index.using
         index_parts << "type: #{index.type.inspect}" if index.type
         index_parts << "opclasses: #{index.opclasses.inspect}" if index.opclasses.present?
-        index_parts << "comment: #{index.comment.inspect}" if Gitlab.rails5? && index.comment
+        index_parts << "comment: #{index.comment.inspect}" if index.comment
         index_parts
       end
 
diff --git a/config/initializers/static_files.rb b/config/initializers/static_files.rb
index a0b8b68f3ef6e54b3bb7ca6a675b06a8e60b5edd..e02f0868e9fdd2a980ad9f586d1500aef4324b07 100644
--- a/config/initializers/static_files.rb
+++ b/config/initializers/static_files.rb
@@ -1,26 +1,17 @@
 app = Rails.application
 
-if (Gitlab.rails5? && app.config.public_file_server.enabled) || app.config.serve_static_files
+if app.config.public_file_server.enabled
   # The `ActionDispatch::Static` middleware intercepts requests for static files
   # by checking if they exist in the `/public` directory.
   # We're replacing it with our `Gitlab::Middleware::Static` that does the same,
   # except ignoring `/uploads`, letting those go through to the GitLab Rails app.
 
-  if Gitlab.rails5?
-    app.config.middleware.swap(
-      ActionDispatch::Static,
-      Gitlab::Middleware::Static,
-      app.paths["public"].first,
-      headers: app.config.public_file_server.headers
-    )
-  else
-    app.config.middleware.swap(
-      ActionDispatch::Static,
-      Gitlab::Middleware::Static,
-      app.paths["public"].first,
-      app.config.static_cache_control
-    )
-  end
+  app.config.middleware.swap(
+    ActionDispatch::Static,
+    Gitlab::Middleware::Static,
+    app.paths["public"].first,
+    headers: app.config.public_file_server.headers
+  )
 
   # If webpack-dev-server is configured, proxy webpack's public directory
   # instead of looking for static assets
diff --git a/config/initializers/trusted_proxies.rb b/config/initializers/trusted_proxies.rb
index ca2eed664ed390f55f583da02a2bc11a96353cd4..7af465d84432feaabb2f117219e883eb239998fe 100644
--- a/config/initializers/trusted_proxies.rb
+++ b/config/initializers/trusted_proxies.rb
@@ -26,12 +26,10 @@ def trusted_proxy?(ip)
 # A monkey patch to make trusted proxies work with Rails 5.0.
 # Inspired by https://github.com/rails/rails/issues/5223#issuecomment-263778719
 # Remove this monkey patch when upstream is fixed.
-if Gitlab.rails5?
-  module TrustedProxyMonkeyPatch
-    def ip
-      @ip ||= (get_header("action_dispatch.remote_ip") || super).to_s
-    end
+module TrustedProxyMonkeyPatch
+  def ip
+    @ip ||= (get_header("action_dispatch.remote_ip") || super).to_s
   end
-
-  ActionDispatch::Request.send(:include, TrustedProxyMonkeyPatch)
 end
+
+ActionDispatch::Request.send(:include, TrustedProxyMonkeyPatch)
diff --git a/danger/gemfile/Dangerfile b/danger/gemfile/Dangerfile
index 8ef4a464fe482dfa5f8d67360ceeb3ea48a6d814..4e91abc371ad83fd11023574bb6a33a9eedd0f2e 100644
--- a/danger/gemfile/Dangerfile
+++ b/danger/gemfile/Dangerfile
@@ -4,7 +4,7 @@ GEMFILE_LOCK_NOT_UPDATED_MESSAGE = <<~MSG.freeze
 Usually, when %<gemfile>s is updated, you should run
 ```
 bundle install && \
-  BUNDLE_GEMFILE=Gemfile.rails5 bundle install
+  bundle install
 ```
 
 or
diff --git a/ee/spec/lib/gitlab/database/load_balancing/host_spec.rb b/ee/spec/lib/gitlab/database/load_balancing/host_spec.rb
index 78b06ee998302e2ce6d9859ffa0b0b137839b897..b5fcfb2a96b52bbf5304cdf622562c87b6f62d4f 100644
--- a/ee/spec/lib/gitlab/database/load_balancing/host_spec.rb
+++ b/ee/spec/lib/gitlab/database/load_balancing/host_spec.rb
@@ -323,8 +323,7 @@ def wrapped_exception(wrapper, original)
       expect(host.caught_up?('foo')).to eq(true)
     end
 
-    # TODO: remove rails5-only tag after removing rails4 tests
-    it 'returns true when a host has caught up', :rails5 do
+    it 'returns true when a host has caught up' do
       allow(host).to receive(:connection).and_return(connection)
       expect(connection).to receive(:select_all).and_return([{ 'result' => true }])
 
@@ -338,8 +337,7 @@ def wrapped_exception(wrapper, original)
       expect(host.caught_up?('foo')).to eq(false)
     end
 
-    # TODO: remove rails5-only tag after removing rails4 tests
-    it 'returns false when a host has not caught up', :rails5 do
+    it 'returns false when a host has not caught up' do
       allow(host).to receive(:connection).and_return(connection)
       expect(connection).to receive(:select_all).and_return([{ 'result' => false }])
 
diff --git a/lib/rails4_migration_version.rb b/lib/rails4_migration_version.rb
deleted file mode 100644
index ae48734dfad0699a7b546229452764e2a3fddbd9..0000000000000000000000000000000000000000
--- a/lib/rails4_migration_version.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# rubocop:disable Naming/FileName
-# frozen_string_literal: true
-
-# When switching to rails 5, we added migration version to all migration
-# classes. This patch makes it possible to run versioned migrations
-# also with rails 4
-
-unless Gitlab.rails5?
-  module ActiveRecord
-    class Migration
-      def self.[](version)
-        Migration
-      end
-    end
-  end
-end
diff --git a/scripts/rails4-gemfile-lock-check b/scripts/rails4-gemfile-lock-check
deleted file mode 100755
index a74a49874e151ec22fb387524df8d64f36293ca9..0000000000000000000000000000000000000000
--- a/scripts/rails4-gemfile-lock-check
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/env bash
-
-echo -e "=> Checking if Gemfile.rails4.lock is up-to-date...\\n"
-
-cp Gemfile.rails4.lock Gemfile.rails4.lock.orig
-BUNDLE_GEMFILE=Gemfile.rails4 bundle install "$BUNDLE_INSTALL_FLAGS"
-diff -u Gemfile.rails4.lock.orig Gemfile.rails4.lock >/dev/null 2>&1
-
-if [ $? == 1 ]
-then
-  diff -u Gemfile.rails4.lock.orig Gemfile.rails4.lock
-
-  echo -e "\\n✖ ERROR: Gemfile.rails4.lock is not up-to-date!
-         Please run 'BUNDLE_GEMFILE=Gemfile.rails4 bundle install'\\n" >&2
-  exit 1
-fi
-
-echo "✔ Gemfile.rails4.lock is up-to-date"
-exit 0
diff --git a/spec/lib/gitlab/database/migration_helpers_spec.rb b/spec/lib/gitlab/database/migration_helpers_spec.rb
index 23f27939dd226734314cadfde39e109ca1a7ffa1..4e83b27e4a53281639814a2fe6f5566237a392db 100644
--- a/spec/lib/gitlab/database/migration_helpers_spec.rb
+++ b/spec/lib/gitlab/database/migration_helpers_spec.rb
@@ -1338,12 +1338,7 @@
   end
 
   describe '#index_exists_by_name?' do
-    # TODO: remove rails5-only after removing rails4 tests
-    # rails 4 can not handle multiple indexes on the same column set if
-    # index was added by 't.index' - t.index is used by default in schema.rb in
-    # rails 5. Let's run this test only in rails 5 env:
-    # see https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/21492#note_113602758
-    it 'returns true if an index exists', :rails5 do
+    it 'returns true if an index exists' do
       expect(model.index_exists_by_name?(:projects, 'index_projects_on_path'))
         .to be_truthy
     end
diff --git a/spec/lib/gitlab/database_spec.rb b/spec/lib/gitlab/database_spec.rb
index fc295b2deff91cc2e5082a3e863964139b897eb1..0826bc3eeed32bf5103f181b8c35b98a7c4f3815 100644
--- a/spec/lib/gitlab/database_spec.rb
+++ b/spec/lib/gitlab/database_spec.rb
@@ -462,8 +462,7 @@
         expect(described_class.db_read_only?).to be_truthy
       end
 
-      # TODO: remove rails5-only tag after removing rails4 tests
-      it 'detects a read only database', :rails5 do
+      it 'detects a read only database' do
         allow(ActiveRecord::Base.connection).to receive(:execute).with('SELECT pg_is_in_recovery()').and_return([{ "pg_is_in_recovery" => true }])
 
         expect(described_class.db_read_only?).to be_truthy
@@ -475,8 +474,7 @@
         expect(described_class.db_read_only?).to be_falsey
       end
 
-      # TODO: remove rails5-only tag after removing rails4 tests
-      it 'detects a read write database', :rails5 do
+      it 'detects a read write database' do
         allow(ActiveRecord::Base.connection).to receive(:execute).with('SELECT pg_is_in_recovery()').and_return([{ "pg_is_in_recovery" => false }])
 
         expect(described_class.db_read_only?).to be_falsey
diff --git a/spec/lib/gitlab/github_import/importer/pull_request_importer_spec.rb b/spec/lib/gitlab/github_import/importer/pull_request_importer_spec.rb
index efca85648940627c74808f23e2b42810e348551c..25684ea9e2c195a585b7d385e2eb38867dba4fea 100644
--- a/spec/lib/gitlab/github_import/importer/pull_request_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/pull_request_importer_spec.rb
@@ -240,12 +240,7 @@
           .and_return(user.id)
       end
 
-      # TODO: remove rails5-only after removing rails4 tests
-      # rails 4 can not handle multiple indexes on the same column set if
-      # index was added by 't.index' - t.index is used by default in schema.rb in
-      # rails 5. Let's run this test only in rails 5 env:
-      # see https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/21492#note_113602758
-      it 'returns the existing merge request', :rails5 do
+      it 'returns the existing merge request' do
         mr1, exists1 = importer.create_merge_request
         mr2, exists2 = importer.create_merge_request
 
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 5b4e29a571c1c628a043c2e081ed6d8fae4bfba7..ca83ff4c18b4833dc58cf01dc8389a1f65052086 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -237,10 +237,6 @@
     example.run if Gitlab::Database.mysql?
   end
 
-  config.around(:each, :rails5) do |example|
-    example.run if Gitlab.rails5?
-  end
-
   # This makes sure the `ApplicationController#can?` method is stubbed with the
   # original implementation for all view specs.
   config.before(:each, type: :view) do