uffizzi-cli 0.14.0 → 1.0.0

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: a7a27f279e964f07491f920557722194d65c8a9259487a5a717707f6075d164b
4
- data.tar.gz: d9825fe3425b0dde3dbe1e4528686100c6ca22f30aed4aa7a332cf991bbb6480
3
+ metadata.gz: ac2d58dae4db13ed788532732a92f9d4a317780cb4b80ef07d185f899d10749d
4
+ data.tar.gz: a1b4b37db41936eabb930febe701186027a80d0684ca371ed442168caecea779
5
5
  SHA512:
6
- metadata.gz: 179a75d66bd89efc1ad9b3decf5ebc6c5526b2fe0fdd02e616940b4f12544505c956874a0649a99a2c5d1e14fce6e1dcda305a9028e08d8e9c2b8b5f63955fb5
7
- data.tar.gz: a8d2637bef4250c33bb1cc8725556a2758384c9115938865e8acd70b92fce515ccd94b691913341c6b6f64a29f6d9ff34e99148fd62cacf8d6551d72a1222508
6
+ metadata.gz: c2420a93b4b17a5efb2de11ed5a998070da7eb2f8f22a2d09bf2598b4eb88841f428f0a87cf7de7c5b49e289f12f2d85413aa96600ca3726b71b5ec962e6b68c
7
+ data.tar.gz: 2dff8bd8e614d8ffaad6a2b42f528844c5a6d1232c2327bcb756c8ae6d4b014e3b310965f01fd86dc2d6eb40cb9aaab10755ef707a0dc808538620581b1f09cb
@@ -10,7 +10,8 @@ module Uffizzi
10
10
  desc 'list-credentials', 'List existing credentials for an account'
11
11
  def list_credentials
12
12
  server = ConfigFile.read_option(:server)
13
- response = fetch_credentials(server)
13
+ account_id = ConfigFile.read_option(:account_id)
14
+ response = fetch_credentials(server, account_id)
14
15
  if ResponseHelper.ok?(response)
15
16
  handle_list_credentials_success(response)
16
17
  else
@@ -37,11 +38,12 @@ module Uffizzi
37
38
  type: type,
38
39
  }
39
40
  server = ConfigFile.read_option(:server)
41
+ account_id = ConfigFile.read_option(:account_id)
40
42
 
41
43
  response = if credential_exists
42
- update_credential(server, params, type)
44
+ update_credential(server, account_id, params, type)
43
45
  else
44
- create_credential(server, params)
46
+ create_credential(server, account_id, params)
45
47
  end
46
48
 
47
49
  handle_result_for('Docker Hub', response)
@@ -68,11 +70,12 @@ module Uffizzi
68
70
  type: type,
69
71
  }
70
72
  server = ConfigFile.read_option(:server)
73
+ account_id = ConfigFile.read_option(:account_id)
71
74
 
72
75
  response = if credential_exists
73
- update_credential(server, params, type)
76
+ update_credential(server, account_id, params, type)
74
77
  else
75
- create_credential(server, params)
78
+ create_credential(server, account_id, params)
76
79
  end
77
80
 
78
81
  handle_result_for('Docker Registry', response)
@@ -99,11 +102,12 @@ module Uffizzi
99
102
  type: type,
100
103
  }
101
104
  server = ConfigFile.read_option(:server)
105
+ account_id = ConfigFile.read_option(:account_id)
102
106
 
103
107
  response = if credential_exists
104
- update_credential(server, params, type)
108
+ update_credential(server, account_id, params, type)
105
109
  else
106
- create_credential(server, params)
110
+ create_credential(server, account_id, params)
107
111
  end
108
112
 
109
113
  handle_result_for('ACR', response)
@@ -130,11 +134,12 @@ module Uffizzi
130
134
  type: type,
131
135
  }
132
136
  server = ConfigFile.read_option(:server)
137
+ account_id = ConfigFile.read_option(:account_id)
133
138
 
