diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 44beccd966a61b2a82b0a52d4c2a7f176c571291..c971df3ba5fc6fbd5b9e3efb8a9087529ef478d6 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,4 +1,4 @@
-image: "dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.5.3-golang-1.11-git-2.21-chrome-73.0-node-10.x-yarn-1.12-postgresql-9.6-graphicsmagick-1.3.29"
+image: "dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.6.3-golang-1.11-git-2.21-chrome-73.0-node-10.x-yarn-1.12-postgresql-9.6-graphicsmagick-1.3.29"
 
 variables:
   MYSQL_ALLOW_EMPTY_PASSWORD: "1"
diff --git a/.gitlab/ci/cng.gitlab-ci.yml b/.gitlab/ci/cng.gitlab-ci.yml
index c384bcdcdfcd5ec7e63877c68b658b247f0150c2..d624e8d09f60c4402cad0950cac733624e480381 100644
--- a/.gitlab/ci/cng.gitlab-ci.yml
+++ b/.gitlab/ci/cng.gitlab-ci.yml
@@ -1,5 +1,5 @@
 cloud-native-image:
-  image: ruby:2.5-alpine
+  image: ruby:2.6-alpine
   before_script: []
   dependencies: []
   stage: post-test
diff --git a/.gitlab/ci/frontend.gitlab-ci.yml b/.gitlab/ci/frontend.gitlab-ci.yml
index fbf8925e30aa811a89b67131995b48a42f8d6a93..986ba7558d5c0b1fbeb9ec5ee1423b19d314d4f2 100644
--- a/.gitlab/ci/frontend.gitlab-ci.yml
+++ b/.gitlab/ci/frontend.gitlab-ci.yml
@@ -16,7 +16,7 @@
 gitlab:assets:compile:
   <<: *assets-compile-cache
   extends: .dedicated-no-docs-pull-cache-job
-  image: dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.5.3-git-2.21-chrome-73.0-node-8.x-yarn-1.12-graphicsmagick-1.3.29-docker-18.06.1
+  image: dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.6.3-git-2.21-chrome-73.0-node-8.x-yarn-1.12-graphicsmagick-1.3.29-docker-18.06.1
   dependencies:
     - setup-test-env
   services:
diff --git a/.gitlab/ci/global.gitlab-ci.yml b/.gitlab/ci/global.gitlab-ci.yml
index 466c47b37c742a8c7c2266c6a9fceeaab781f5cf..cf87f5eb39c73867f8166939a822cf035121a964 100644
--- a/.gitlab/ci/global.gitlab-ci.yml
+++ b/.gitlab/ci/global.gitlab-ci.yml
@@ -9,7 +9,7 @@
     - gitlab-org
 
 .default-cache: &default-cache
-  key: "debian-stretch-ruby-2.5.3-node-10.x"
+  key: "debian-stretch-ruby-2.6.3-node-10.x"
   paths:
     - vendor/ruby
     - .yarn-cache/
@@ -47,7 +47,7 @@
 
 .single-script-job-dedicated-runner:
   extends: .dedicated-runner
-  image: ruby:2.5-alpine
+  image: ruby:2.6-alpine
   stage: test
   cache: {}
   dependencies: []
diff --git a/.gitlab/ci/qa.gitlab-ci.yml b/.gitlab/ci/qa.gitlab-ci.yml
index 85c6409186e9cf8c8825cf6b2031c00ef56ab802..122ed622ee2c4fb34cf0531656b87c5901bfbd2b 100644
--- a/.gitlab/ci/qa.gitlab-ci.yml
+++ b/.gitlab/ci/qa.gitlab-ci.yml
@@ -1,5 +1,5 @@
 package-and-qa:
-  image: ruby:2.5-alpine
+  image: ruby:2.6-alpine
   stage: qa
   when: manual
   before_script: []
