flash_flow 1.4.8 → 1.4.9
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 +4 -4
- data/Gemfile.lock +1 -1
- data/flash_flow.yml.erb.example +1 -1
- data/lib/flash_flow/git.rb +9 -5
- data/lib/flash_flow/mailer.rb +6 -2
- data/lib/flash_flow/merge/base.rb +1 -1
- data/lib/flash_flow/merge/master.rb +62 -29
- data/lib/flash_flow/merge/release.rb +5 -6
- data/lib/flash_flow/release/pdf_diff_generator.rb +0 -1
- data/lib/flash_flow/release/percy_client.rb +7 -4
- data/lib/flash_flow/release.rb +7 -1
- data/lib/flash_flow/version.rb +1 -1
- data/test/fixtures/pdf_diff/0cbafd97ee4904001e47c0d7a4a6e4b2ee7ed830458c8616466f7a631dfeb3ce.png +0 -0
- data/test/fixtures/pdf_diff/142ef42e828a35e3e128f47277cb73e56215f5a81c53923c657634ac574cca07.png +0 -0
- data/test/fixtures/pdf_diff/59df070cbe2188a9f584ecdabe553da00d3e9b353d3b745448ad81a0028f05fa.png +0 -0
- data/test/fixtures/pdf_diff/6942084eb617d86454bafdfb7dfb820567a1c9361068d6552449912b631e9ad1.png +0 -0
- data/test/fixtures/pdf_diff/75adb2b47ff19687249a4e95ed7f1b7aa92abf5e74a806d2cbd9e2d9aa569cb1.png +0 -0
- data/test/fixtures/pdf_diff/a7501e15821c22aead2030676403b54da8c99c6967f3d95e1040cc62f9c089a6.png +0 -0
- data/test/fixtures/pdf_diff/pdf_diff_test_1.json +1 -0
- data/test/fixtures/pdf_diff_test_1.json +1 -0
- data/test/lib/release/pdf_diff_generator_testing.rb +62 -0
- data/test/lib/release/test_percy_client.rb +7 -1
- metadata +20 -4
- data/test/lib/release/test_pdf_diff_generator.rb +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2ff14ebe3a079bc64c495fbe66f528e08f6c9114
|
4
|
+
data.tar.gz: d50b3136f470ffc95cd2120c5b3db0035a4f81cd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b28bf44030d7ce604b797b198f0c7b1bde4636e360a69da26494360c8096635ee7184dc35e66035c632caf8468a259b9b46cc4609e1deeea4377f3e8d57417b3
|
7
|
+
data.tar.gz: a6a37d3ff1fe2ec6bc41ce96ac82e48fa43c0406e3a145239853e3c5185b19f9dafa69f0f2d14961b3005e4cd0f48f00b4174ab4bcdf227edeca3b1e50da73a2
|
data/Gemfile.lock
CHANGED
data/flash_flow.yml.erb.example
CHANGED
@@ -94,7 +94,7 @@ branch_info_file: 'your/random/file'
|
|
94
94
|
#smtp:
|
95
95
|
# settings:
|
96
96
|
# domain: 'yourdomain.com'
|
97
|
-
# address: <%= ENV['
|
97
|
+
# address: <%= ENV['SMTP_HOST'] %>
|
98
98
|
# user_name: <%= ENV['SMTP_USERNAME'] %>
|
99
99
|
# password: <%= ENV['SMTP_PASSWORD'] %>
|
100
100
|
# port: 587
|
data/lib/flash_flow/git.rb
CHANGED
@@ -60,12 +60,12 @@ module FlashFlow
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def branch_contains?(branch, ref)
|
63
|
-
run("branch --contains #{ref}", log: CmdRunner::LOG_CMD)
|
63
|
+
run("branch -a --contains #{ref}", log: CmdRunner::LOG_CMD)
|
64
64
|
last_stdout.split("\n").detect { |str| str[2..-1] == branch }
|
65
65
|
end
|
66
66
|
|
67
|
-
def master_branch_contains?(
|
68
|
-
branch_contains?(master_branch,
|
67
|
+
def master_branch_contains?(sha)
|
68
|
+
branch_contains?("remotes/#{remote}/#{master_branch}", sha)
|
69
69
|
end
|
70
70
|
|
71
71
|
def in_original_merge_branch
|
@@ -213,8 +213,12 @@ module FlashFlow
|
|
213
213
|
"flash_flow/#{merge_branch}"
|
214
214
|
end
|
215
215
|
|
216
|
-
def get_sha(branch)
|
217
|
-
|
216
|
+
def get_sha(branch, opts={})
|
217
|
+
if opts[:short]
|
218
|
+
run("rev-parse --short #{branch}")
|
219
|
+
else
|
220
|
+
run("rev-parse #{branch}")
|
221
|
+
end
|
218
222
|
last_stdout.strip if last_success?
|
219
223
|
end
|
220
224
|
|
data/lib/flash_flow/mailer.rb
CHANGED
@@ -12,8 +12,8 @@ module FlashFlow
|
|
12
12
|
configure!(config['settings'])
|
13
13
|
end
|
14
14
|
|
15
|
-
def deliver!(data={})
|
16
|
-
delivery_info =
|
15
|
+
def deliver!(type, data={})
|
16
|
+
delivery_info = get_delivery_info(type)
|
17
17
|
|
18
18
|
if delivery_info
|
19
19
|
delivery_info["body_html"] = body_html(data, delivery_info["body_file"])
|
@@ -40,6 +40,10 @@ module FlashFlow
|
|
40
40
|
erb_template.result(binding)
|
41
41
|
end
|
42
42
|
|
43
|
+
def get_delivery_info(email_type)
|
44
|
+
Config.configuration.smtp.dig("emails", email_type.to_s)
|
45
|
+
end
|
46
|
+
|
43
47
|
end
|
44
48
|
end
|
45
49
|
end
|
@@ -77,7 +77,7 @@ module FlashFlow
|
|
77
77
|
|
78
78
|
def release_ahead_of_master
|
79
79
|
@git.branch_exists?("#{@git.remote}/#{@git.release_branch}") &&
|
80
|
-
!@git.
|
80
|
+
!@git.master_branch_contains?(@git.get_sha("#{@git.remote}/#{@git.release_branch}"))
|
81
81
|
end
|
82
82
|
|
83
83
|
def write_data(commit_msg)
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'flash_flow/merge/base'
|
2
|
+
require 'flash_flow/release'
|
2
3
|
|
3
4
|
module FlashFlow
|
4
5
|
module Merge
|
@@ -15,8 +16,10 @@ module FlashFlow
|
|
15
16
|
def run
|
16
17
|
begin
|
17
18
|
check_version
|
18
|
-
puts "Merging #{@git.release_branch} into #{@git.master_branch}"
|
19
|
-
logger.info "\n\n### Beginning merge of #{@git.release_branch} into #{@git.master_branch} ###\n\n"
|
19
|
+
# puts "Merging #{@git.release_branch} into #{@git.master_branch}"
|
20
|
+
# logger.info "\n\n### Beginning merge of #{@git.release_branch} into #{@git.master_branch} ###\n\n"
|
21
|
+
puts "Checking #{@git.release_branch} QA approval"
|
22
|
+
logger.info "\n\n### Beginning check of #{@git.release_branch} QA ###\n\n"
|
20
23
|
|
21
24
|
mergers, errors = [], []
|
22
25
|
|
@@ -26,33 +29,12 @@ module FlashFlow
|
|
26
29
|
raise NothingToMergeError.new("There is no pending release.")
|
27
30
|
elsif !release_ahead_of_master
|
28
31
|
raise NothingToMergeError.new("The release branch '#{@git.release_branch}' has no commits that are not in master")
|
32
|
+
elsif !release_qa_approved?
|
33
|
+
raise FlashFlow::Release::QAError.new("The release build '#{get_release_sha(short: true)}' has not been approved for release")
|
29
34
|
end
|
30
35
|
|
31
|
-
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
@git.in_branch(@git.master_branch) do
|
36
|
-
@git.run("reset --hard origin/master")
|
37
|
-
merge_branches([Data::Branch.new(@git.release_branch)]) do |branch, merger|
|
38
|
-
mergers << [branch, merger]
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
errors = mergers.select { |m| m.last.result != :success }
|
43
|
-
|
44
|
-
if errors.empty?
|
45
|
-
unless @git.push("#{@git.master_branch}:#{@git.master_branch}", true)
|
46
|
-
raise GitPushFailure.new("Unable to push to #{@git.master_branch}. See log for details.")
|
47
|
-
end
|
48
|
-
|
49
|
-
released_sha = @git.get_sha(@git.master_branch)
|
50
|
-
|
51
|
-
release['status'] = 'Success'
|
52
|
-
release['released_sha'] = released_sha
|
53
|
-
|
54
|
-
write_data('Release merged [ci skip]')
|
55
|
-
end
|
36
|
+
# errors = merge_master(release)
|
37
|
+
send_release_ready_email(release)
|
56
38
|
end
|
57
39
|
|
58
40
|
if errors.empty?
|
@@ -62,7 +44,7 @@ module FlashFlow
|
|
62
44
|
end
|
63
45
|
|
64
46
|
logger.info "### Finished merge of #{@git.release_branch} into #{@git.master_branch} ###"
|
65
|
-
rescue Lock::Error, OutOfSyncWithRemote, UnmergeableBranch, GitPushFailure, NothingToMergeError, VersionError => e
|
47
|
+
rescue Lock::Error, OutOfSyncWithRemote, UnmergeableBranch, GitPushFailure, NothingToMergeError, FlashFlow::Release::QAError, VersionError => e
|
66
48
|
puts 'Failure!'
|
67
49
|
puts e.message
|
68
50
|
ensure
|
@@ -70,6 +52,57 @@ module FlashFlow
|
|
70
52
|
end
|
71
53
|
end
|
72
54
|
|
55
|
+
def merge_master(release)
|
56
|
+
@git.in_original_merge_branch do
|
57
|
+
@git.initialize_rerere
|
58
|
+
end
|
59
|
+
|
60
|
+
@git.in_branch(@git.master_branch) do
|
61
|
+
@git.run("reset --hard origin/master")
|
62
|
+
merge_branches([Data::Branch.new(@git.release_branch)]) do |branch, merger|
|
63
|
+
mergers << [branch, merger]
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
errors = mergers.select { |m| m.last.result != :success }
|
68
|
+
|
69
|
+
if errors.empty?
|
70
|
+
unless @git.push("#{@git.master_branch}:#{@git.master_branch}", true)
|
71
|
+
raise GitPushFailure.new("Unable to push to #{@git.master_branch}. See log for details.")
|
72
|
+
end
|
73
|
+
|
74
|
+
mark_release_success(release, @git.get_sha(@git.master_branch))
|
75
|
+
end
|
76
|
+
|
77
|
+
errors
|
78
|
+
end
|
79
|
+
|
80
|
+
def mark_release_success(release, sha)
|
81
|
+
release['status'] = 'Success'
|
82
|
+
release['released_sha'] = sha
|
83
|
+
|
84
|
+
write_data('Release merged [ci skip]')
|
85
|
+
end
|
86
|
+
|
87
|
+
def release_qa_approved?
|
88
|
+
release = FlashFlow::Release::Base.new(FlashFlow::Config.configuration.release)
|
89
|
+
release.qa_approved?(get_release_sha)
|
90
|
+
end
|
91
|
+
|
92
|
+
def send_release_ready_email(release)
|
93
|
+
begin
|
94
|
+
mailer = FlashFlow::Mailer::Base.new(Config.configuration.smtp)
|
95
|
+
mailer.deliver!(:release_ready, { approved_sha: get_release_sha(short: true) })
|
96
|
+
mark_release_success(release, get_release_sha)
|
97
|
+
rescue ArgumentError => e
|
98
|
+
raise FlashFlow::Release::QAError.new("Cannot send the email: #{e}")
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def get_release_sha(opts={})
|
103
|
+
@get_release_sha ||= @git.get_sha("#{@git.remote}/#{@git.release_branch}", opts)
|
104
|
+
end
|
105
|
+
|
73
106
|
end
|
74
107
|
end
|
75
|
-
end
|
108
|
+
end
|
@@ -10,6 +10,7 @@ module FlashFlow
|
|
10
10
|
def initialize(opts={})
|
11
11
|
super(opts)
|
12
12
|
|
13
|
+
@force = opts[:force]
|
13
14
|
@release_branches = parse_branches(opts[:release_branches])
|
14
15
|
|
15
16
|
@data = Data::Base.new({}, Config.configuration.branch_info_file, @git, logger: logger)
|
@@ -73,10 +74,6 @@ module FlashFlow
|
|
73
74
|
end
|
74
75
|
end
|
75
76
|
|
76
|
-
def branch_data
|
77
|
-
|
78
|
-
end
|
79
|
-
|
80
77
|
def parse_branches(user_branches)
|
81
78
|
branch_list = user_branches == ['ready'] ? shippable_branch_names : [user_branches].flatten.compact
|
82
79
|
|
@@ -86,8 +83,10 @@ module FlashFlow
|
|
86
83
|
def check_branches
|
87
84
|
raise NothingToMergeError.new("Nothing to merge") if @release_branches.empty?
|
88
85
|
|
89
|
-
|
90
|
-
|
86
|
+
unless @force
|
87
|
+
requested_not_ready_branches = (@release_branches.map(&:ref) - shippable_branch_names)
|
88
|
+
raise RuntimeError.new("The following branches are not ready to ship:\n#{requested_not_ready_branches.join("\n")}") unless requested_not_ready_branches.empty?
|
89
|
+
end
|
91
90
|
end
|
92
91
|
|
93
92
|
def shippable_branch_names
|
@@ -15,7 +15,6 @@ module FlashFlow
|
|
15
15
|
set_dimensions(*pdf.bounds.top_right)
|
16
16
|
generate_title_page(pdf)
|
17
17
|
info.each do |comparison|
|
18
|
-
puts comparison.dig('head-screenshot', :url)
|
19
18
|
add_comparison_to_pdf(pdf, comparison)
|
20
19
|
end
|
21
20
|
pdf.number_pages('<page> of <total>', { start_count_at: 1, align: :right, size: 12 })
|
@@ -13,8 +13,6 @@ module FlashFlow
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def find_latest_by_sha(sha)
|
16
|
-
|
17
|
-
require 'byebug'; debugger
|
18
16
|
response = get_builds
|
19
17
|
commit = find_commit_by_sha(response, sha)
|
20
18
|
find_build_by_commit_id(response, commit['id'])
|
@@ -24,7 +22,7 @@ module FlashFlow
|
|
24
22
|
build = find_latest_by_sha(get_latest_sha)
|
25
23
|
|
26
24
|
if has_unapproved_diffs?(build)
|
27
|
-
mailer.deliver!(percy_build_url: build['web-url'])
|
25
|
+
mailer.deliver!(:compliance, { percy_build_url: build['web-url'] })
|
28
26
|
end
|
29
27
|
end
|
30
28
|
|
@@ -34,6 +32,11 @@ module FlashFlow
|
|
34
32
|
PdfDiffGenerator.new.generate(get_comparisons(build_id), output_file, threshold)
|
35
33
|
end
|
36
34
|
|
35
|
+
def qa_approved?(sha=nil)
|
36
|
+
build = find_latest_by_sha(sha || get_latest_sha)
|
37
|
+
!build['approved-at'].nil?
|
38
|
+
end
|
39
|
+
|
37
40
|
private
|
38
41
|
|
39
42
|
def get_build_id(sha=nil)
|
@@ -88,7 +91,7 @@ module FlashFlow
|
|
88
91
|
end
|
89
92
|
|
90
93
|
def get_latest_sha
|
91
|
-
@git.get_sha(
|
94
|
+
@git.get_sha(@git.release_branch)
|
92
95
|
end
|
93
96
|
|
94
97
|
def mailer
|
data/lib/flash_flow/release.rb
CHANGED
@@ -2,6 +2,8 @@ require 'flash_flow/release/percy_client'
|
|
2
2
|
|
3
3
|
module FlashFlow
|
4
4
|
module Release
|
5
|
+
class QAError < RuntimeError; end
|
6
|
+
|
5
7
|
class Base
|
6
8
|
def initialize(config=nil)
|
7
9
|
release_class_name = config && config['class'] && config['class']['name']
|
@@ -20,7 +22,11 @@ module FlashFlow
|
|
20
22
|
end
|
21
23
|
|
22
24
|
def gen_pdf_diffs(output_file, threshold=0.0)
|
23
|
-
@release.gen_pdf_diffs(output_file,
|
25
|
+
@release.gen_pdf_diffs(output_file, threshold) if @release.respond_to?(:gen_pdf_diffs)
|
26
|
+
end
|
27
|
+
|
28
|
+
def qa_approved?(sha)
|
29
|
+
@release.qa_approved?(sha) if @release.respond_to?(:qa_approved?)
|
24
30
|
end
|
25
31
|
|
26
32
|
end
|
data/lib/flash_flow/version.rb
CHANGED
data/test/fixtures/pdf_diff/0cbafd97ee4904001e47c0d7a4a6e4b2ee7ed830458c8616466f7a631dfeb3ce.png
ADDED
Binary file
|
data/test/fixtures/pdf_diff/142ef42e828a35e3e128f47277cb73e56215f5a81c53923c657634ac574cca07.png
ADDED
Binary file
|
data/test/fixtures/pdf_diff/59df070cbe2188a9f584ecdabe553da00d3e9b353d3b745448ad81a0028f05fa.png
ADDED
Binary file
|
data/test/fixtures/pdf_diff/6942084eb617d86454bafdfb7dfb820567a1c9361068d6552449912b631e9ad1.png
ADDED
Binary file
|