allure-report-publisher 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []