lib/release_tools/rollback/comparison.rb (63 lines of code) (raw):
# frozen_string_literal: true
module ReleaseTools
module Rollback
# Given a changeset comparison, determines if a rollback is possible
class Comparison
include ::SemanticLogger::Loggable
PROJECT = ReleaseTools::Project::GitlabEe.auto_deploy_path
# The currently running (or upcoming) AutoDeploy::Version
attr_reader :current
# The AutoDeploy::Version to which we want to rollback
attr_reader :target
# Rollback cannot be performed to auto-deploy packages older than this version.
attr_reader :minimum_version
attr_reader :environment
# current - ProductVersion which is currently running
# target - ProductVersion which we want to rollback to
def initialize(current:, target:, environment:)
@current = current
@target = target
@environment = environment
end
def execute
@compare = Retriable.with_context(:api) do
GitlabClient.compare(PROJECT, from: target_rails_sha, to: current_rails_sha)
end
@minimum_version = ReleaseTools::ProductVersion.from_metadata_sha(last_post_deploy_pipeline.sha)
logger.info(
'Rollback comparison',
safe: safe?,
web_url: web_url
)
self
end
def safe?
target >= minimum_version
end
def web_url
@compare.web_url
end
def current_package
@current.to_s
end
def current_rails_sha
@current[Project::GitlabEe.metadata_project_name].sha
end
def current_auto_deploy_package
@current.auto_deploy_package
end
def target_package
@target.to_s
end
def target_rails_sha
@target[Project::GitlabEe.metadata_project_name].sha
end
def target_auto_deploy_package
@target.auto_deploy_package
end
def metadata_comparison
Metadata::Comparison.new(source: @current, target: @target)
end
private
def last_post_deploy_pipeline
env = environment.split('-').first
Retriable.with_context(:api) do
GitlabOpsClient.last_successful_deployment(ReleaseTools::Project::Release::Metadata, "db/#{env}")
end
end
end
end
end