134
139
  response = if credential_exists
135
- update_credential(server, params, type)
140
+ update_credential(server, account_id, params, type)
136
141
  else
137
- create_credential(server, params)
142
+ create_credential(server, account_id, params)
138
143
  end
139
144
 
140
145
  handle_result_for('ECR', response)
@@ -156,11 +161,12 @@ module Uffizzi
156
161
  type: type,
157
162
  }
158
163
  server = ConfigFile.read_option(:server)
164
+ account_id = ConfigFile.read_option(:account_id)
159
165
 
160
166
  response = if credential_exists
161
- update_credential(server, params, type)
167
+ update_credential(server, account_id, params, type)
162
168
  else
163
- create_credential(server, params)
169
+ create_credential(server, account_id, params)
164
170
  end
165
171
 
166
172
  handle_result_for('GCR', response)
@@ -185,11 +191,12 @@ module Uffizzi
185
191
  type: type,
186
192
  }
187
193
  server = ConfigFile.read_option(:server)
194
+ account_id = ConfigFile.read_option(:account_id)
188
195
 
189
196
  response = if credential_exists
190
- update_credential(server, params, type)
197
+ update_credential(server, account_id, params, type)
191
198
  else
192
- create_credential(server, params)
199
+ create_credential(server, account_id, params)
193
200
  end
194
201
 
195
202
  handle_result_for('GHCR', response)
@@ -221,8 +228,15 @@ module Uffizzi
221
228
 
222
229
  def credential_exists?(type)
223
230
  server = ConfigFile.read_option(:server)
224
- response = check_credential(server, type)
225
- !ResponseHelper.ok?(response)
231
+ account_id = ConfigFile.read_option(:account_id)
232
+ response = check_credential(server, account_id, type)
233
+ return false if ResponseHelper.ok?(response)
234
+ return true if ResponseHelper.unprocessable_entity?(response)
235
+
236
+ if ResponseHelper.forbidden?(response)
237
+ Uffizzi.ui.say('Unauthorized. Skipping credentials action.')
238
+ exit(true)
239
+ end
226
240
  end
227
241
 
228
242
  def handle_existing_credential_options(credential_type_slug)
@@ -24,7 +24,7 @@ module Uffizzi
24
24
  raise Uffizzi::Error.new('Unsupported credential type.')
25
25
  end
26
26
 
27
- response = delete_credential(ConfigFile.read_option(:server), connection_type)
27
+ response = delete_credential(ConfigFile.read_option(:server), ConfigFile.read_option(:account_id), connection_type)
28
28
 
29
29
  if ResponseHelper.no_content?(response)
30
30
  Uffizzi.ui.say("Successfully disconnected from #{connection_name(credential_type)}.")
@@ -61,6 +61,7 @@ module Uffizzi
61
61
  end
62
62
 
63
63
  def handle_succeed_response(response, server, username)
64
+ # TODO Choose a personal account
64
65
  account = response[:body][:user][:accounts].first
65
66
  return Uffizzi.ui.say('No account related to this email') unless account_valid?(account)
66
67
 
@@ -95,9 +96,11 @@ module Uffizzi
95
96
  end
96
97
  all_choices = choices + [{ name: 'Create a new project', value: nil }]
97
98
  answer = Uffizzi.prompt.select(question, all_choices)
98
- return ConfigFile.write_option(:project, answer) if answer
99
+ return create_new_project(server) unless answer
99
100
 
100
- create_new_project(server)
101
+ account_id = projects.detect { |project| project[:slug] == answer }[:account_id]
102
+ ConfigFile.write_option(:project, answer)
103
+ ConfigFile.write_option(:account_id, account_id)
101
104
  end
102
105
 
103
106
  def create_new_project(server)
@@ -116,7 +119,8 @@ module Uffizzi
116
119
  },
117
120
  }
118
121
 
119
- response = create_project(server, params)
122
+ account_id = ConfigFile.read_option(:account_id)
123
+ response = create_project(server, account_id, params)
120
124
 
