lib/release_tools/tasks/components/updater.rb (64 lines of code) (raw):
# frozen_string_literal: true
module ReleaseTools
module Tasks
module Components
module Updater
TARGET_PROJECT = Services::UpdateComponentService::TARGET_PROJECT
ENV_TOKEN = 'GITLAB_BOT_PRODUCTION_TOKEN'
# Attempt merge when MR is not_approved since the AutoMergeService approves the MR before calling the merge API.
MERGE_STATUS_CAN_ATTEMPT_MERGE = %w[mergeable unchecked not_approved].freeze
def initialize(token = nil)
# Approving the merge request can't be done by the author, so for
# approving and auto-merging we use a GitLab project token instead
# of the release-tools bot.
@gitlab_bot_token = token || ENV.fetch(ENV_TOKEN)
end
def execute
if !changed?
logger.info("#{project.metadata_project_name} already up to date")
elsif merge_request.exists?
logger.info('Found existing merge request', merge_request: merge_request.url, mwps: merge_request.merge_when_pipeline_succeeds?, merge_status: merge_request.detailed_merge_status)
return create_merge_request_and_set_auto_merge if !merge_request.merge_when_pipeline_succeeds? && attempt_merge?
notify_stale_merge_request if merge_request.notifiable?
else
logger.info("Creating merge request to update #{project.metadata_project_name}")
create_merge_request_and_set_auto_merge
end
end
def changed?
Services::UpdateComponentService.new(project, project.default_branch).changed?
end
def create_merge_request_and_set_auto_merge
ensure_source_branch_exists
create_or_show_merge_request(merge_request)
logger.info("Updating #{project.metadata_project_name} version")
commit = Services::UpdateComponentService
.new(project, source_branch, skip_ci: true)
.execute
Services::AutoMergeService.new(merge_request, token: @gitlab_bot_token, commit: commit).execute
end
def ensure_source_branch_exists
logger.info('Making sure source branch exists', source_branch: source_branch)
return if SharedStatus.dry_run?
GitlabClient.find_or_create_branch(source_branch, TARGET_PROJECT.default_branch, TARGET_PROJECT)
end
def notify_stale_merge_request
logger.warn('Existing merge request is stale, issuing warning')
return if SharedStatus.dry_run?
send_slack_notification
merge_request.mark_as_stale
end
def attempt_merge?
MERGE_STATUS_CAN_ATTEMPT_MERGE.include?(merge_request.detailed_merge_status)
end
def send_slack_notification
raise NotImplementedError
end
def project
raise NotImplementedError
end
def source_branch
raise NotImplementedError
end
def merge_request
raise NotImplementedError
end
end
end
end
end