appetize-cli 0.1.3 → 0.1.4

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: 470e7a550a3d819858e140886da3724bc0619e312c321a21857e1a27bddce621
4
- data.tar.gz: 7ebfbc457f6ba9149f6e6b3e131d1387d8bb26929d15d85a1b22b9b85c687bcd
3
+ metadata.gz: 9cc8bacaba3e5f4e836d8e174d551bd32124a1ca8bfa4df92526492ac4904ae1
4
+ data.tar.gz: 7650c019adbc139aeac7beb5ee44e58f9163e340e26c7b6a43bf2f78204bd8b2
5
5
  SHA512:
6
- metadata.gz: e9e4936e515f09f1d48a3c267e58151509dcfeba63bd835aaeceeb0aa1dc12d51b24bed2924f880369d45e77b6af098ce784434b42c474adcf6f552fd605ca68
7
- data.tar.gz: d514d4707145c8773752f465b811bba79907db8fd58b0bc146e9a43e151317d8e71a973ba95fe255e9815adfaa51729ae521d4bbe51c068724eb0e064eed2fad
6
+ metadata.gz: 920e345be4a9c43c4cc12b853fbb0b354b2aebbd49fd6b368b6e220d344bac8d440446f7c62c39d34cd6509fb6337a49f01092f16118b99fc9388a098f4664f2
7
+ data.tar.gz: 49d8e0478a0ec95b035dc0737d758b3c798ec3cb8476a26e5b258f2ab882c452dda6e8237ee3876019facea3dedb81ee362edfbc88b0208aa1aedc88de8f8a1e
data/.rubocop.yml CHANGED
@@ -1,5 +1,7 @@
1
1
  AllCops:
2
2
  TargetRubyVersion: 2.5
3
+ SuggestExtensions: false
4
+ NewCops: enable
3
5
 
4
6
  Style/StringLiterals:
5
7
  Enabled: true
@@ -19,4 +21,8 @@ Lint/UnusedMethodArgument:
19
21
  Enabled: false
20
22
 
21
23
  Style/Documentation:
22
- Enabled: false
24
+ Enabled: false
25
+
26
+ Metrics/BlockLength:
27
+ IgnoredMethods: ['describe', 'context']
28
+
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.1.4] - 2021-09-11
4
+
5
+ - Upload command will detect & update existing Review Apps when running in GitLab CI
6
+
3
7
  ## [0.1.3] - 2021-09-09
4
8
 
5
9
  - Upload command now returns full JSON response from Appetize
data/README.md CHANGED
@@ -47,6 +47,24 @@ Example:
47
47
  $ appetize upload builds/app-debug.apk android
48
48
  $ appetize upload builds/app.zip ios
49
49
 
50
+ ### Update
51
+
52
+ Update an existing app in Appitize with a new APK/ZIP
53
+
54
+ ```
55
+ Usage:
56
+ appetize update PATH PUBLIC_KEY
57
+ ```
58
+
59
+ `PATH` the path to the Apk or Zip file of the app you would like to deploy
60
+
61
+ `PUBLIC_KEY` the public key provided by Appetize for the specific app deployment you'd like to update
62
+
63
+ Example:
64
+
65
+ $ appetize upload builds/app-debug.apk somepublickey
66
+ $ appetize upload builds/app.zip somepublickey
67
+
50
68
 
51
69
  ### Delete
