lib/release_tools/metrics/auto_deploy_building_package_state.rb (88 lines of code) (raw):
# frozen_string_literal: true
module ReleaseTools
module Metrics
# This class is used to set the auto_deploy_building_package_state metric, which tracks packages that are newer than
# what is already present on gstg-cny.
class AutoDeployBuildingPackageState
include ::SemanticLogger::Loggable
METRIC = 'auto_deploy_building_package_state'
PACKAGE_PROJECTS = [ReleaseTools::Project::CNGImage, ReleaseTools::Project::OmnibusGitlab].freeze
def initialize
@client = Metrics::Client.new
end
def package_building
set_metric('running')
end
def package_built
set_metric('success')
unset_metric('running')
unset_metric('failed')
end
def package_building_failed
set_metric('failed')
unset_metric('running')
end
def deployment_completed
unset_metric('running')
unset_metric('success')
unset_metric('failed')
end
private
# rubocop:disable Naming/AccessorMethodName
def set_metric(state)
unless current_package_is_newer_than_gstg_cny?
logger.info('Not setting building_package_state metric since current package is not newer than on gstg-cny', state: state, current_version: product_version.version, version_on_gstg_cny: version_on_gstg_cny.version)
return
end
logger.info('Setting building_package_state metric', state: state, current_version: product_version.version, version_on_gstg_cny: version_on_gstg_cny.version)
@client.set(METRIC, 1, labels: state)
end
# rubocop:enable Naming/AccessorMethodName
def unset_metric(pipeline_state)
pipelines =
PACKAGE_PROJECTS.map do |project|
find_pipeline(project, version_on_gstg_cny, pipeline_state)
end
# Do not unset if there are pipelines in the given state
if pipelines.any?
logger.info('Not unsetting building_package_state metric since there are pipelines in the state', state: pipeline_state, current_version: product_version.version, version_on_gstg_cny: version_on_gstg_cny.version)
return
end
logger.info('Unsetting building_package_state metric since there are no pipelines in the state', state: pipeline_state, current_version: product_version.version, version_on_gstg_cny: version_on_gstg_cny.version)
@client.set(METRIC, 0, labels: pipeline_state)
end
def product_version
@product_version ||= ProductVersion.new(AutoDeploy::Tag.current)
end
def current_package_is_newer_than_gstg_cny?
product_version > version_on_gstg_cny
end
def version_on_gstg_cny
@version_on_gstg_cny ||= ProductVersion.from_metadata_sha(deployment_on_gstg_cny.sha)
end
# Returns a pipeline (with version newer than what's on gstg-cny) in the given state.
# Returns nil if no such pipeline can be found.
def find_pipeline(project, min_version, state)
pipeline =
Retriable.with_context(:api) do
GitlabDevClient.pipelines(
project,
name: 'AUTO_DEPLOY_BUILD_PIPELINE',
status: state,
per_page: 1
).first
end
return nil unless pipeline
# Return nil if the pipeline version is older than the one on gstg-cny
return nil if ProductVersion.from_auto_deploy_tag(pipeline.ref) <= min_version
logger.info('Found new package in desired state', state: state, current_version: product_version.version, version_on_gstg_cny: min_version.version, pipeline: pipeline.web_url)
pipeline
end
def deployment_on_gstg_cny
Retriable.with_context(:api) do
GitlabOpsClient.deployments(
Project::Release::Metadata,
'gstg-cny',
status: 'success',
order_by: 'id',
sort: 'desc',
opts: {
per_page: 1
}
).first
end
end
end
end
end