diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb
index 63a4a075f8e7d160b32ea23febec64450110c2b4..89b0cae25ed2f24ef2a077a1df385e05967eaf22 100644
--- a/app/models/ci/build.rb
+++ b/app/models/ci/build.rb
@@ -134,7 +134,8 @@ module Ci
     end
 
     def retryable?
-      project.builds_enabled? && commands.present? && complete?
+      project.builds_enabled? && commands.present? &&
+        (success? || failed?)
     end
 
     def retried?
diff --git a/spec/models/build_spec.rb b/spec/models/build_spec.rb
index d4970e38f7ca1ce6ddff1ae5d5dc17d22935734a..2b678355ee5d526ac6b6effea01d553dfae57ed7 100644
--- a/spec/models/build_spec.rb
+++ b/spec/models/build_spec.rb
@@ -900,20 +900,42 @@ describe Ci::Build, models: true do
   end
 
   describe '#retryable?' do
-    context 'when build is running' do
-      before do
-        build.run!
+    subject { build }
+
+    context 'when build is retryable' do
+      context 'when build is successful' do
+        before do
+          build.success!
+        end
+
+        it { is_expected.to be_retryable }
       end
 
-      it { expect(build).not_to be_retryable }
+      context 'when build is failed' do
+        before do
+          build.drop!
+        end
+
+        it { is_expected.to be_retryable }
+      end
     end
 
-    context 'when build is finished' do
-      before do
-        build.success!
+    context 'when build is not retryable' do
+      context 'when build is running' do
+        before do
+          build.run!
+        end
+
+        it { is_expected.not_to be_retryable }
       end
 
-      it { expect(build).to be_retryable }
+      context 'when build is skipped' do
+        before do
+          build.skip!
+        end
+
+        it { is_expected.not_to be_retryable }
+      end
     end
   end