121
125
  if ResponseHelper.created?(response)
122
126
  handle_create_project_succeess(response)
@@ -139,6 +143,7 @@ module Uffizzi
139
143
  project = response[:body][:project]
140
144
 
141
145
  ConfigFile.write_option(:project, project[:slug])
146
+ ConfigFile.write_option(:account_id, project[:account_id])
142
147
 
143
148
  Uffizzi.ui.say("Project #{project[:name]} was successfully created")
144
149
  end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'uffizzi'
4
+ require 'uffizzi/response_helper'
5
+ require 'uffizzi/clients/api/api_client'
6
+
7
+ module Uffizzi
8
+ class Cli::LoginByIdentityToken
9
+ include ApiClient
10
+
11
+ def initialize(options)
12
+ @options = options
13
+ end
14
+
15
+ def run
16
+ token = @options[:token]
17
+ server = @options[:server]
18
+ params = prepare_request_params(token)
19
+ response = create_ci_session(server, params)
20
+
21
+ if ResponseHelper.created?(response)
22
+ handle_succeed_response(response, server)
23
+ else
24
+ ResponseHelper.handle_failed_response(response)
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def prepare_request_params(token)
31
+ {
32
+ user: {
33
+ token: token,
34
+ },
35
+ }
36
+ end
37
+
38
+ def handle_succeed_response(response, server)
39
+ ConfigFile.write_option(:server, server)
40
+ ConfigFile.write_option(:cookie, response[:headers])
41
+ ConfigFile.write_option(:account_id, response[:body][:account_id])
42
+ ConfigFile.write_option(:project, response[:body][:project_slug])
43
+
44
+ Uffizzi.ui.say('Successful Login by Identity Token')
45
+ end
46
+ end
47
+ end
@@ -102,12 +102,13 @@ module Uffizzi
102
102
  raise Uffizzi::Error.new('Slug must not content spaces or special characters') unless slug.match?(/^[a-zA-Z0-9\-_]+\Z/i)
103
103
 
104
104
  server = ConfigFile.read_option(:server)
105
+ account_id = ConfigFile.read_option(:account_id)
105
106
  params = {
106
107
  name: name,
107
108
  description: options[:description],
108
109
  slug: slug,
109
110
  }
110
- response = create_project(server, params)
111
+ response = create_project(server, account_id, params)
111
112
 
112
113
  if ResponseHelper.created?(response)
113
114
  handle_create_success_response(response)
@@ -165,6 +166,7 @@ module Uffizzi
165
166
 
166
167
  def set_default_project(project)
167
168
  ConfigFile.write_option(:project, project[:slug])
169
+ ConfigFile.write_option(:account_id, project[:account_id])
168
170
  end
169
171
  end
170
172
  end
data/lib/uffizzi/cli.rb CHANGED
@@ -24,6 +24,14 @@ module Uffizzi
24
24
  Login.new(options).run
25
25
  end
26
26
 
27
+ desc 'login_by_identity_token [OPTIONS]', 'Login or register to Uffizzi to view and manage your previews'
28
+ method_option :server, required: true, aliases: '-s'
29
+ method_option :token, required: true, aliases: '-t'
30
+ def login_by_identity_token
31
+ require_relative 'cli/login_by_identity_token'
32
+ LoginByIdentityToken.new(options).run
33
+ end
34
+
27
35
  desc 'logout', 'Log out of a Uffizzi user account'
28
36
  def logout
29
37
  require_relative 'cli/logout'
@@ -13,6 +13,13 @@ module ApiClient
13
13
  build_response(response)
14
14
  end
15
15
 
16
+ def create_ci_session(server, params = {})
17
+ uri = ci_session_uri(server)
18
+ response = http_client.make_post_request(uri, params)
19
+
20
+ build_response(response)
21
+ end
22
+
16
23
  def destroy_session(server)
17
24
  uri = session_uri(server)
