2018-11-20 20:47:30 +05:30
# frozen_string_literal: true
2019-10-12 21:52:04 +05:30
require 'slack-notifier'
2018-11-20 20:47:30 +05:30
2017-08-17 22:00:37 +05:30
module ChatMessage
2016-09-29 09:46:39 +05:30
class PipelineMessage < BaseMessage
2019-10-12 21:52:04 +05:30
MAX_VISIBLE_JOBS = 10
attr_reader :user
2017-08-17 22:00:37 +05:30
attr_reader :ref_type
attr_reader :ref
attr_reader :status
2019-10-12 21:52:04 +05:30
attr_reader :detailed_status
2017-08-17 22:00:37 +05:30
attr_reader :duration
2019-10-12 21:52:04 +05:30
attr_reader :finished_at
2017-08-17 22:00:37 +05:30
attr_reader :pipeline_id
2019-10-12 21:52:04 +05:30
attr_reader :failed_stages
attr_reader :failed_jobs
attr_reader :project
attr_reader :commit
attr_reader :committer
attr_reader :pipeline
2016-09-29 09:46:39 +05:30
def initialize ( data )
2017-08-17 22:00:37 +05:30
super
2019-10-12 21:52:04 +05:30
@user = data [ :user ]
2018-03-17 18:26:18 +05:30
@user_name = data . dig ( :user , :username ) || 'API'
2017-08-17 22:00:37 +05:30
2016-09-29 09:46:39 +05:30
pipeline_attributes = data [ :object_attributes ]
@ref_type = pipeline_attributes [ :tag ] ? 'tag' : 'branch'
@ref = pipeline_attributes [ :ref ]
@status = pipeline_attributes [ :status ]
2019-10-12 21:52:04 +05:30
@detailed_status = pipeline_attributes [ :detailed_status ]
2017-08-17 22:00:37 +05:30
@duration = pipeline_attributes [ :duration ] . to_i
2019-10-12 21:52:04 +05:30
@finished_at = pipeline_attributes [ :finished_at ] ? Time . parse ( pipeline_attributes [ :finished_at ] ) . to_i : nil
2016-09-29 09:46:39 +05:30
@pipeline_id = pipeline_attributes [ :id ]
2019-10-12 21:52:04 +05:30
@failed_jobs = Array ( data [ :builds ] ) . select { | b | b [ :status ] == 'failed' } . reverse # Show failed jobs from oldest to newest
@failed_stages = @failed_jobs . map { | j | j [ :stage ] } . uniq
@project = Project . find ( data [ :project ] [ :id ] )
@commit = project . commit_by ( oid : data [ :commit ] [ :id ] )
@committer = commit . committer
@pipeline = Ci :: Pipeline . find ( pipeline_id )
2016-09-29 09:46:39 +05:30
end
def pretext
''
end
def attachments
2017-08-17 22:00:37 +05:30
return message if markdown
2019-10-12 21:52:04 +05:30
return [ { text : format ( message ) , color : attachment_color } ] unless fancy_notifications?
[ {
fallback : format ( message ) ,
color : attachment_color ,
author_name : user_combined_name ,
author_icon : user_avatar ,
author_link : author_url ,
title : s_ ( " ChatMessage|Pipeline # %{pipeline_id} %{humanized_status} in %{duration} " ) %
{
pipeline_id : pipeline_id ,
humanized_status : humanized_status ,
duration : pretty_duration ( duration )
} ,
title_link : pipeline_url ,
fields : attachments_fields ,
footer : project . name ,
footer_icon : project . avatar_url ( only_path : false ) ,
ts : finished_at
} ]
2016-09-29 09:46:39 +05:30
end
2017-08-17 22:00:37 +05:30
def activity
{
2019-10-12 21:52:04 +05:30
title : s_ ( " ChatMessage|Pipeline %{pipeline_link} of %{ref_type} %{branch_link} by %{user_combined_name} %{humanized_status} " ) %
{
pipeline_link : pipeline_link ,
ref_type : ref_type ,
branch_link : branch_link ,
user_combined_name : user_combined_name ,
humanized_status : humanized_status
} ,
subtitle : s_ ( " ChatMessage|in %{project_link} " ) % { project_link : project_link } ,
text : s_ ( " ChatMessage|in %{duration} " ) % { duration : pretty_duration ( duration ) } ,
2017-08-17 22:00:37 +05:30
image : user_avatar || ''
}
end
2016-09-29 09:46:39 +05:30
private
2019-10-12 21:52:04 +05:30
def fancy_notifications?
Feature . enabled? ( :fancy_pipeline_slack_notifications , default_enabled : true )
end
def failed_stages_field
{
title : s_ ( " ChatMessage|Failed stage " ) . pluralize ( failed_stages . length ) ,
value : Slack :: Notifier :: LinkFormatter . format ( failed_stages_links ) ,
short : true
}
end
def failed_jobs_field
{
title : s_ ( " ChatMessage|Failed job " ) . pluralize ( failed_jobs . length ) ,
value : Slack :: Notifier :: LinkFormatter . format ( failed_jobs_links ) ,
short : true
}
end
def yaml_error_field
{
title : s_ ( " ChatMessage|Invalid CI config YAML file " ) ,
value : pipeline . yaml_errors ,
short : false
}
end
def attachments_fields
fields = [
{
title : ref_type == " tag " ? s_ ( " ChatMessage|Tag " ) : s_ ( " ChatMessage|Branch " ) ,
value : Slack :: Notifier :: LinkFormatter . format ( ref_name_link ) ,
short : true
} ,
{
title : s_ ( " ChatMessage|Commit " ) ,
value : Slack :: Notifier :: LinkFormatter . format ( commit_link ) ,
short : true
}
]
fields << failed_stages_field if failed_stages . any?
fields << failed_jobs_field if failed_jobs . any?
fields << yaml_error_field if pipeline . has_yaml_errors?
fields
end
2016-09-29 09:46:39 +05:30
def message
2019-10-12 21:52:04 +05:30
s_ ( " ChatMessage|%{project_link}: Pipeline %{pipeline_link} of %{ref_type} %{branch_link} by %{user_combined_name} %{humanized_status} in %{duration} " ) %
{
project_link : project_link ,
pipeline_link : pipeline_link ,
ref_type : ref_type ,
branch_link : branch_link ,
user_combined_name : user_combined_name ,
humanized_status : humanized_status ,
duration : pretty_duration ( duration )
}
2016-09-29 09:46:39 +05:30
end
def humanized_status
2019-10-12 21:52:04 +05:30
if fancy_notifications?
case status
when 'success'
detailed_status == " passed with warnings " ? s_ ( " ChatMessage|has passed with warnings " ) : s_ ( " ChatMessage|has passed " )
when 'failed'
s_ ( " ChatMessage|has failed " )
else
status
end
2016-09-29 09:46:39 +05:30
else
2019-10-12 21:52:04 +05:30
case status
when 'success'
s_ ( " ChatMessage|passed " )
when 'failed'
s_ ( " ChatMessage|failed " )
else
status
end
2016-09-29 09:46:39 +05:30
end
end
def attachment_color
2019-10-12 21:52:04 +05:30
if fancy_notifications?
case status
when 'success'
detailed_status == 'passed with warnings' ? 'warning' : 'good'
else
'danger'
end
2016-09-29 09:46:39 +05:30
else
2019-10-12 21:52:04 +05:30
case status
when 'success'
'good'
else
'danger'
end
2016-09-29 09:46:39 +05:30
end
end
def branch_url
" #{ project_url } /commits/ #{ ref } "
end
def branch_link
" [ #{ ref } ]( #{ branch_url } ) "
end
2019-10-12 21:52:04 +05:30
def project_url
project . web_url
end
2016-09-29 09:46:39 +05:30
def project_link
2019-10-12 21:52:04 +05:30
" [ #{ project . name } ]( #{ project_url } ) "
end
def pipeline_failed_jobs_url
" #{ project_url } /pipelines/ #{ pipeline_id } /failures "
2016-09-29 09:46:39 +05:30
end
def pipeline_url
2019-10-12 21:52:04 +05:30
if fancy_notifications? && failed_jobs . any?
pipeline_failed_jobs_url
else
" #{ project_url } /pipelines/ #{ pipeline_id } "
end
2016-09-29 09:46:39 +05:30
end
def pipeline_link
2017-08-17 22:00:37 +05:30
" [ # #{ pipeline_id } ]( #{ pipeline_url } ) "
2016-09-29 09:46:39 +05:30
end
2019-10-12 21:52:04 +05:30
def job_url ( job )
" #{ project_url } /-/jobs/ #{ job [ :id ] } "
end
def job_link ( job )
" [ #{ job [ :name ] } ]( #{ job_url ( job ) } ) "
end
def failed_jobs_links
failed = failed_jobs . slice ( 0 , MAX_VISIBLE_JOBS )
truncated = failed_jobs . slice ( MAX_VISIBLE_JOBS , failed_jobs . size )
failed_links = failed . map { | job | job_link ( job ) }
unless truncated . blank?
failed_links << s_ ( " ChatMessage|and [%{count} more](%{pipeline_failed_jobs_url}) " ) % {
count : truncated . size ,
pipeline_failed_jobs_url : pipeline_failed_jobs_url
}
end
failed_links . join ( I18n . translate ( :'support.array.words_connector' ) )
end
def stage_link ( stage )
# All stages link to the pipeline page
" [ #{ stage } ]( #{ pipeline_url } ) "
end
def failed_stages_links
failed_stages . map { | s | stage_link ( s ) } . join ( I18n . translate ( :'support.array.words_connector' ) )
end
def commit_url
Gitlab :: UrlBuilder . build ( commit )
end
def commit_link
" [ #{ commit . title } ]( #{ commit_url } ) "
end
def commits_page_url
" #{ project_url } /commits/ #{ ref } "
end
def ref_name_link
" [ #{ ref } ]( #{ commits_page_url } ) "
end
def author_url
return unless user && committer
Gitlab :: UrlBuilder . build ( committer )
end
2016-09-29 09:46:39 +05:30
end
end