apadmi_grout 2.0.0 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/apadmi/grout/di.rb +7 -2
- data/lib/apadmi/grout/models/bitrise.rb +38 -0
- data/lib/apadmi/grout/service/bitrise_service/bitrise_service.rb +103 -0
- data/lib/apadmi/grout/utils/git_utils.rb +8 -0
- data/lib/apadmi/grout/utils/network_service.rb +40 -5
- data/lib/apadmi/grout/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f1a387b90108f0657af3875457b1eb98440b54d7fdf6d62a9750fe1af10aeca5
|
4
|
+
data.tar.gz: 25fe6b6ca1083a991f088d2161f49997f04944dda1225617192c9fcf2494f511
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca2dee35cca80456ca3ebd01b8ab1e1c89eb6c9bad069b36a1e20f8ae36bb511144fed3de12d8dccc31cc8c9dd364684bbdcee4af69244ff180d6e8af4ac24d2
|
7
|
+
data.tar.gz: 49414ee4d8507110fed1bbf50946c16357039aacbc1e6657f32c1c4b4777d0ea013559da5c99fc65c77ea5a55d5d4e61479ed7b433dac81885d532dcab4eeaaa
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# Core Changelog
|
2
2
|
|
3
|
+
## [2.1.0] - 22-07-26
|
4
|
+
* Added a few bitrise utils to support listing builds, triggering builds and downloading artifacts.
|
5
|
+
* Added utilities to the network service to upload files
|
6
|
+
|
3
7
|
## [2.0.0] - 2022-05-25
|
4
8
|
* Almost total refactor to support having different board providers (other than jira)
|
5
9
|
* Implement ADO support for all existing actions
|
data/lib/apadmi/grout/di.rb
CHANGED
@@ -25,7 +25,7 @@ module Apadmi
|
|
25
25
|
project,
|
26
26
|
logger = Apadmi::Grout::DefaultLogger.new
|
27
27
|
)
|
28
|
-
network_service = Apadmi::Grout::NetworkService.
|
28
|
+
network_service = Apadmi::Grout::NetworkService.init_for_basic_auth(username, token, base_url)
|
29
29
|
jira_board_service = Apadmi::Grout::JiraBoardService.new(username, token, base_url, context_path, project, network_service)
|
30
30
|
git_utils = Apadmi::Grout::GitUtils
|
31
31
|
issues_from_changelog_action = Apadmi::Grout::IssuesFromChangelogAction.new(jira_board_service, "#{project}-", logger)
|
@@ -51,7 +51,7 @@ module Apadmi
|
|
51
51
|
)
|
52
52
|
)
|
53
53
|
ticket_prefix = "#"
|
54
|
-
network_service = Apadmi::Grout::NetworkService.
|
54
|
+
network_service = Apadmi::Grout::NetworkService.init_for_basic_auth("", personal_access_token, base_url)
|
55
55
|
ado_board_service = Apadmi::Grout::AdoBoardService.new(network_service, ado_config, logger)
|
56
56
|
git_utils = Apadmi::Grout::GitUtils
|
57
57
|
issues_from_changelog_action = Apadmi::Grout::IssuesFromChangelogAction.new(ado_board_service, ticket_prefix, logger)
|
@@ -65,6 +65,11 @@ module Apadmi
|
|
65
65
|
generate_release_notes_action: Apadmi::Grout::GenerateReleaseNotesAction.new(Apadmi::Grout::AdoIssueClassifier.new)
|
66
66
|
)
|
67
67
|
end
|
68
|
+
|
69
|
+
def self.bitrise_service(api_token, base_url, app_slug)
|
70
|
+
network_service = Apadmi::Grout::NetworkService.new(api_token, base_url)
|
71
|
+
Apadmi::Grout::BitriseService.new(app_slug, network_service)
|
72
|
+
end
|
68
73
|
end
|
69
74
|
end
|
70
75
|
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Apadmi
|
4
|
+
module Grout
|
5
|
+
STATUS_RUNNING = 0
|
6
|
+
STATUS_SUCCESS = 1
|
7
|
+
STATUS_FAILED = 2
|
8
|
+
STATUS_ABORTED_FAIL = 3
|
9
|
+
STATUS_ABORTED_SUCCESS = 4
|
10
|
+
|
11
|
+
BitriseBuild = Struct.new(:triggered_at, :slug, :status, :commit_hash) do
|
12
|
+
def finished_with_success
|
13
|
+
STATUS_SUCCESS == status
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
Artifact = Struct.new(:title, :download_url)
|
18
|
+
|
19
|
+
TriggeredBitriseBuild = Struct.new(:build_number, :build_slug, :build_url, :message, :service, :slug, :status, :triggered_workflow) do
|
20
|
+
def finished_with_success
|
21
|
+
STATUS_SUCCESS == status
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.from_json(json)
|
25
|
+
TriggeredBitriseBuild.new(
|
26
|
+
json["build_number"],
|
27
|
+
json["build_slug"],
|
28
|
+
json["build_url"],
|
29
|
+
json["message"],
|
30
|
+
json["service"],
|
31
|
+
json["slug"],
|
32
|
+
json["status"],
|
33
|
+
json["triggered_workflow"]
|
34
|
+
)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "open-uri"
|
4
|
+
require "fileutils"
|
5
|
+
|
6
|
+
module Apadmi
|
7
|
+
module Grout
|
8
|
+
# Utility class for abstracting a some of the bitrise APIs
|
9
|
+
class BitriseService
|
10
|
+
# @param [String] app_slug
|
11
|
+
# @param [Apadmi::Grout::NetworkService] network_service
|
12
|
+
def initialize(app_slug, network_service)
|
13
|
+
@app_slug = app_slug
|
14
|
+
@network_service = network_service
|
15
|
+
end
|
16
|
+
|
17
|
+
# @param [Integer] pull_request_id
|
18
|
+
# @param [String] workflow
|
19
|
+
# @return [Array<BitriseBuild>]
|
20
|
+
def list_builds(pull_request_id, workflow)
|
21
|
+
res = @network_service.do_get("/#{@app_slug}/builds?pull_request_id=#{pull_request_id}&workflow=#{workflow}")
|
22
|
+
parsed = JSON.parse(res.body)
|
23
|
+
items = parsed["data"]
|
24
|
+
|
25
|
+
return [] if items.nil? || items.empty?
|
26
|
+
|
27
|
+
items.map do |item|
|
28
|
+
BitriseBuild.new(
|
29
|
+
item["triggered_at"],
|
30
|
+
item["slug"],
|
31
|
+
item["status"],
|
32
|
+
item["commit_hash"]
|
33
|
+
)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# @param [String] build_slug
|
38
|
+
# @param [String] artifact_slug
|
39
|
+
# @return [Artifact]
|
40
|
+
def retrieve_artifact_metadata(build_slug, artifact_slug)
|
41
|
+
res = @network_service.do_get("/#{@app_slug}/builds/#{build_slug}/artifacts/#{artifact_slug}")
|
42
|
+
parsed = JSON.parse(res.body)
|
43
|
+
|
44
|
+
Artifact.new(parsed["data"]["title"], parsed["data"]["expiring_download_url"])
|
45
|
+
end
|
46
|
+
|
47
|
+
# @param [String] build_slug
|
48
|
+
# @param [String] output_dir
|
49
|
+
# Download all artifacts from a given build to a specified directory
|
50
|
+
def download_artifacts(build_slug, output_dir)
|
51
|
+
res = @network_service.do_get("/#{@app_slug}/builds/#{build_slug}/artifacts")
|
52
|
+
parsed = JSON.parse(res.body)
|
53
|
+
items = parsed["data"]
|
54
|
+
|
55
|
+
artifacts = items.map do |item|
|
56
|
+
retrieve_artifact_metadata(build_slug, item["slug"])
|
57
|
+
end
|
58
|
+
|
59
|
+
FileUtils.mkdir_p output_dir
|
60
|
+
|
61
|
+
artifacts.each do |item|
|
62
|
+
File.open("#{output_dir}/#{item.title}", "wb") do |file|
|
63
|
+
# rubocop:disable Security/Open
|
64
|
+
file.write URI.open(item.download_url).read
|
65
|
+
# rubocop:enable Security/Open
|
66
|
+
end
|
67
|
+
end
|
68
|
+
artifacts
|
69
|
+
end
|
70
|
+
|
71
|
+
# @param [String] workflow
|
72
|
+
# @param [String] branch
|
73
|
+
# @param [String] dest the destination branch of the pr
|
74
|
+
# @param [String] pull_request_id
|
75
|
+
# @param [String] pull_request_repo_url
|
76
|
+
# @param [String] commit_hash
|
77
|
+
def trigger_build(workflow, branch, dest, pull_request_id, pull_request_repo_url, commit_hash)
|
78
|
+
params = {
|
79
|
+
workflow_id: workflow,
|
80
|
+
branch: branch,
|
81
|
+
commit_hash: commit_hash
|
82
|
+
}
|
83
|
+
|
84
|
+
params[:branch_dest] = dest unless dest.strip.blank?
|
85
|
+
params[:pull_request_id] = pull_request_id unless pull_request_id.strip.blank?
|
86
|
+
params[:pull_request_repository_url] = pull_request_repo_url unless pull_request_repo_url.strip.blank?
|
87
|
+
|
88
|
+
payload = {
|
89
|
+
hook_info: {
|
90
|
+
type: "bitrise"
|
91
|
+
},
|
92
|
+
build_params: params,
|
93
|
+
triggered_by: "curl"
|
94
|
+
}
|
95
|
+
|
96
|
+
res = @network_service.do_post("/#{@app_slug}/builds", payload.to_json)
|
97
|
+
parsed = JSON.parse(res.body)
|
98
|
+
|
99
|
+
TriggeredBitriseBuild.from_json(parsed)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -15,6 +15,14 @@ module Apadmi
|
|
15
15
|
stdout.strip
|
16
16
|
end
|
17
17
|
|
18
|
+
# Gets the commit hash of the current HEAD
|
19
|
+
def self.commit_hash
|
20
|
+
stdout, stderr, = Open3.capture3("git rev-parse HEAD")
|
21
|
+
raise "Failed to get hash: #{stderr}" unless stderr.strip.empty?
|
22
|
+
|
23
|
+
stdout.strip
|
24
|
+
end
|
25
|
+
|
18
26
|
# Gets the number of commits accessible from HEAD treating the history as a graph.
|
19
27
|
# See more details here: https://git-scm.com/docs/git-rev-list
|
20
28
|
# @return [String] The number of commits
|
@@ -6,8 +6,11 @@ module Apadmi
|
|
6
6
|
module Grout
|
7
7
|
# Utility class for running REST network calls
|
8
8
|
class NetworkService
|
9
|
+
attr_reader :base_url
|
10
|
+
|
9
11
|
APPLICATION_JSON = "application/json"
|
10
12
|
PATCH_CONTENT_TYPE = "application/json-patch+json"
|
13
|
+
FORM_CONTENT_TYPE = "application/x-www-form-urlencoded"
|
11
14
|
CONTENT_TYPE = "Content-Type"
|
12
15
|
private_constant :CONTENT_TYPE, :APPLICATION_JSON
|
13
16
|
|
@@ -15,10 +18,18 @@ module Apadmi
|
|
15
18
|
# @param password [String]
|
16
19
|
# @param base_url [String]
|
17
20
|
# Params are encoded for use in Basic Auth https://datatracker.ietf.org/doc/html/rfc7617
|
18
|
-
def
|
19
|
-
|
20
|
-
|
21
|
+
def self.init_for_basic_auth(username, password, base_url, timeout = 30)
|
22
|
+
auth_str = "#{username}:#{password}"
|
23
|
+
auth_header = "Basic #{Base64.strict_encode64(auth_str)}"
|
24
|
+
NetworkService.new(auth_header, base_url, timeout)
|
25
|
+
end
|
26
|
+
|
27
|
+
# @param auth_header [String]
|
28
|
+
# @param base_url [String]
|
29
|
+
def initialize(auth_header, base_url, timeout = 30)
|
21
30
|
@base_url = base_url
|
31
|
+
@auth_header = auth_header
|
32
|
+
@timeout = timeout
|
22
33
|
end
|
23
34
|
|
24
35
|
# @param [String] path
|
@@ -50,6 +61,30 @@ module Apadmi
|
|
50
61
|
response
|
51
62
|
end
|
52
63
|
|
64
|
+
def do_form_encoded_post(path, payload)
|
65
|
+
conn = setup_con
|
66
|
+
response = conn.post("#{@base_url}#{path}") do |req|
|
67
|
+
req.headers[CONTENT_TYPE] = FORM_CONTENT_TYPE
|
68
|
+
req.body = URI.encode_www_form(payload)
|
69
|
+
end
|
70
|
+
throw_if_error(response)
|
71
|
+
response
|
72
|
+
end
|
73
|
+
|
74
|
+
def do_file_post(path, file_path, type)
|
75
|
+
conn = Faraday.new do |f|
|
76
|
+
f.request :multipart
|
77
|
+
f.adapter :net_http
|
78
|
+
end
|
79
|
+
conn.options.timeout = @timeout
|
80
|
+
conn.headers["Authorization"] = @auth_header
|
81
|
+
|
82
|
+
payload = { file: Faraday::UploadIO.new(file_path, type) }
|
83
|
+
response = conn.post("#{@base_url}#{path}", payload)
|
84
|
+
throw_if_error(response)
|
85
|
+
response
|
86
|
+
end
|
87
|
+
|
53
88
|
# @param [String] path
|
54
89
|
# @param [String] payload
|
55
90
|
# @return [Faraday::Response]
|
@@ -73,9 +108,9 @@ module Apadmi
|
|
73
108
|
|
74
109
|
# @return [Faraday::Connection]
|
75
110
|
def setup_con
|
76
|
-
auth_str = "#{@username}:#{@password}"
|
77
111
|
conn = Faraday.new # create a new Connection with base URL
|
78
|
-
conn.headers["Authorization"] =
|
112
|
+
conn.headers["Authorization"] = @auth_header
|
113
|
+
conn.options.timeout = @timeout
|
79
114
|
conn
|
80
115
|
end
|
81
116
|
|
data/lib/apadmi/grout/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apadmi_grout
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Apadmi
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-07-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -72,12 +72,14 @@ files:
|
|
72
72
|
- lib/apadmi/grout/actions/move_tickets_action.rb
|
73
73
|
- lib/apadmi/grout/di.rb
|
74
74
|
- lib/apadmi/grout/models/ado_config.rb
|
75
|
+
- lib/apadmi/grout/models/bitrise.rb
|
75
76
|
- lib/apadmi/grout/models/find_tickets_options.rb
|
76
77
|
- lib/apadmi/grout/models/flag_messages.rb
|
77
78
|
- lib/apadmi/grout/models/issue.rb
|
78
79
|
- lib/apadmi/grout/models/pull_request.rb
|
79
80
|
- lib/apadmi/grout/models/release_notes_config.rb
|
80
81
|
- lib/apadmi/grout/models/release_notes_templates.rb
|
82
|
+
- lib/apadmi/grout/service/bitrise_service/bitrise_service.rb
|
81
83
|
- lib/apadmi/grout/service/board_service/ado_board_service.rb
|
82
84
|
- lib/apadmi/grout/service/board_service/board_service.rb
|
83
85
|
- lib/apadmi/grout/service/board_service/jira_board_service.rb
|