18
25
  response = http_client.make_delete_request(uri)
@@ -27,16 +34,16 @@ module ApiClient
27
34
  build_response(response)
28
35
  end
29
36
 
30
- def fetch_credentials(server)
31
- uri = credentials_uri(server)
37
+ def fetch_credentials(server, account_id)
38
+ uri = credentials_uri(server, account_id)
32
39
 
33
40
  response = http_client.make_get_request(uri)
34
41
 
35
42
  build_response(response)
36
43
  end
37
44
 
38
- def check_credential(server, type)
39
- uri = check_credential_uri(server, type)
45
+ def check_credential(server, account_id, type)
46
+ uri = check_credential_uri(server, account_id, type)
40
47
  response = http_client.make_get_request(uri)
41
48
 
42
49
  build_response(response)
@@ -49,8 +56,8 @@ module ApiClient
49
56
  build_response(response)
50
57
  end
51
58
 
52
- def create_project(server, params)
53
- uri = projects_uri(server)
59
+ def create_project(server, account_id, params)
60
+ uri = create_projects_uri(server, account_id)
54
61
  response = http_client.make_post_request(uri, params)
55
62
 
56
63
  build_response(response)
@@ -63,15 +70,15 @@ module ApiClient
63
70
  build_response(response)
64
71
  end
65
72
 
66
- def create_credential(server, params)
67
- uri = credentials_uri(server)
73
+ def create_credential(server, account_id, params)
74
+ uri = credentials_uri(server, account_id)
68
75
  response = http_client.make_post_request(uri, params)
69
76
 
70
77
  build_response(response)
71
78
  end
72
79
 
73
- def update_credential(server, params, type)
74
- uri = credential_uri(server, type)
80
+ def update_credential(server, account_id, params, type)
81
+ uri = credential_uri(server, account_id, type)
75
82
  response = http_client.make_put_request(uri, params)
76
83
 
77
84
  build_response(response)
@@ -84,8 +91,8 @@ module ApiClient
84
91
  build_response(response)
85
92
  end
86
93
 
87
- def delete_credential(server, credential_type)
88
- uri = credential_uri(server, credential_type)
94
+ def delete_credential(server, account_id, credential_type)
95
+ uri = credential_uri(server, account_id, credential_type)
89
96
  response = http_client.make_delete_request(uri)
90
97
 
91
98
  build_response(response)
@@ -15,6 +15,10 @@ module ApiRoutes
15
15
  "#{server}/api/cli/v1/projects"
16
16
  end
17
17
 
18
+ def create_projects_uri(server, account_id)
19
+ "#{server}/api/cli/v1/accounts/#{account_id}/projects"
20
+ end
21
+
18
22
  def secret_uri(server, project_slug, id)
19
23
  path_id = CGI.escape(id)
20
24
  "#{server}/api/cli/v1/projects/#{project_slug}/secrets/#{path_id}"
@@ -28,6 +32,10 @@ module ApiRoutes
28
32
  "#{server}/api/cli/v1/session"
29
33
  end
30
34
 
35
+ def ci_session_uri(server)
36
+ "#{server}/api/cli/v1/ci/session"
37
+ end
38
+
31
39
  def validate_compose_file_uri(server, project_slug)
32
40
  "#{compose_files_uri(server, project_slug)}/validate"
33
41
  end
@@ -54,20 +62,20 @@ module ApiRoutes
54
62
  "#{server}/api/cli/v1/projects/#{project_slug}/deployments/#{deployment_id}/events"
55
63
  end
56
64
 
57
- def check_credential_uri(server, type)
58
- "#{server}/api/cli/v1/account/credentials/#{type}/check_credential"
65
+ def check_credential_uri(server, account_id, type)
66
+ "#{server}/api/cli/v1/accounts/#{account_id}/credentials/#{type}/check_credential"
59
67
  end
60
68
 