52
70
 
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "httparty"
4
+
5
+ module Appetize
6
+ class API
7
+ def initialize(token = nil, api_host = nil)
8
+ @token = token || ENV["APPETIZE_API_TOKEN"]
9
+ @api_host = api_host || "api.appetize.io"
10
+
11
+ raise "Appetize Token Missing" if @token.nil?
12
+ end
13
+
14
+ def create(path, platform)
15
+ url = "https://#{@api_host}/v1/apps"
16
+ auth = { username: @token, password: "" }
17
+ body = { platform: platform, file: File.open(path) }
18
+
19
+ HTTParty.post(url, body: body, basic_auth: auth)
20
+ end
21
+
22
+ def update(path, public_key)
23
+ url = "https://#{@api_host}/v1/apps/#{public_key}"
24
+ auth = { username: @token, password: "" }
25
+ body = { file: File.open(path) }
26
+
27
+ HTTParty.post(url, body: body, basic_auth: auth)
28
+ end
29
+
30
+ def delete(public_key)
31
+ url = "https://#{@api_host}/v1/apps/#{public_key}"
32
+ auth = { username: @token, password: "" }
33
+
34
+ HTTParty.delete(url, basic_auth: auth)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "httparty"
4
+
5
+ module Appetize
6
+ module CI
7
+ class GitLab
8
+ def initialize(project_id, ref_name, api_token, api_host = nil)
9
+ @project_id = project_id
10
+ @ref_name = ref_name
11
+ @api_token = api_token
12
+ @api_host = api_host || "https://gitlab.com/api/v4"
13
+ end
14
+
15
+ def fetch_artifact(job, artifact_name)
16
+ url = "#{@api_host}/projects/#{@project_id}/jobs/artifacts/#{@ref_name}/raw/#{artifact_name}?job=#{job}"
17
+
18
+ headers = {
19
+ "PRIVATE-TOKEN" => @api_token
20
+ }
21
+
22
+ HTTParty.get(url, headers: headers)
23
+ end
24
+ end
25
+ end
26
+ end
data/lib/appetize/cli.rb CHANGED
@@ -18,6 +18,18 @@ module Appetize
18
18
  end
19
19
  map %w[--version -v] => :version
20
20
 
21
+ desc "update PATH PUBLIC_KEY", "Command description..."
22
+ method_option :help, aliases: "-h", type: :boolean,
23
+ desc: "Display usage information"
24
+ def update(path, public_key, token = nil, api_host = nil)
25
+ if options[:help]
26
+ invoke :help, ["update"]
27
+ else
28
+ require_relative "commands/update"
29
+ Appetize::Commands::Update.new(path, public_key, token, api_host, options).execute
30
+ end
31
+ end
32
+
21
33
  desc "upload PATH PLATFORM", "Upload an APK/ZIP to Appetize"
22
34
  method_option :help, aliases: "-h", type: :boolean,
23
35
  desc: "Display usage information"
@@ -1,26 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "httparty"
4
3
  require_relative "../command"
4
+ require_relative "../api"
5
5
 
6
6
  module Appetize
7
7
  module Commands
8
8
  class Delete < Appetize::Command
9
9
  def initialize(public_key, token = nil, api_host = nil, options = {})
10
+ @api = Appetize::API.new(token, api_host)
10
11
  @public_key = public_key
11
- @token = token
12
- @api_host = api_host
13
12
  @options = options
14
13
  end
15
14
 
16
15
  def execute(input: $stdin, output: $stdout)
17
- token = @token || ENV["APPETIZE_API_TOKEN"]
18
- api_host = @api_host || "api.appetize.io"
19
-
20
- url = "https://#{api_host}/v1/apps/#{@public_key}"
21
- auth = { username: token, password: "" }
22
-
23
- response = HTTParty.delete(url, basic_auth: auth)
16
+ response = @api.delete(@public_key)
24
17
 
25
18
  raise "Delete failed: #{response.code}" unless response.code == 200
26
19
 
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../command"
4
+ require_relative "../api"
5
+
6
+ module Appetize
7
+ module Commands
8
+ class Update < Appetize::Command
9
+ def initialize(path, public_key, token, api_host, options)
10
+ @api = Appetize::API.new(token, api_host)
11
+ @path = path
12
+ @public_key = public_key
13
+ @options = options
14
+ end
15
+
16
+ def execute(input: $stdin, output: $stdout)
17
+ response = @api.update(@path, @public_key)
18
+
19
+ raise "Update failed: #{response.code}" unless response.code == 200
20
+
21
+ output.puts response.body
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,33 +1,59 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "httparty"
4
3
  require_relative "../command"
