lib/release_tools/pipeline_tracer/job.rb (63 lines of code) (raw):
# frozen_string_literal: true
module ReleaseTools
module PipelineTracer
class Job
FINISHED_STATUSES = %w[success failed canceled].freeze
# Non bridge jobs that trigger downstream pipelines
TRIGGER_JOBS = %w[wait:cng wait:omnibus].freeze
VALID_ENVIRONMENTS = %w[gstg-cny gstg-ref gstg gprd-cny gprd].freeze
attr_reader :job, :client
delegate :started_at, :finished_at, :web_url, :status, :name, :id, :stage, :allow_failure, :queued_duration, to: :job
# @param [Gitlab::ObjectifiedHash] job
def initialize(job, client)
@job = job
@client = client
end
def trace
@trace ||=
Retriable.with_context(:api) do
client.job_trace(job.pipeline.project_id, job.id)
end
end
def triggered_pipeline_url
return @triggered_pipeline_url if defined?(@triggered_pipeline_url)
@triggered_pipeline_url = nil
return unless TRIGGER_JOBS.include?(job.name)
# wait:cng and wait:omnibus jobs
# Matches log lines of the form:
# Checking status of pipeline -- {pipeline: "https://dev.gitlab.org/gitlab/omnibus-gitlab/-/pipelines/361107"}
regex = /Checking status of pipeline -- {.*pipeline.*"(?<pipeline_url>.+)"}$/
if (match = trace.match(regex))
@triggered_pipeline_url = match[:pipeline_url]
end
@triggered_pipeline_url
end
def triggered_downstream_pipeline?
triggered_pipeline_url.present?
end
def completed?
FINISHED_STATUSES.include?(job.status)
end
def real_time_duration
job.duration
end
def environment_from_name
return @environment_from_name if defined?(@environment_from_name)
@environment_from_name = VALID_ENVIRONMENTS.detect { |env| job.name.include?(env) }
end
def name_without_environment
return job.name unless environment_from_name
job.name.sub(environment_from_name, '')
end
def root_attributes
{
job_name: job.name,
id: job.id,
web_url: job.web_url,
allow_failure: job.allow_failure,
user: job.user.username,
stage: job.stage,
started_at: job.started_at,
finished_at: job.finished_at,
status: job.status,
duration: job.duration,
queued_duration: job.queued_duration
}.stringify_keys
end
end
end
end