61
- def credentials_uri(server)
62
- "#{server}/api/cli/v1/account/credentials"
69
+ def credentials_uri(server, account_id)
70
+ "#{server}/api/cli/v1/accounts/#{account_id}/credentials"
63
71
  end
64
72
 
65
73
  def preview_services_uri(server, project_slug, deployment_id)
66
74
  "#{server}/api/cli/v1/projects/#{project_slug}/deployments/#{deployment_id}/containers"
67
75
  end
68
76
 
69
- def credential_uri(server, credential_type)
70
- "#{server}/api/cli/v1/account/credentials/#{credential_type}"
77
+ def credential_uri(server, account_id, credential_type)
78
+ "#{server}/api/cli/v1/accounts/#{account_id}/credentials/#{credential_type}"
71
79
  end
72
80
 
73
81
  def preview_service_logs_uri(server, project_slug, deployment_id, container_name)
@@ -24,6 +24,7 @@ class ProjectService
24
24
  Uffizzi.ui.say("Project name: #{project[:name]}")
25
25
  Uffizzi.ui.say("Project slug: #{project[:slug]}")
26
26
  Uffizzi.ui.say("Description: #{project[:description]}".strip)
27
+ Uffizzi.ui.say("Account name: #{project[:account][:name]}".strip)
27
28
  Uffizzi.ui.say("Created: #{project[:created_at]}")
28
29
  default_compose = project[:default_compose].nil? ? nil : project[:default_compose][:source]
29
30
  Uffizzi.ui.say("Default compose: #{default_compose}".strip)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Uffizzi
4
- VERSION = '0.14.0'
4
+ VERSION = '1.0.0'
5
5
  end
