diff --git a/.rubocop.yml b/.rubocop.yml
index cfff42e5c99f0eaad562cfc6c7ce20c9ad087c56..aa91b57d7b325c5151c158f7c76bd9fca935db98 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -5,7 +5,7 @@ require:
 inherit_from: .rubocop_todo.yml
 
 AllCops:
-  TargetRubyVersion: 2.1
+  TargetRubyVersion: 2.3
   # Cop names are not d§splayed in offense messages by default. Change behavior
   # by overriding DisplayCopNames, or by giving the -D/--display-cop-names
   # option.
diff --git a/app/controllers/projects/wikis_controller.rb b/app/controllers/projects/wikis_controller.rb
index c3353446fd115718de5aa54fedb0ae2381c0a938..8e683931b2ef5949369cf976cc61fe5fc525fc3c 100644
--- a/app/controllers/projects/wikis_controller.rb
+++ b/app/controllers/projects/wikis_controller.rb
@@ -83,7 +83,7 @@ class Projects::WikisController < Projects::ApplicationController
 
   def destroy
     @page = @project_wiki.find_page(params[:id])
-    @page.delete if @page
+    @page&.delete
 
     redirect_to(
       namespace_project_wiki_path(@project.namespace, @project, :home),
diff --git a/app/mailers/notify.rb b/app/mailers/notify.rb
index 0cd3456b4de90d139495760fa0b624c5f7fc460c..5b9226a6b81a51a69c6fbeb4b39e36d08284996c 100644
--- a/app/mailers/notify.rb
+++ b/app/mailers/notify.rb
@@ -151,7 +151,7 @@ class Notify < BaseMailer
     headers['In-Reply-To'] = message_id(model)
     headers['References'] = message_id(model)
 
-    headers[:subject].prepend('Re: ') if headers[:subject]
+    headers[:subject]&.prepend('Re: ')
 
     mail_thread(model, headers)
   end
diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb
index 9a4557524c4b0be542b35b28c208ee0627d66c32..74b358d8c40a08dce2ea8f9b545c67400624f491 100644
--- a/app/models/application_setting.rb
+++ b/app/models/application_setting.rb
@@ -116,31 +116,25 @@ class ApplicationSetting < ActiveRecord::Base
             numericality: { only_integer: true, greater_than_or_equal_to: 0 }
 
   validates_each :restricted_visibility_levels do |record, attr, value|
-    unless value.nil?
-      value.each do |level|
-        unless Gitlab::VisibilityLevel.options.has_value?(level)
-          record.errors.add(attr, "'#{level}' is not a valid visibility level")
-        end
+    value&.each do |level|
+      unless Gitlab::VisibilityLevel.options.has_value?(level)
+        record.errors.add(attr, "'#{level}' is not a valid visibility level")
       end
     end
   end
 
   validates_each :import_sources do |record, attr, value|
-    unless value.nil?
-      value.each do |source|
-        unless Gitlab::ImportSources.options.has_value?(source)
-          record.errors.add(attr, "'#{source}' is not a import source")
-        end
+    value&.each do |source|
+      unless Gitlab::ImportSources.options.has_value?(source)
+        record.errors.add(attr, "'#{source}' is not a import source")
       end
     end
   end
 
   validates_each :disabled_oauth_sign_in_sources do |record, attr, value|
-    unless value.nil?
-      value.each do |source|
-        unless Devise.omniauth_providers.include?(source.to_sym)
-          record.errors.add(attr, "'#{source}' is not an OAuth sign-in source")
-        end
+    value&.each do |source|
+      unless Devise.omniauth_providers.include?(source.to_sym)
+        record.errors.add(attr, "'#{source}' is not an OAuth sign-in source")
       end
     end
   end
@@ -230,11 +224,11 @@ class ApplicationSetting < ActiveRecord::Base
   end
 
   def domain_whitelist_raw
-    self.domain_whitelist.join("\n") unless self.domain_whitelist.nil?
+    self.domain_whitelist&.join("\n")
   end
 
   def domain_blacklist_raw
-    self.domain_blacklist.join("\n") unless self.domain_blacklist.nil?
+    self.domain_blacklist&.join("\n")
   end
 
   def domain_whitelist_raw=(values)
diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb
index 3517969eabc65b45ae612944c8e525df1ffffbc9..d1872dd931dc7ba14cf41a2913001dd4236d516d 100644
--- a/app/models/concerns/issuable.rb
+++ b/app/models/concerns/issuable.rb
@@ -95,8 +95,8 @@ module Issuable
     def update_assignee_cache_counts
       # make sure we flush the cache for both the old *and* new assignees(if they exist)
       previous_assignee = User.find_by_id(assignee_id_was) if assignee_id_was
-      previous_assignee.update_cache_counts if previous_assignee
-      assignee.update_cache_counts if assignee
+      previous_assignee&.update_cache_counts
+      assignee&.update_cache_counts
     end
 
     # We want to use optimistic lock for cases when only title or description are involved
diff --git a/app/models/concerns/milestoneish.rb b/app/models/concerns/milestoneish.rb
index e9450dd0c26cf331a53f9ca8358a6b6ff23df8c1..f449229864d44debc9fb5b3e5ff0a177a2141eeb 100644
--- a/app/models/concerns/milestoneish.rb
+++ b/app/models/concerns/milestoneish.rb
@@ -73,7 +73,7 @@ module Milestoneish
   def memoize_per_user(user, method_name)
     @memoized ||= {}
     @memoized[method_name] ||= {}
-    @memoized[method_name][user.try!(:id)] ||= yield
+    @memoized[method_name][user&.id] ||= yield
   end
 
   # override in a class that includes this module to get a faster query
diff --git a/app/models/group_milestone.rb b/app/models/group_milestone.rb
index 7b6db2634b7107a4cebb2ae55d9961f4fe909a2d..86d38e5468b8bc843b521677d15a50b33c093b78 100644
--- a/app/models/group_milestone.rb
+++ b/app/models/group_milestone.rb
@@ -9,7 +9,7 @@ class GroupMilestone < GlobalMilestone
 
   def self.build(group, projects, title)
     super(projects, title).tap do |milestone|
-      milestone.group = group if milestone
+      milestone&.group = group
     end
   end
 
diff --git a/app/models/project.rb b/app/models/project.rb
index 0d286bfbaa80a9dcdf730a52503002e5fa5bb348..054979330073257b3e61eaa42c8ad9108ce00053 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -461,7 +461,7 @@ class Project < ActiveRecord::Base
   def reset_cache_and_import_attrs
     ProjectCacheWorker.perform_async(self.id)
 
-    self.import_data.destroy if self.import_data
+    self.import_data&.destroy
   end
 
   def import_url=(value)
diff --git a/app/models/user.rb b/app/models/user.rb
index 54f5388eb2c215ec951ce06ccd298614ced47dd7..15fe8084a9cb4e6dccfd6bc16236d8d93dfd80bd 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -304,7 +304,7 @@ class User < ActiveRecord::Base
 
     def find_by_personal_access_token(token_string)
       personal_access_token = PersonalAccessToken.active.find_by_token(token_string) if token_string
-      personal_access_token.user if personal_access_token
+      personal_access_token&.user
     end
 
     # Returns a user for the given SSH key.
diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb
index c3de278f5b7ecd14f1d3c029b46e7d9d53f8532f..e93d0eab6d8c5d338d78a3f02fd22307dcf068b8 100644
--- a/app/models/wiki_page.rb
+++ b/app/models/wiki_page.rb
@@ -69,16 +69,12 @@ class WikiPage
 
   # The raw content of this page.
   def content
-    @attributes[:content] ||= if @page
-                                @page.text_data
-                              end
+    @attributes[:content] ||= @page&.text_data
   end
 
   # The processed/formatted content of this page.
   def formatted_content
-    @attributes[:formatted_content] ||= if @page
-                                          @page.formatted_data
-                                        end
+    @attributes[:formatted_content] ||= @page&.formatted_data
   end
 
   # The markup format for the page.
diff --git a/app/services/create_tag_service.rb b/app/services/create_tag_service.rb
index fe9353afeb8f4ff0c876845f51a677cd6d511c82..6c75d1f04ffe281709dac0a54ac8852107140a4d 100644
--- a/app/services/create_tag_service.rb
+++ b/app/services/create_tag_service.rb
@@ -4,7 +4,7 @@ class CreateTagService < BaseService
     return error('Tag name invalid') unless valid_tag
 
     repository = project.repository
-    message.strip! if message
+    message&.strip!
 
     new_tag = nil
 
diff --git a/app/services/delete_tag_service.rb b/app/services/delete_tag_service.rb
index 9d4bffb93e9e182d69e2e1c1cf423ce9f1563835..eb726cb04b1641253b186d48df624096684f6e1c 100644
--- a/app/services/delete_tag_service.rb
+++ b/app/services/delete_tag_service.rb
@@ -9,7 +9,7 @@ class DeleteTagService < BaseService
 
     if repository.rm_tag(current_user, tag_name)
       release = project.releases.find_by(tag: tag_name)
-      release.destroy if release
+      release&.destroy
 
       push_data = build_push_data(tag)
       EventCreateService.new.push(project, current_user, push_data)
diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb
index c7cce0c55b9dea73b4f2040aa08e3b67833a8ec2..6dc3d8c2416012723c49758d4c53ea09e31765f1 100644
--- a/app/services/projects/create_service.rb
+++ b/app/services/projects/create_service.rb
@@ -97,7 +97,7 @@ module Projects
         @project.team << [current_user, :master, current_user]
       end
 
-      @project.group.refresh_members_authorized_projects if @project.group
+      @project.group&.refresh_members_authorized_projects
     end
 
     def skip_wiki?
diff --git a/app/workers/authorized_projects_worker.rb b/app/workers/authorized_projects_worker.rb
index 6abbb5a525041b51e501c9b24cc65fca165e4780..0e20df506a371d5765c5ae83e17b204cf0b9de76 100644
--- a/app/workers/authorized_projects_worker.rb
+++ b/app/workers/authorized_projects_worker.rb
@@ -16,6 +16,6 @@ class AuthorizedProjectsWorker
   def perform(user_id)
     user = User.find_by(id: user_id)
 
-    user.refresh_authorized_projects if user
+    user&.refresh_authorized_projects
   end
 end
diff --git a/lib/api/branches.rb b/lib/api/branches.rb
index be659fa4a6ac50f17f7ec5155ee66d00b1020a9b..9331be1f7de1b46d545fab132ff78e397db12004 100644
--- a/lib/api/branches.rb
+++ b/lib/api/branches.rb
@@ -84,7 +84,7 @@ module API
         branch = user_project.repository.find_branch(params[:branch])
         not_found!("Branch") unless branch
         protected_branch = user_project.protected_branches.find_by(name: branch.name)
-        protected_branch.destroy if protected_branch
+        protected_branch&.destroy
 
         present branch, with: Entities::RepoBranch, project: user_project
       end
diff --git a/lib/api/entities.rb b/lib/api/entities.rb
index b1ead48caf7e6212f4d681a4517200ea4147bb7a..bedcd5037246cf1679b01b9a2e12a342b5665171 100644
--- a/lib/api/entities.rb
+++ b/lib/api/entities.rb
@@ -382,9 +382,7 @@ module API
       expose :author, using: Entities::UserBasic, if: ->(event, options) { event.author }
 
       expose :author_username do |event, options|
-        if event.author
-          event.author.username
-        end
+        event.author&.username
       end
     end
 
diff --git a/lib/gitlab/ci/config/entry/configurable.rb b/lib/gitlab/ci/config/entry/configurable.rb
index 833ae4a0ff3244a8c049e45ba854241ba4e4a380..e05aca9881b75a291e8247ebd5c89d93f8f02f83 100644
--- a/lib/gitlab/ci/config/entry/configurable.rb
+++ b/lib/gitlab/ci/config/entry/configurable.rb
@@ -58,7 +58,7 @@ module Gitlab
             def helpers(*nodes)
               nodes.each do |symbol|
                 define_method("#{symbol}_defined?") do
-                  @entries[symbol].specified? if @entries[symbol]
+                  @entries[symbol]&.specified?
                 end
 
                 define_method("#{symbol}_value") do
diff --git a/lib/gitlab/email/message/repository_push.rb b/lib/gitlab/email/message/repository_push.rb
index 0e3b65fceb4fe7b31ad1b9e9c6990ecc3e98d21e..6c69cd9e6a9b5be59139742a3e093d57eb2e3b9c 100644
--- a/lib/gitlab/email/message/repository_push.rb
+++ b/lib/gitlab/email/message/repository_push.rb
@@ -46,7 +46,7 @@ module Gitlab
         end
 
         def diffs_count
-          diffs.size if diffs
+          diffs&.size
         end
 
         def compare
@@ -58,7 +58,7 @@ module Gitlab
         end
 
         def compare_timeout
-          diffs.overflow? if diffs
+          diffs&.overflow?
         end
 
         def reverse_compare?
diff --git a/lib/gitlab/git/blob_snippet.rb b/lib/gitlab/git/blob_snippet.rb
index e98de57fc22b893d8203448fb927b50e3128d74f..d7975f88aaa663ad72278abf6587d00912c10c5d 100644
--- a/lib/gitlab/git/blob_snippet.rb
+++ b/lib/gitlab/git/blob_snippet.rb
@@ -13,7 +13,7 @@ module Gitlab
       end
 
       def data
-        lines.join("\n") if lines
+        lines&.join("\n")
       end
 
       def name
diff --git a/lib/gitlab/metrics.rb b/lib/gitlab/metrics.rb
index 3d1ba33ec68d69378450449758b211fe1b2a7509..857e0abf7109a55d86338af301888b0a2153a2a4 100644
--- a/lib/gitlab/metrics.rb
+++ b/lib/gitlab/metrics.rb
@@ -112,7 +112,7 @@ module Gitlab
     def self.tag_transaction(name, value)
       trans = current_transaction
 
-      trans.add_tag(name, value) if trans
+      trans&.add_tag(name, value)
     end
 
     # Sets the action of the current transaction (if any)
@@ -121,7 +121,7 @@ module Gitlab
     def self.action=(action)
       trans = current_transaction
 
-      trans.action = action if trans
+      trans&.action = action
     end
 
     # Tracks an event.
@@ -130,7 +130,7 @@ module Gitlab
     def self.add_event(*args)
       trans = current_transaction
 
-      trans.add_event(*args) if trans
+      trans&.add_event(*args)
     end
 
     # Returns the prefix to use for the name of a series.