diff --git a/.gitlab/ci/rails.gitlab-ci.yml b/.gitlab/ci/rails.gitlab-ci.yml
index 35c5f67427e912385e46aa38109ee5f7e22ab89e..29534e40a14ff6159f4833c7c513b4a1143372cc 100644
--- a/.gitlab/ci/rails.gitlab-ci.yml
+++ b/.gitlab/ci/rails.gitlab-ci.yml
@@ -86,7 +86,7 @@
 .rspec-metadata-pg-10: &rspec-metadata-pg-10
   <<: *rspec-metadata
   <<: *use-pg-10
-  image: "dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.5.3-golang-1.11-git-2.21-chrome-73.0-node-10.x-yarn-1.12-postgresql-10-graphicsmagick-1.3.29"
+  image: "dev.gitlab.org:5005/gitlab/gitlab-build-images:ruby-2.6.3-golang-1.11-git-2.21-chrome-73.0-node-10.x-yarn-1.12-postgresql-10-graphicsmagick-1.3.29"
 
 .rspec-metadata-mysql: &rspec-metadata-mysql
   <<: *rspec-metadata
@@ -108,7 +108,8 @@
     - git fetch https://gitlab.com/gitlab-org/gitlab-ce.git v9.3.0
     - git checkout -f FETCH_HEAD
     - sed -i "s/gem 'oj', '~> 2.17.4'//" Gemfile
-    - bundle update google-protobuf grpc
+    - sed -i "s/gem 'bootsnap', '~> 1.0.0'/gem 'bootsnap'/" Gemfile
+    - bundle update google-protobuf grpc bootsnap
     - bundle install $BUNDLE_INSTALL_FLAGS
     - date
     - cp config/gitlab.yml.example config/gitlab.yml
@@ -183,7 +184,7 @@ static-analysis:
   script:
     - scripts/static-analysis
   cache:
-    key: "debian-stretch-ruby-2.5.3-node-10.x-and-rubocop"
+    key: "debian-stretch-ruby-2.6.3-node-10.x-and-rubocop"
     paths:
       - vendor/ruby
       - .yarn-cache/
diff --git a/.gitlab/ci/review.gitlab-ci.yml b/.gitlab/ci/review.gitlab-ci.yml
index ae16549ef6b1ac4bda5d9ef51b6ee0cb5aa253a4..3a024c44fe2fc11ff8f19274c761b4118a53fd5a 100644
--- a/.gitlab/ci/review.gitlab-ci.yml
+++ b/.gitlab/ci/review.gitlab-ci.yml
@@ -54,7 +54,7 @@ build-qa-image:
     - time docker push ${QA_IMAGE}
 
 .review-build-cng-base: &review-build-cng-base
-  image: ruby:2.5-alpine
+  image: ruby:2.6-alpine
   stage: test
   when: manual
   before_script:
diff --git a/.gitlab/ci/test-metadata.gitlab-ci.yml b/.gitlab/ci/test-metadata.gitlab-ci.yml
index 3ba7af956b56a5fa275ef549f0c76e67a96b1f9c..4b595083ec6f61da725024d38b63b607632e8ef3 100644
--- a/.gitlab/ci/test-metadata.gitlab-ci.yml
+++ b/.gitlab/ci/test-metadata.gitlab-ci.yml
@@ -56,7 +56,7 @@ update-tests-metadata:
 
 flaky-examples-check:
   extends: .dedicated-runner
-  image: ruby:2.5-alpine
+  image: ruby:2.6-alpine
   services: []
   before_script: []
   variables:
