gitlab_quality-test_tooling 1.8.1 → 1.9.0
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d7c32e6b11eb72bf1f453827d3c8c0dd98a8d37788c22000566fac4fe9b0daab
|
4
|
+
data.tar.gz: 573ea110d2d1bea41f217f135f6dfe57a814ecc261142813e4dbbda17f813e0e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b7f5b809cd506c860edba93bc45c932183106da000b2eb14ae7149aa5d7a820502971fd5a26747664be1921334af3b1041a668fb128f8b4c739507ac63f850f2
|
7
|
+
data.tar.gz: 1a428ce49770515622c810bfaf2e918df2223b7ed23f38958d994de6bef4c591c5fd10efc7be071d1fdf6cde38eacc8598126b612fde62c300a01c0e9608c83a
|
data/Gemfile.lock
CHANGED
data/exe/post-to-slack
CHANGED
@@ -8,6 +8,9 @@ require_relative "../lib/gitlab_quality/test_tooling"
|
|
8
8
|
|
9
9
|
params = {}
|
10
10
|
|
11
|
+
messages = []
|
12
|
+
gitlab_api_token = nil
|
13
|
+
|
11
14
|
options = OptionParser.new do |opts|
|
12
15
|
opts.banner = "Usage: #{$PROGRAM_NAME} [options]"
|
13
16
|
|
@@ -15,16 +18,34 @@ options = OptionParser.new do |opts|
|
|
15
18
|
params[:slack_webhook_url] = slack_webhook_url
|
16
19
|
end
|
17
20
|
|
21
|
+
opts.on('-a', '--gitlab-api-token TOKEN', String, 'GitLab API token') do |token|
|
22
|
+
gitlab_api_token = token unless token.empty?
|
23
|
+
end
|
24
|
+
|
18
25
|
opts.on('-c', '--channel CHANNEL', String, 'Slack channel to post the message to') do |channel|
|
19
26
|
params[:channel] = channel
|
20
27
|
end
|
21
28
|
|
22
29
|
opts.on('-m', '--message MESSAGE', String, 'Post message to Slack') do |message|
|
23
|
-
|
30
|
+
messages << message
|
24
31
|
end
|
25
32
|
|
26
33
|
opts.on('-t', '--include-summary-table FILES', String, 'Add a test summary table based on RSpec report files (JUnit XML)') do |files|
|
27
|
-
|
34
|
+
messages << GitlabQuality::TestTooling::SummaryTable.create(input_files: files)
|
35
|
+
end
|
36
|
+
|
37
|
+
opts.on('-j', '--include-failed-jobs-table', 'Add a list of failed jobs in the pipeline') do
|
38
|
+
next puts("Failed jobs table requires api token to be set via --gitlab-api-token option, skipping failed jobs table") unless gitlab_api_token
|
39
|
+
|
40
|
+
project_id = ENV['CI_PROJECT_ID']&.to_i || (next puts("CI_PROJECT_ID not set, skipping failed jobs table"))
|
41
|
+
pipeline_id = ENV['CI_PIPELINE_ID']&.to_i || (next puts("CI_PIPELINE_ID not set, skipping failed jobs table"))
|
42
|
+
|
43
|
+
jobs = GitlabQuality::TestTooling::GitlabClient::FailedJobs.new(token: gitlab_api_token, project_id: project_id, pipeline_id: pipeline_id).fetch
|
44
|
+
next if jobs.empty?
|
45
|
+
|
46
|
+
messages << GitlabQuality::TestTooling::FailedJobsTable.create(jobs: jobs)
|
47
|
+
rescue StandardError => e
|
48
|
+
puts "Failed to fetch failed jobs. #{e.class}: #{e.message}"
|
28
49
|
end
|
29
50
|
|
30
51
|
opts.on('-u', '--username USERNAME', String, 'Username to use for the Slack message') do |username|
|
@@ -50,6 +71,8 @@ options = OptionParser.new do |opts|
|
|
50
71
|
opts.parse(ARGV)
|
51
72
|
end
|
52
73
|
|
74
|
+
params[:message] = messages.join("\n\n")
|
75
|
+
|
53
76
|
if params.any?
|
54
77
|
GitlabQuality::TestTooling::Slack::PostToSlack.new(**params).invoke!
|
55
78
|
else
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'table_print'
|
4
|
+
|
5
|
+
module GitlabQuality
|
6
|
+
module TestTooling
|
7
|
+
module FailedJobsTable
|
8
|
+
class << self
|
9
|
+
# Create table with formatted list of failed jobs
|
10
|
+
#
|
11
|
+
# @param [Array<Gitlab::ObjectifiedHash>] jobs
|
12
|
+
# @return [String]
|
13
|
+
def create(jobs:)
|
14
|
+
"```\n#{TablePrint::Printer.table_print(collect_results(jobs))}\n```\n"
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
# Format list of failed jobs
|
20
|
+
#
|
21
|
+
# @param [Array<Gitlab::ObjectifiedHash>] jobs
|
22
|
+
# @return [Array]
|
23
|
+
def collect_results(jobs)
|
24
|
+
jobs.sort_by(&:stage).map do |job|
|
25
|
+
{
|
26
|
+
"Job" => job.name,
|
27
|
+
"Stage" => job.stage,
|
28
|
+
"Failure Reason" => job.failure_reason
|
29
|
+
}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'gitlab'
|
4
|
+
|
5
|
+
module GitlabQuality
|
6
|
+
module TestTooling
|
7
|
+
module GitlabClient
|
8
|
+
class FailedJobs
|
9
|
+
def initialize(token:, project_id:, pipeline_id:)
|
10
|
+
@token = token
|
11
|
+
@project_id = project_id
|
12
|
+
@pipeline_id = pipeline_id
|
13
|
+
end
|
14
|
+
|
15
|
+
def fetch
|
16
|
+
client.pipeline_jobs(project_id, pipeline_id, scope: 'failed')
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
attr_reader :token, :project_id, :pipeline_id
|
22
|
+
|
23
|
+
def client
|
24
|
+
@client ||= Gitlab.client(
|
25
|
+
endpoint: Runtime::Env.gitlab_api_base,
|
26
|
+
private_token: token
|
27
|
+
)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gitlab_quality-test_tooling
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GitLab Quality
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-12-
|
11
|
+
date: 2023-12-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: climate_control
|
@@ -383,6 +383,8 @@ files:
|
|
383
383
|
- exe/update-screenshot-paths
|
384
384
|
- lefthook.yml
|
385
385
|
- lib/gitlab_quality/test_tooling.rb
|
386
|
+
- lib/gitlab_quality/test_tooling/failed_jobs_table.rb
|
387
|
+
- lib/gitlab_quality/test_tooling/gitlab_client/failed_jobs.rb
|
386
388
|
- lib/gitlab_quality/test_tooling/gitlab_client/merge_request.rb
|
387
389
|
- lib/gitlab_quality/test_tooling/gitlab_client/merge_request_dry_client.rb
|
388
390
|
- lib/gitlab_quality/test_tooling/gitlab_issue_client.rb
|