@@ -0,0 +1,29 @@
1
+ .\" generated with Ronn-NG/v0.9.1
2
+ .\" http://github.com/apjanke/ronn-ng/tree/0.9.1
3
+ .TH "UFFIZZI\-LOGIN\-BY\-IDENTITY\-TOKEN" "" "August 2022" ""
4
+ .SH "NAME"
5
+ \fBuffizzi\-login\-by\-identity\-token\fR \- login to Uffizzi using a OIDC token provided by a CI/CD pipeline
6
+ .SH "SYNOPSIS"
7
+ .nf
8
+ uffizzi uffizzi\-login\-by\-identity\-token [UFFIZZI_WIDE_FLAG \|\.\|\.\|\.]
9
+ .fi
10
+ .SH "DESCRIPTION"
11
+ .nf
12
+ The uffizzi login command lets you authenticate with Uffizzi from a CI/CD pipeline\.
13
+ If a user/account do not exist, Uffizzi will create them based on token payload\.
14
+
15
+ For more information on authentication and credential types, see:
16
+ https://github\.com/UffizziCloud/uffizzi_cli
17
+ .fi
18
+ .SH "UFFIZZI WIDE FLAGS"
19
+ .nf
20
+ These flags are available to all commands: \-\-project\. Run $ uffizzi
21
+ help for details\.
22
+ .fi
23
+ .SH "EXAMPLES"
24
+ .nf
25
+ To login from the CI/CD pipeline, run:
26
+
27
+ $ uffizzi uffizzi\-login\-by\-identity\-token \-\-server=uffizzi\.example\.com \-\-token=[$CI_JOB_TOKEN]
28
+ .fi
29
+
@@ -0,0 +1,106 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv='content-type' content='text/html;charset=utf8'>
5
+ <meta name='generator' content='Ronn-NG/v0.9.1 (http://github.com/apjanke/ronn-ng/tree/0.9.1)'>
6
+ <title>login to Uffizzi using a OIDC token provided by a CI/CD pipeline</title>
7
+ <style type='text/css' media='all'>
8
+ /* style: man */
9
+ body#manpage {margin:0}
10
+ .mp {max-width:100ex;padding:0 9ex 1ex 4ex}
11
+ .mp p,.mp pre,.mp ul,.mp ol,.mp dl {margin:0 0 20px 0}
12
+ .mp h2 {margin:10px 0 0 0}
13
+ .mp > p,.mp > pre,.mp > ul,.mp > ol,.mp > dl {margin-left:8ex}
14
+ .mp h3 {margin:0 0 0 4ex}
15
+ .mp dt {margin:0;clear:left}
16
+ .mp dt.flush {float:left;width:8ex}
17
+ .mp dd {margin:0 0 0 9ex}
18
+ .mp h1,.mp h2,.mp h3,.mp h4 {clear:left}
19
+ .mp pre {margin-bottom:20px}
20
+ .mp pre+h2,.mp pre+h3 {margin-top:22px}
21
+ .mp h2+pre,.mp h3+pre {margin-top:5px}
22
+ .mp img {display:block;margin:auto}
23
+ .mp h1.man-title {display:none}
24
+ .mp,.mp code,.mp pre,.mp tt,.mp kbd,.mp samp,.mp h3,.mp h4 {font-family:monospace;font-size:14px;line-height:1.42857142857143}
25
+ .mp h2 {font-size:16px;line-height:1.25}
26
+ .mp h1 {font-size:20px;line-height:2}
27
+ .mp {text-align:justify;background:#fff}
28
+ .mp,.mp code,.mp pre,.mp pre code,.mp tt,.mp kbd,.mp samp {color:#131211}
29
+ .mp h1,.mp h2,.mp h3,.mp h4 {color:#030201}
30
+ .mp u {text-decoration:underline}
31
+ .mp code,.mp strong,.mp b {font-weight:bold;color:#131211}
32
+ .mp em,.mp var {font-style:italic;color:#232221;text-decoration:none}
33
+ .mp a,.mp a:link,.mp a:hover,.mp a code,.mp a pre,.mp a tt,.mp a kbd,.mp a samp {color:#0000ff}
34
+ .mp b.man-ref {font-weight:normal;color:#434241}
35
+ .mp pre {padding:0 4ex}
36
+ .mp pre code {font-weight:normal;color:#434241}
37
+ .mp h2+pre,h3+pre {padding-left:0}
38
+ ol.man-decor,ol.man-decor li {margin:3px 0 10px 0;padding:0;float:left;width:33%;list-style-type:none;text-transform:uppercase;color:#999;letter-spacing:1px}
39
+ ol.man-decor {width:100%}
40
+ ol.man-decor li.tl {text-align:left}
41
+ ol.man-decor li.tc {text-align:center;letter-spacing:4px}
42
+ ol.man-decor li.tr {text-align:right;float:right}
43
+ </style>
44
+ </head>
45
+ <!--
46
+ The following styles are deprecated and will be removed at some point:
47
+ div#man, div#man ol.man, div#man ol.head, div#man ol.man.
48
+
49
+ The .man-page, .man-decor, .man-head, .man-foot, .man-title, and
50
+ .man-navigation should be used instead.
51
+ -->
52
+ <body id='manpage'>
53
+ <div class='mp' id='man'>
54
+
55
+ <div class='man-navigation' style='display:none'>
56
+ <a href="#NAME">NAME</a>
57
+ <a href="#SYNOPSIS">SYNOPSIS</a>
58
+ <a href="#DESCRIPTION">DESCRIPTION</a>
59
+ <a href="#UFFIZZI-WIDE-FLAGS">UFFIZZI WIDE FLAGS</a>
60
+ <a href="#EXAMPLES">EXAMPLES</a>
61
+ </div>
62
+
63
+ <ol class='man-decor man-head man head'>
64
+ <li class='tl'>uffizzi-login-by-identity-token</li>
65
+ <li class='tc'></li>
66
+ <li class='tr'>uffizzi-login-by-identity-token</li>
67
+ </ol>
68
+
69
+
70
+
71
+ <h2 id="NAME">NAME</h2>
72
+ <p class="man-name">
73
+ <code>uffizzi-login-by-identity-token</code> - <span class="man-whatis">login to Uffizzi using a OIDC token provided by a CI/CD pipeline</span>
74
+ </p>
75
+ <h2 id="SYNOPSIS">SYNOPSIS</h2>
76
+ <pre><code>uffizzi uffizzi-login-by-identity-token [UFFIZZI_WIDE_FLAG ...]
77
+ </code></pre>
78
+
79
+ <h2 id="DESCRIPTION">DESCRIPTION</h2>
80
+ <pre><code>The uffizzi login command lets you authenticate with Uffizzi from a CI/CD pipeline.
81
+ If a user/account do not exist, Uffizzi will create them based on token payload.
82
+
83
+ For more information on authentication and credential types, see:
84
+ https://github.com/UffizziCloud/uffizzi_cli
85
+ </code></pre>
86
+
87
+ <h2 id="UFFIZZI-WIDE-FLAGS">UFFIZZI WIDE FLAGS</h2>
88
+ <pre><code>These flags are available to all commands: --project. Run $ uffizzi
89
+ help for details.
90
+ </code></pre>
91
+
92
+ <h2 id="EXAMPLES">EXAMPLES</h2>
93
+ <pre><code>To login from the CI/CD pipeline, run:
94
+
95
+ $ uffizzi uffizzi-login-by-identity-token --server=uffizzi.example.com --token=[$CI_JOB_TOKEN]
96
+ </code></pre>
97
+
98
+ <ol class='man-decor man-foot man foot'>
99
+ <li class='tl'></li>
100
+ <li class='tc'>August 2022</li>
101
+ <li class='tr'>uffizzi-login-by-identity-token</li>
102
+ </ol>
103
+
104
+ </div>
105
+ </body>
106
+ </html>
@@ -0,0 +1,21 @@
1
+ uffizzi-login-by-identity-token - login to Uffizzi using a OIDC token provided by a CI/CD pipeline
2
+ ================================================================
3
+
4
+ ## SYNOPSIS
5
+ uffizzi uffizzi-login-by-identity-token [UFFIZZI_WIDE_FLAG ...]
6
+
7
+ ## DESCRIPTION
8
+ The uffizzi login command lets you authenticate with Uffizzi from a CI/CD pipeline.
9
+ If a user/account do not exist, Uffizzi will create them based on token payload.
10
+
11
+ For more information on authentication and credential types, see:
12
+ https://github.com/UffizziCloud/uffizzi_cli
13
+
14
+ ## UFFIZZI WIDE FLAGS
15
+ These flags are available to all commands: --project. Run $ uffizzi
16
+ help for details.
17
+
18
+ ## EXAMPLES
19
+ To login from the CI/CD pipeline, run:
20
+
21
+ $ uffizzi uffizzi-login-by-identity-token --server=uffizzi.example.com --token=[$CI_JOB_TOKEN]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uffizzi-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Thurman
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2022-08-22 00:00:00.000000000 Z
12
+ date: 2022-08-31 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: awesome_print
@@ -325,6 +325,7 @@ files:
325
325
  - lib/uffizzi/cli/connect.rb
326
326
  - lib/uffizzi/cli/disconnect.rb
327
327
  - lib/uffizzi/cli/login.rb
328
+ - lib/uffizzi/cli/login_by_identity_token.rb
328
329
  - lib/uffizzi/cli/logout.rb
329
330
  - lib/uffizzi/cli/preview.rb
330
331
  - lib/uffizzi/cli/preview/service.rb
@@ -368,6 +369,9 @@ files:
368
369
  - man/uffizzi-disconnect
369
370
  - man/uffizzi-disconnect.ronn
370
371
  - man/uffizzi-login
372
+ - man/uffizzi-login-by-identity-token
373
+ - man/uffizzi-login-by-identity-token.html
374
+ - man/uffizzi-login-by-identity-token.ronn
371
375
  - man/uffizzi-login.ronn
372
376
  - man/uffizzi-logout
373
377
  - man/uffizzi-logout.ronn