diff --git a/.ruby-version b/.ruby-version
index aedc15bb0c6e24f27eedf7684532f8039cabb92c..ec1cf33c3f6e22d5833bed6199c520a9ee20a0fa 100644
--- a/.ruby-version
+++ b/.ruby-version
@@ -1 +1 @@
-2.5.3
+2.6.3
diff --git a/changelogs/unreleased/sh-upgrade-ruby-2-6-3-ce.yml b/changelogs/unreleased/sh-upgrade-ruby-2-6-3-ce.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9ad5c9ebb648d072f81c41ae823ddd605852baf5
--- /dev/null
+++ b/changelogs/unreleased/sh-upgrade-ruby-2-6-3-ce.yml
@@ -0,0 +1,5 @@
+---
+title: Upgrade Ruby version to 2.6.3
+merge_request: 28117
+author:
+type: performance
diff --git a/doc/ci/caching/index.md b/doc/ci/caching/index.md
index e079483e2b553a78235cdf7ca868b1ed8a625f6d..3f72fe3e9ebe52199892c2adc25f3d6b0e1d3fb5 100644
--- a/doc/ci/caching/index.md
+++ b/doc/ci/caching/index.md
@@ -289,7 +289,7 @@ jobs inherit it. Gems are installed in `vendor/ruby/` and are cached per-branch:
 #
 # https://gitlab.com/gitlab-org/gitlab-ce/tree/master/lib/gitlab/ci/templates/Ruby.gitlab-ci.yml
 #
-image: ruby:2.5
+image: ruby:2.6
 
 # Cache gems in between builds
 cache:
diff --git a/doc/install/installation.md b/doc/install/installation.md
index c694f0ed691e21b1a86ae35a39914f880e5676fe..f16bc04af343c9108fcafc84282c1bc8807de810 100644
--- a/doc/install/installation.md
+++ b/doc/install/installation.md
@@ -163,9 +163,9 @@ Download Ruby and compile it:
 
 ```sh
 mkdir /tmp/ruby && cd /tmp/ruby
-curl --remote-name --progress https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.3.tar.gz
-echo 'f919a9fbcdb7abecd887157b49833663c5c15fda  ruby-2.5.3.tar.gz' | shasum -c - && tar xzf ruby-2.5.3.tar.gz
-cd ruby-2.5.3
+curl --remote-name --progress https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.3.tar.gz
+echo '2347ed6ca5490a104ebd5684d2b9b5eefa6cd33c  ruby-2.6.3.tar.gz' | shasum -c - && tar xzf ruby-2.6.3.tar.gz
+cd ruby-2.6.3
 
 ./configure --disable-install-rdoc
 make
diff --git a/doc/update/upgrading_from_source.md b/doc/update/upgrading_from_source.md
index fea896698316bcaf4f333b409cfc4e3b212fc267..5118726cb0a6d4bf492c3f019aaf8a7c047b4280 100644
--- a/doc/update/upgrading_from_source.md
+++ b/doc/update/upgrading_from_source.md
@@ -52,9 +52,9 @@ Download Ruby and compile it:
 
 ```bash
 mkdir /tmp/ruby && cd /tmp/ruby
-curl --remote-name --progress https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.3.tar.gz
-echo 'f919a9fbcdb7abecd887157b49833663c5c15fda  ruby-2.5.3.tar.gz' | shasum -c - && tar xzf ruby-2.5.3.tar.gz
-cd ruby-2.5.3
+curl --remote-name --progress https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.3.tar.gz
+echo '2347ed6ca5490a104ebd5684d2b9b5eefa6cd33c  ruby-2.6.3.tar.gz' | shasum -c - && tar xzf ruby-2.6.3.tar.gz
+cd ruby-2.6.3
 
 ./configure --disable-install-rdoc
 make
diff --git a/qa/Dockerfile b/qa/Dockerfile
index ca7f9accb701c75a2a75f4d6409cbee9f9c3dde0..74be373b8e811ff96d97b993a84ec6f9e5d8f659 100644
--- a/qa/Dockerfile
+++ b/qa/Dockerfile
@@ -1,4 +1,4 @@
-FROM ruby:2.5-stretch
+FROM ruby:2.6-stretch
 LABEL maintainer "Grzegorz Bizon <grzegorz@gitlab.com>"
 ENV DEBIAN_FRONTEND noninteractive