lib/release_tools/services/packages_status/base.rb (100 lines of code) (raw):
# frozen_string_literal: true
module ReleaseTools
module Services
module PackagesStatus
class Base
include ::SemanticLogger::Loggable
# version - ReleaseTools::Version
# package_type - :tag, :internal
def initialize(version, package_type: :tag)
@version = version
@results = {}
@package_type = package_type
end
def execute
pipelines.each do |pipeline|
bridge = bridge_for(pipeline: pipeline)
raise "No bridge job found for version #{version}, url: #{pipeline.web_url}, package_type: #{package_type}" unless bridge
raise "No downstream pipeline created for version #{version}, url: #{pipeline.web_url}, package_type: #{package_type}" unless bridge.downstream_pipeline
downstream_pipeline = downstream_pipeline(id: bridge.downstream_pipeline.id)
store_status(downstream_pipeline)
end
@results
end
private
attr_reader :version, :package_type
def internal?
package_type == :internal
end
def branch
version.stable_branch
end
def bridge_job_name
NotImplementedError
end
def project
ReleaseTools::Project::OmnibusGitlab
end
def client
ReleaseTools::GitlabDevClient
end
def tags
[
"#{version}+ee.0",
"#{version}+ce.0"
]
end
def pipelines
if internal?
[fetch_tagless_pipeline]
else
fetch_pipeline_by_tags
end
end
def fetch_pipeline_by_tags
[].tap do |pipeline|
tags.each do |tag|
logger.info('Fetching pipelines for tag', tag: tag)
pipeline << pipelines_for_tag(tag)
end
end.flatten
end
def fetch_tagless_pipeline
logger.info('Fetching pipeline for branch', branch: branch)
Retriable.with_context(:api) do
client
.pipelines(project, ref: branch)
.select { |pipeline| pipeline.name == 'INTERNAL_RELEASE_BUILD_PIPELINE' }
.max_by(&:created_at)
end
end
def pipelines_for_tag(tag)
Retriable.with_context(:api) do
client
.pipelines(project, ref: tag)
end
end
def downstream_pipeline(id:)
Retriable.with_context(:api) do
client
.pipeline(project, id)
end
end
def bridge_for(pipeline:)
logger.info('Fetching bridge', pipeline: pipeline.web_url)
Retriable.with_context(:api) do
client
.pipeline_bridges(project, pipeline.id).find { |bridge| bridge.name == bridge_job_name }
end
end
def store_status(downstream_pipeline)
tag = downstream_pipeline.ref
logger.info(
"Downstream pipeline retrieved successfully for the tag: #{tag}",
downstream_pipeline: downstream_pipeline.web_url,
job_id: downstream_pipeline.id,
status: downstream_pipeline.status
)
@results[tag] = downstream_pipeline.status
end
end
end
end
end