diff --git a/ee/lib/gitlab/checks/secret_push_protection/secrets_check.rb b/ee/lib/gitlab/checks/secret_push_protection/secrets_check.rb index ee178133e3ae142cd5193ae84c9d56f08baba977..e17f87289c5d250eb2f4b68ad9a397bd3ca5482c 100644 --- a/ee/lib/gitlab/checks/secret_push_protection/secrets_check.rb +++ b/ee/lib/gitlab/checks/secret_push_protection/secrets_check.rb @@ -19,6 +19,18 @@ class SecretsCheck < ::Gitlab::Checks::BaseBulkChecker def validate! run_validation_dark_launch! if should_run_dark_launch? run_validation! + rescue ::Gitlab::GitAccess::ForbiddenError + raise + rescue StandardError => e + ::Gitlab::ErrorTracking.track_exception(e) + # Log the error but don't re-raise to prevent blocking pushes + secret_detection_logger.error( + build_structured_payload( + message: "Secret push protection failed: #{e.message}", + class: self.class.name, + error_class: e.class.name + ) + ) end private diff --git a/ee/spec/lib/gitlab/checks/secret_push_protection/secrets_check_spec.rb b/ee/spec/lib/gitlab/checks/secret_push_protection/secrets_check_spec.rb index 47851b2e3edf6c57de6329fd706bc5a3e1b589c7..fca91548167fb72b0df4dba74144c0f5daae47e3 100644 --- a/ee/spec/lib/gitlab/checks/secret_push_protection/secrets_check_spec.rb +++ b/ee/spec/lib/gitlab/checks/secret_push_protection/secrets_check_spec.rb @@ -14,6 +14,34 @@ end describe '#validate!' do + context 'when an unhandled exception is thrown' do + it 'catches and logs the exception' do + exception_scenarios = [ + StandardError.new('Standard error'), + RuntimeError.new('Runtime error'), + ArgumentError.new('Argument error'), + NoMethodError.new('No method error'), + ::GRPC::Unavailable.new('Service unavailable'), + ThreadError.new('Thread error') + ] + + exception_scenarios.each do |exception| + allow(secrets_check).to receive(:run_validation!).and_raise(exception) + + expect(::Gitlab::ErrorTracking).to receive(:track_exception).with(exception) + + expected_payload = { + 'message' => "Secret push protection failed: #{exception.message}", + 'class' => 'Gitlab::Checks::SecretPushProtection::SecretsCheck', + 'error_class' => anything + } + expect(secret_detection_logger).to receive(:error).with(expected_payload) + + expect { secrets_check.validate! }.not_to raise_error + end + end + end + context 'when secret_detection_enable_spp_for_public_projects is disabled' do before do stub_feature_flags(secret_detection_enable_spp_for_public_projects: false) diff --git a/ee/spec/support/shared_contexts/secrets_check_shared_contexts.rb b/ee/spec/support/shared_contexts/secrets_check_shared_contexts.rb index 19e2a26c88765d4422fc4884107df73b621e161e..0490573f1336fdec1b9d79cb4f71b31a44358a5b 100644 --- a/ee/spec/support/shared_contexts/secrets_check_shared_contexts.rb +++ b/ee/spec/support/shared_contexts/secrets_check_shared_contexts.rb @@ -159,22 +159,6 @@ ) end - # Used for mocking calls to `tree_entries` methods. - let(:gitaly_pagination_cursor) { Gitaly::PaginationCursor.new(next_cursor: "") } - let(:tree_entries) do - [ - Gitlab::Git::Tree.new( - id: new_blob_reference, - type: :blob, - mode: '100644', - name: '.env', - path: '.env', - flat_path: '.env', - commit_id: new_commit - ) - ] - end - # Used for mocking calls to logger. let(:secret_detection_logger) { instance_double(::Gitlab::SecretDetectionLogger) } diff --git a/ee/spec/support/shared_examples/lib/gitlab/secrets_check_shared_examples.rb b/ee/spec/support/shared_examples/lib/gitlab/secrets_check_shared_examples.rb index ce7da2cc8fdd75920eb15e2fc9b1a97332983358..b03d1196de72c5ca1874055074fbab8090ecbb28 100644 --- a/ee/spec/support/shared_examples/lib/gitlab/secrets_check_shared_examples.rb +++ b/ee/spec/support/shared_examples/lib/gitlab/secrets_check_shared_examples.rb @@ -252,7 +252,6 @@ exclusions: kind_of(Hash) ) .once - .and_return(passed_scan_response) .and_call_original end @@ -870,19 +869,16 @@ expect(::Gitlab::Git::Tree).to receive(:tree_entries) .with(**expected_tree_args.merge(sha: new_commit)) .once - .and_return([tree_entries, gitaly_pagination_cursor]) .and_call_original expect(::Gitlab::Git::Tree).to receive(:tree_entries) .with(**expected_tree_args.merge(sha: timed_out_commit)) .once - .and_return([[], nil]) .and_call_original expect(::Gitlab::Git::Tree).to receive(:tree_entries) .with(**expected_tree_args.merge(sha: failed_to_scan_commit)) .once - .and_return([[], nil]) .and_call_original expect { subject.validate! }.to raise_error do |error|