allure-report-publisher 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 1362930b746c980e6cc2130d5a304c1be870a6e79658df5143bda833035773a8
4
+ data.tar.gz: e23baf8887d7acee4dd919e0e4b71282c6e462476cf0ddd037a6c82d7248a290
5
+ SHA512:
6
+ metadata.gz: 2574999aa80c7d2eb499da7f65e8bc42c3f917331d4c10d014d49f04d75f77e0d0c6d4ada2944eb988bb3f70dc7ebac199200e76bc4be86a723381b4624d23a3
7
+ data.tar.gz: 28dd428d4fe4d9e52ab381f039772293317d0c667f9580388dd74886dddfaf3fda11b55bd59fcf65e1d6040805bdadeb2ed9118c96e252e7875f2259e7984e90
data/README.md ADDED
@@ -0,0 +1,55 @@
1
+ [![Maintainability](https://api.codeclimate.com/v1/badges/210eaa4f74588fb08313/maintainability)](https://codeclimate.com/github/andrcuns/allure-report-publisher/maintainability)
2
+ [![Test Coverage](https://api.codeclimate.com/v1/badges/210eaa4f74588fb08313/test_coverage)](https://codeclimate.com/github/andrcuns/allure-report-publisher/test_coverage)
3
+
4
+ # allure-report-uploader
5
+
6
+ Upload your report to a file storage of your choice.
7
+
8
+ ## Installation
9
+
10
+ ```bash
11
+ gem install allure-report-uploader
12
+ ```
13
+
14
+ ## Usage
15
+
16
+ ### AWS S3
17
+
18
+ ```shell
19
+ $ allure-report-publisher upload s3 --help
20
+ Command:
21
+ allure-report-publisher upload s3
22
+
23
+ Usage:
24
+ allure-report-publisher upload s3
25
+
26
+ Description:
27
+ Generate and upload allure report
28
+
29
+ Options:
30
+ --result-files-glob=VALUE # Allure results files glob. Required: true
31
+ --bucket=VALUE # Bucket name. Required: true
32
+ --project=VALUE # Project name for multiple reports inside single bucket. Required: false
33
+ --help, -h # Print this help
34
+
35
+ Examples:
36
+ allure-report-publisher upload s3 --result-files-glob='path/to/allure-result/**/*' --bucket=my-bucket
37
+ ```
38
+
39
+ ## Development
40
+
41
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
42
+
43
+ To install this gem onto your local machine, run `bundle exec rake install`.
44
+
45
+ ## Contributing
46
+
47
+ Bug reports and pull requests are welcome on GitHub at <https://github.com/andrcuns/allure-report-uploader>. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/allure-report-uploader/blob/main/CODE_OF_CONDUCT.md).
48
+
49
+ ## License
50
+
51
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
52
+
53
+ ## Code of Conduct
54
+
55
+ Everyone interacting in the Allure::Report::Uploader project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/allure-report-uploader/blob/main/CODE_OF_CONDUCT.md).
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift(File.expand_path("../lib", __dir__))
4
+
5
+ require "allure_report_publisher"
6
+
7
+ Dry::CLI.new(Publisher::Commands).call
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "require_all"
4
+ require "parallel"
5
+ require "dry/cli"
6
+
7
+ require_rel "allure_report_publisher/helpers"
8
+ require_rel "allure_report_publisher/**/*.rb"
9
+
10
+ module Publisher
11
+ # CLI commands
12
+ #
13
+ module Commands
14
+ extend Dry::CLI::Registry
15
+
16
+ register "version", Version, aliases: ["-v", "--version"]
17
+
18
+ register "upload" do |prefix|
19
+ prefix.register "s3", UploadS3
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,41 @@
1
+ module Publisher
2
+ module Commands
3
+ # Upload allure report
4
+ #
5
+ class UploadS3 < Dry::CLI::Command
6
+ include Helpers
7
+
8
+ desc "Generate and upload allure report"
9
+
10
+ option :result_files_glob, desc: "Allure results files glob. Required: true"
11
+ option :bucket, desc: "Bucket name. Required: true"
12
+ option :project, desc: "Project name for multiple reports inside single bucket. Required: false"
13
+
14
+ example [
15
+ "--result-files-glob='path/to/allure-result/**/*' --bucket=my-bucket",
16
+ "--result-files-glob='path/to/allure-result/**/*' --bucket=my-bucket --project=my-project"
17
+ ]
18
+
19
+ def call(**args)
20
+ validate_args(args)
21
+
22
+ Uploaders::S3.new(
23
+ args[:result_files_glob],
24
+ args[:bucket],
25
+ args[:project]
26
+ ).execute
27
+ end
28
+
29
+ private
30
+
31
+ # Validate required args
32
+ #
33
+ # @param [Hash] args
34
+ # @return [void]
35
+ def validate_args(args)
36
+ error("Missing argument --result-files-glob!") unless args[:result_files_glob]
37
+ error("Missing argument --bucket!") unless args[:bucket]
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,13 @@
1
+ module Publisher
2
+ module Commands
3
+ # Print version number
4
+ #
5
+ class Version < Dry::CLI::Command
6
+ desc "Print version"
7
+
8
+ def call(*)
9
+ puts Publisher::VERSION
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,76 @@
1
+ require "tty-spinner"
2
+ require "pastel"
3
+ require "open3"
4
+
5
+ module Publisher
6
+ # General helpers
7
+ #
8
+ module Helpers
9
+ # Colorize string
10
+ #
11
+ # @param [String] message
12
+ # @param [Symbol] color
13
+ # @return [String]
14
+ def colorize(message, color)
15
+ Pastel.new.decorate(message, color)
16
+ end
17
+
18
+ # Log message to stdout
19
+ #
20
+ # @param [String] message
21
+ # @param [String] color
22
+ # @return [void]
23
+ def log(message, color = :magenta)
24
+ puts colorize(message, color)
25
+ end
26
+
27
+ # Print error message and exit
28
+ #
29
+ # @param [String] message
30
+ # @return [void]
31
+ def error(message)
32
+ puts colorize(message, :red)
33
+ exit(1)
34
+ end
35
+
36
+ # Safe join path
37
+ #
38
+ # @param [Array<String>] *args
39
+ # @return [String]
40
+ def path(*args)
41
+ File.join(args).to_s
42
+ end
43
+
44
+ # Execute code inside spinner
45
+ #
46
+ # @param [String] message
47
+ # @param [Boolean] auto_debrief
48
+ # @param [String] done_message
49
+ # @return [Boolean]
50
+ def spin(message, done_message: "done")
51
+ spinner = TTY::Spinner.new(
52
+ "[:spinner] #{message} ...",
53
+ format: :dots,
54
+ success_mark: colorize(TTY::Spinner::TICK, :green),
55
+ error_mark: colorize(TTY::Spinner::CROSS, :red)
56
+ )
57
+ spinner.auto_spin
58
+ yield
59
+ spinner.success(done_message)
60
+ rescue StandardError => e
61
+ spinner.error(colorize(e.message, :red))
62
+ exit(1)
63
+ end
64
+
65
+ # Execute shell command
66
+ #
67
+ # @param [String] command
68
+ # @return [String] output
69
+ def execute_shell(command)
70
+ out, err, status = Open3.capture3(command)
71
+ raise("Out:\n#{out}\n\nErr:\n#{err}") unless status.success?
72
+
73
+ out
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,54 @@
1
+ require "open3"
2
+
3
+ module Publisher
4
+ class AllureError < StandardError; end
5
+
6
+ class NoAllureResultsError < StandardError; end
7
+
8
+ # Allure report generator
9
+ #
10
+ class ReportGenerator
11
+ include Helpers
12
+
13
+ def initialize(results_glob, results_dir, report_dir)
14
+ @results_glob = results_glob
15
+ @results_dir = results_dir
16
+ @report_dir = report_dir
17
+ end
18
+
19
+ # Generate allure report
20
+ #
21
+ # @return [void]
22
+ def generate
23
+ log("\nGenerating allure report")
24
+ spin("generating report") do
25
+ aggregate_results
26
+ generate_report
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ attr_reader :results_glob, :results_dir, :report_dir
33
+
34
+ # Copy all results files to results directory
35
+ #
36
+ # @return [void]
37
+ def aggregate_results
38
+ results = Dir.glob(results_glob)
39
+ error("Missing allure results") if results.empty?
40
+
41
+ FileUtils.cp(results, results_dir)
42
+ end
43
+
44
+ # Generate allure report
45
+ #
46
+ # @return [void]
47
+ def generate_report
48
+ out, _err, status = Open3.capture3(
49
+ "allure generate --clean --output #{report_dir} #{results_dir}"
50
+ )
51
+ error(out) unless status.success?
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,98 @@
1
+ module Publisher
2
+ module Uploaders
3
+ # Uploader implementation
4
+ #
5
+ class Uploader
6
+ include Helpers
7
+
8
+ HISTORY = [
9
+ "categories-trend.json",
10
+ "duration-trend.json",
11
+ "history-trend.json",
12
+ "history.json",
13
+ "retry-trend.json"
14
+ ].freeze
15
+
16
+ def initialize(results_glob, bucket, project = nil)
17
+ @results_glob = results_glob
18
+ @bucket = bucket
19
+ @project = project
20
+ end
21
+
22
+ # Execute allure report generation and upload
23
+ #
24
+ # @return [void]
25
+ def execute
26
+ raise(StandardError, "Not Implemented!")
27
+ end
28
+
29
+ private
30
+
31
+ attr_reader :results_glob, :bucket, :project
32
+
33
+ # Report url
34
+ #
35
+ # @return [String]
36
+ def report_url
37
+ raise(StandardError, "Not Implemented!")
38
+ end
39
+
40
+ # Fetch allure report history
41
+ #
42
+ # @return [void]
43
+ def create_history_dir
44
+ FileUtils.mkdir_p(path(results_dir, "history"))
45
+ end
46
+
47
+ # Report path prefix
48
+ #
49
+ # @return [String]
50
+ def prefix
51
+ @prefix ||= [project, run_id].compact.yield_self do |pre|
52
+ break if pre.empty?
53
+
54
+ pre.join("/")
55
+ end
56
+ end
57
+
58
+ # Run ID
59
+ #
60
+ # @return [String]
61
+ def run_id
62
+ @run_id ||= ENV["RUN_ID"]
63
+ end
64
+
65
+ # Aggregated results directory
66
+ #
67
+ # @return [String]
68
+ def results_dir
69
+ @results_dir ||= Dir.mktmpdir("allure-results")
70
+ end
71
+
72
+ # Allure report directory
73
+ #
74
+ # @return [String]
75
+ def report_dir
76
+ @report_dir ||= Dir.mktmpdir("allure-report")
77
+ end
78
+
79
+ # Report files
80
+ #
81
+ # @return [Array<Pathname>]
82
+ def report_files
83
+ @report_files ||= Pathname
84
+ .glob("#{report_dir}/**/*")
85
+ .reject(&:directory?)
86
+ end
87
+
88
+ # Generate allure report
89
+ #
90
+ # @return [void]
91
+ def generate_report
92
+ fetch_history if run_id
93
+
94
+ ReportGenerator.new(results_glob, results_dir, report_dir).generate
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,96 @@
1
+ require "aws-sdk-s3"
2
+
3
+ module Publisher
4
+ module Uploaders
5
+ # Report upload to AWS S3 bucket
6
+ #
7
+ class S3 < Uploader
8
+ def execute
9
+ generate_report
10
+ upload_history_and_report
11
+ end
12
+
13
+ private
14
+
15
+ # S3 client
16
+ #
17
+ # @return [Aws::S3::Client]
18
+ def s3
19
+ @s3 ||= Aws::S3::Client.new
20
+ end
21
+
22
+ # Report url
23
+ #
24
+ # @return [String]
25
+ def report_url
26
+ @report_url ||= ["http://#{bucket}.s3.amazonaws.com", prefix, "index.html"].compact.join("/")
27
+ end
28
+
29
+ # Fetch allure history
30
+ #
31
+ # @return [void]
32
+ def fetch_history
33
+ log("Fetching allure history")
34
+ spin("fetching history") do
35
+ create_history_dir
36
+ HISTORY.each do |file|
37
+ s3.get_object(
38
+ response_target: path(results_dir, "history", file),
39
+ key: key(project, "history", file),
40
+ bucket: bucket
41
+ )
42
+ end
43
+ end
44
+ end
45
+
46
+ # Upload report to s3
47
+ #
48
+ # @return [void]
49
+ def upload_history_and_report
50
+ log("\nUploading report to s3")
51
+ spin("uploading report", done_message: "done. #{report_url}") do
52
+ upload_history
53
+ upload_report
54
+ end
55
+ end
56
+
57
+ # Upload allure history
58
+ #
59
+ # @return [void]
60
+ def upload_history
61
+ return unless run_id
62
+
63
+ upload_to_s3(report_files.select { |file| file.fnmatch?("*/history/*") }, project)
64
+ end
65
+
66
+ def upload_report
67
+ upload_to_s3(report_files)
68
+ end
69
+
70
+ # Upload files to s3
71
+ #
72
+ # @param [Array<Pathname>] files
73
+ # @param [String] key_prefix
74
+ # @return [Array<Hash>]
75
+ def upload_to_s3(files, key_prefix = prefix)
76
+ args = files.map do |file|
77
+ {
78
+ body: File.new(file),
79
+ bucket: bucket,
80
+ key: key(key_prefix, file.relative_path_from(report_dir))
81
+ }
82
+ end
83
+
84
+ Parallel.each(args, in_threads: 8) { |obj| s3.put_object(obj) }
85
+ end
86
+
87
+ # Fabricate key for s3 object
88
+ #
89
+ # @param [String] *args
90
+ # @return [String]
91
+ def key(*args)
92
+ args.compact.join("/")
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Publisher
4
+ VERSION = "0.0.1"
5
+ end
metadata ADDED
@@ -0,0 +1,143 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: allure-report-publisher
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Andrejs Cunskis
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-04-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: aws-sdk-s3
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.93.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.93.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: dry-cli
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.6.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.6.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: parallel
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.20'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.20'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pastel
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.8.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.8.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: require_all
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 3.0.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 3.0.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: tty-spinner
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.9.3
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.9.3
97
+ description: Upload allure reports to different file storage providers
98
+ email:
99
+ - andrejs.cunskis@gmail.com
100
+ executables:
101
+ - allure-report-publisher
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - README.md
106
+ - bin/allure-report-publisher
107
+ - lib/allure_report_publisher.rb
108
+ - lib/allure_report_publisher/commands/upload_s3.rb
109
+ - lib/allure_report_publisher/commands/version.rb
110
+ - lib/allure_report_publisher/helpers.rb
111
+ - lib/allure_report_publisher/lib/report_generator.rb
112
+ - lib/allure_report_publisher/lib/uploaders/_uploader.rb
113
+ - lib/allure_report_publisher/lib/uploaders/s3_uploader.rb
114
+ - lib/allure_report_publisher/version.rb
115
+ homepage: https://github.com/andrcuns/allure-report-uploader
116
+ licenses:
117
+ - MIT
118
+ metadata:
119
+ homepage_uri: https://github.com/andrcuns/allure-report-uploader
120
+ source_code_uri: https://github.com/andrcuns/allure-report-uploader
121
+ changelog_uri: https://github.com/andrcuns/allure-report-uploader/releases
122
+ documentation_uri: https://github.com/andrcuns/allure-report-uploader/blob/master/README.md
123
+ bug_tracker_uri: https://github.com/andrcuns/allure-report-uploader/issues
124
+ post_install_message:
125
+ rdoc_options: []
126
+ require_paths:
127
+ - lib
128
+ required_ruby_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: 2.5.0
133
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ requirements: []
139
+ rubygems_version: 3.2.15
140
+ signing_key:
141
+ specification_version: 4
142
+ summary: Allure report uploader
143
+ test_files: []