debian-mirror-gitlab/app/services/projects/update_remote_mirror_service.rb

61 lines
1.8 KiB
Ruby
Raw Normal View History

2018-11-18 11:00:15 +05:30
# frozen_string_literal: true
2018-10-15 14:42:47 +05:30
module Projects
class UpdateRemoteMirrorService < BaseService
2019-10-12 21:52:04 +05:30
MAX_TRIES = 3
2018-10-15 14:42:47 +05:30
2019-10-12 21:52:04 +05:30
def execute(remote_mirror, tries)
2018-10-15 14:42:47 +05:30
return success unless remote_mirror.enabled?
2019-10-12 21:52:04 +05:30
update_mirror(remote_mirror)
2018-12-05 23:21:45 +05:30
2019-10-12 21:52:04 +05:30
success
rescue Gitlab::Git::CommandError => e
# This happens if one of the gitaly calls above fail, for example when
# branches have diverged, or the pre-receive hook fails.
retry_or_fail(remote_mirror, e.message, tries)
2018-10-15 14:42:47 +05:30
2019-10-12 21:52:04 +05:30
error(e.message)
rescue => e
remote_mirror.mark_as_failed!(e.message)
raise e
end
private
def update_mirror(remote_mirror)
remote_mirror.update_start!
remote_mirror.ensure_remote!
2020-06-23 00:09:42 +05:30
# https://gitlab.com/gitlab-org/gitaly/-/issues/2670
2020-07-28 23:09:34 +05:30
if Feature.disabled?(:gitaly_ruby_remote_branches_ls_remote, default_enabled: true)
2020-06-23 00:09:42 +05:30
repository.fetch_remote(remote_mirror.remote_name, ssh_auth: remote_mirror, no_tags: true)
end
2018-10-15 14:42:47 +05:30
2020-05-24 23:13:21 +05:30
response = remote_mirror.update_repository
2018-10-15 14:42:47 +05:30
2020-05-24 23:13:21 +05:30
if response.divergent_refs.any?
message = "Some refs have diverged and have not been updated on the remote:"
message += "\n\n#{response.divergent_refs.join("\n")}"
2019-10-12 21:52:04 +05:30
2020-05-24 23:13:21 +05:30
remote_mirror.mark_as_failed!(message)
else
remote_mirror.update_finish!
end
2019-10-12 21:52:04 +05:30
end
def retry_or_fail(mirror, message, tries)
if tries < MAX_TRIES
mirror.mark_for_retry!(message)
2018-10-15 14:42:47 +05:30
else
2019-10-12 21:52:04 +05:30
# It's not likely we'll be able to recover from this ourselves, so we'll
# notify the users of the problem, and don't trigger any sidekiq retries
# Instead, we'll wait for the next change to try the push again, or until
# a user manually retries.
mirror.mark_as_failed!(message)
2018-10-15 14:42:47 +05:30
end
end
end
end