4
+ require_relative "../api"
5
+ require_relative "../ci/gitlab"
5
6
 
6
7
  module Appetize
7
8
  module Commands
8
9
  class Upload < Appetize::Command
9
10
  def initialize(path, platform, token, api_host, options)
10
- @path = path
11
+ @api = Appetize::API.new(token, api_host)
12
+ @path = path
11
13
  @platform = platform
12
- @token = token
13
- @api_host = api_host
14
- @options = options
14
+ @options = options
15
15
  end
16
16
 
17
17
  def execute(input: $stdin, output: $stdout)
18
- token = @token || ENV["APPETIZE_API_TOKEN"]
19
- api_host = @api_host || "api.appetize.io"
18
+ # If we are running in GitLab CI, check for an existing pipeline
19
+ # if a pipeline is found, fetch the public key and update the
20
+ # existing Appetize app
21
+ if Appetize::Commands::Upload.gitlab_ci?
22
+ artifact_response = fetch_gitlab_artifact
20
23
 
21
- url = "https://#{api_host}/v1/apps"
22
- auth = { username: token, password: "" }
23
- body = { platform: @platform, file: File.open(@path) }
24
+ if artifact_response.code == 200
25
+ public_key = JSON.parse(artifact_response.body)["publicKey"]
24
26
 
25
- response = HTTParty.post(url, body: body, basic_auth: auth)
27
+ response = @api.update(@path, public_key)
28
+ end
29
+ end
30
+
31
+ response = @api.create(@path, @platform) if public_key.nil?
26
32
 
27
33
  raise "Upload failed: #{response.code}" unless response.code == 200
28
34
 
29
35
  output.puts response.body
30
36
  end
37
+
38
+ def self.gitlab_ci?
39
+ ENV["GITLAB_CI"].to_s.downcase == "true"
40
+ end
41
+
42
+ private
43
+
44
+ def fetch_gitlab_artifact
45
+ gitlab_client = Appetize::CI::GitLab.new(
46
+ ENV["CI_PROJECT_ID"],
47
+ ENV["CI_COMMIT_REF_NAME"],
48
+ ENV["PRIVATE_TOKEN"],
49
+ ENV["CI_API_V4_URL"]
50
+ )
51
+
52
+ gitlab_client.fetch_artifact(
53
+ "startReview",
54
+ "appetize-information.json"
55
+ )
56
+ end
31
57
  end
32
58
  end
33
59
  end
@@ -0,0 +1 @@
1
+ #
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Appetize
4
- VERSION = "0.1.3"
4
+ VERSION = "0.1.4"
5
5
  end
data/lib/appetize.rb CHANGED
@@ -4,5 +4,4 @@ require_relative "appetize/version"
4
4
 
5
5
  module Appetize
6
6
  class Error < StandardError; end
7
- # Your code goes here...
8
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appetize-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Darby Frey
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-09-09 00:00:00.000000000 Z
11
+ date: 2021-09-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -59,13 +59,17 @@ files:
59
59
  - bin/setup
60
60
  - exe/appetize
61
61
  - lib/appetize.rb
62
+ - lib/appetize/api.rb
63
+ - lib/appetize/ci/gitlab.rb
62
64
  - lib/appetize/cli.rb
63
65
  - lib/appetize/command.rb
64
66
  - lib/appetize/commands/.gitkeep
65
67
  - lib/appetize/commands/delete.rb
68
+ - lib/appetize/commands/update.rb
66
69
  - lib/appetize/commands/upload.rb
67
70
  - lib/appetize/templates/.gitkeep
68
71
  - lib/appetize/templates/delete/.gitkeep
72
+ - lib/appetize/templates/update/.gitkeep
69
73
  - lib/appetize/templates/upload/.gitkeep
70
74
  - lib/appetize/version.rb
71
75
  homepage: https://gitlab.com/gitlab-org/incubation-engineering/devops-for-mobile-apps/appetize-cli