circleci-cli 0.6.3 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +21 -19
- data/bin/circle +2 -2
- data/bin/console +1 -1
- data/{circler.gemspec → circleci-cli.gemspec} +3 -3
- data/exe/{circle → circleci-cli} +2 -2
- data/lib/circleci/cli.rb +77 -0
- data/lib/circleci/cli/command.rb +16 -0
- data/lib/circleci/cli/command/base_command.rb +45 -0
- data/lib/circleci/cli/command/browse_command.rb +24 -0
- data/lib/circleci/cli/command/build_command.rb +19 -0
- data/lib/circleci/cli/command/builds_command.rb +25 -0
- data/lib/circleci/cli/command/cancel_command.rb +23 -0
- data/lib/circleci/cli/command/projects_command.rb +16 -0
- data/lib/circleci/cli/command/retry_command.rb +23 -0
- data/lib/circleci/cli/command/watch_command.rb +77 -0
- data/lib/circleci/cli/networking.rb +9 -0
- data/lib/circleci/cli/networking/pusher_client.rb +62 -0
- data/lib/circleci/cli/printer.rb +11 -0
- data/lib/circleci/cli/printer/build_printer.rb +63 -0
- data/lib/circleci/cli/printer/project_printer.rb +37 -0
- data/lib/circleci/cli/printer/step_printer.rb +57 -0
- data/lib/circleci/cli/response.rb +13 -0
- data/lib/circleci/cli/response/account.rb +21 -0
- data/lib/circleci/cli/response/action.rb +39 -0
- data/lib/circleci/cli/response/build.rb +104 -0
- data/lib/circleci/cli/response/project.rb +21 -0
- data/lib/circleci/cli/response/step.rb +22 -0
- data/lib/circleci/cli/version.rb +7 -0
- data/lib/circleci_cli.rb +7 -0
- metadata +29 -25
- data/lib/circler.rb +0 -6
- data/lib/circler/cli.rb +0 -88
- data/lib/circler/command/base_command.rb +0 -41
- data/lib/circler/command/browse_command.rb +0 -20
- data/lib/circler/command/build_command.rb +0 -15
- data/lib/circler/command/builds_command.rb +0 -21
- data/lib/circler/command/cancel_command.rb +0 -19
- data/lib/circler/command/projects_command.rb +0 -12
- data/lib/circler/command/retry_command.rb +0 -19
- data/lib/circler/command/watch_command.rb +0 -73
- data/lib/circler/networking/pusher_client.rb +0 -56
- data/lib/circler/printer/build_printer.rb +0 -59
- data/lib/circler/printer/project_printer.rb +0 -33
- data/lib/circler/printer/step_printer.rb +0 -53
- data/lib/circler/response/account.rb +0 -17
- data/lib/circler/response/action.rb +0 -35
- data/lib/circler/response/build.rb +0 -100
- data/lib/circler/response/project.rb +0 -17
- data/lib/circler/response/step.rb +0 -18
- data/lib/circler/version.rb +0 -5
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CircleCI
|
4
|
+
module CLI
|
5
|
+
module Response
|
6
|
+
class Step
|
7
|
+
attr_reader :type
|
8
|
+
attr_reader :status
|
9
|
+
|
10
|
+
def initialize(type, hash)
|
11
|
+
@type = type
|
12
|
+
@status = hash['status']
|
13
|
+
@hash = hash
|
14
|
+
end
|
15
|
+
|
16
|
+
def actions
|
17
|
+
@hash['actions'].map { |a| Action.new(a) }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/circleci_cli.rb
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: circleci-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- unhappychoice
|
@@ -298,7 +298,7 @@ description: A command line tool for CircleCI
|
|
298
298
|
email:
|
299
299
|
- unhappychoice@gmail.com
|
300
300
|
executables:
|
301
|
-
-
|
301
|
+
- circleci-cli
|
302
302
|
extensions: []
|
303
303
|
extra_rdoc_files: []
|
304
304
|
files:
|
@@ -314,30 +314,34 @@ files:
|
|
314
314
|
- bin/circle
|
315
315
|
- bin/console
|
316
316
|
- bin/setup
|
317
|
-
-
|
318
|
-
- exe/
|
319
|
-
- lib/
|
320
|
-
- lib/
|
321
|
-
- lib/
|
322
|
-
- lib/
|
323
|
-
- lib/
|
324
|
-
- lib/
|
325
|
-
- lib/
|
326
|
-
- lib/
|
327
|
-
- lib/
|
328
|
-
- lib/
|
329
|
-
- lib/
|
330
|
-
- lib/
|
331
|
-
- lib/
|
332
|
-
- lib/
|
333
|
-
- lib/
|
334
|
-
- lib/
|
335
|
-
- lib/
|
336
|
-
- lib/
|
337
|
-
- lib/
|
338
|
-
- lib/
|
317
|
+
- circleci-cli.gemspec
|
318
|
+
- exe/circleci-cli
|
319
|
+
- lib/circleci/cli.rb
|
320
|
+
- lib/circleci/cli/command.rb
|
321
|
+
- lib/circleci/cli/command/base_command.rb
|
322
|
+
- lib/circleci/cli/command/browse_command.rb
|
323
|
+
- lib/circleci/cli/command/build_command.rb
|
324
|
+
- lib/circleci/cli/command/builds_command.rb
|
325
|
+
- lib/circleci/cli/command/cancel_command.rb
|
326
|
+
- lib/circleci/cli/command/projects_command.rb
|
327
|
+
- lib/circleci/cli/command/retry_command.rb
|
328
|
+
- lib/circleci/cli/command/watch_command.rb
|
329
|
+
- lib/circleci/cli/networking.rb
|
330
|
+
- lib/circleci/cli/networking/pusher_client.rb
|
331
|
+
- lib/circleci/cli/printer.rb
|
332
|
+
- lib/circleci/cli/printer/build_printer.rb
|
333
|
+
- lib/circleci/cli/printer/project_printer.rb
|
334
|
+
- lib/circleci/cli/printer/step_printer.rb
|
335
|
+
- lib/circleci/cli/response.rb
|
336
|
+
- lib/circleci/cli/response/account.rb
|
337
|
+
- lib/circleci/cli/response/action.rb
|
338
|
+
- lib/circleci/cli/response/build.rb
|
339
|
+
- lib/circleci/cli/response/project.rb
|
340
|
+
- lib/circleci/cli/response/step.rb
|
341
|
+
- lib/circleci/cli/version.rb
|
342
|
+
- lib/circleci_cli.rb
|
339
343
|
- movie/rec.gif
|
340
|
-
homepage: https://github.com/unhappychoice/
|
344
|
+
homepage: https://github.com/unhappychoice/circleci-cli
|
341
345
|
licenses:
|
342
346
|
- MIT
|
343
347
|
metadata: {}
|
data/lib/circler.rb
DELETED
data/lib/circler/cli.rb
DELETED
@@ -1,88 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'thor'
|
4
|
-
require 'faraday'
|
5
|
-
require 'launchy'
|
6
|
-
require 'terminal-table'
|
7
|
-
require 'highline/import'
|
8
|
-
require 'colorize'
|
9
|
-
require 'rugged'
|
10
|
-
require 'circleci'
|
11
|
-
require 'terminal-notifier'
|
12
|
-
require 'circler'
|
13
|
-
require 'circler/version'
|
14
|
-
require 'circler/command/base_command'
|
15
|
-
require 'circler/command/projects_command'
|
16
|
-
require 'circler/command/builds_command'
|
17
|
-
require 'circler/command/build_command'
|
18
|
-
require 'circler/command/browse_command'
|
19
|
-
require 'circler/command/watch_command'
|
20
|
-
require 'circler/command/retry_command'
|
21
|
-
require 'circler/command/cancel_command'
|
22
|
-
require 'circler/response/account'
|
23
|
-
require 'circler/response/project'
|
24
|
-
require 'circler/response/build'
|
25
|
-
require 'circler/response/step'
|
26
|
-
require 'circler/response/action'
|
27
|
-
require 'circler/printer/project_printer'
|
28
|
-
require 'circler/printer/build_printer'
|
29
|
-
require 'circler/printer/step_printer'
|
30
|
-
require 'circler/networking/pusher_client'
|
31
|
-
|
32
|
-
module Circler
|
33
|
-
class CLI < Thor
|
34
|
-
desc 'projects', 'list projects'
|
35
|
-
method_option :format, aliases: 'f', type: :string, banner: 'pretty/simple'
|
36
|
-
def projects
|
37
|
-
ProjectsCommand.run(options)
|
38
|
-
end
|
39
|
-
|
40
|
-
desc 'builds', 'list builds'
|
41
|
-
method_option :project, aliases: 'p', type: :string, banner: 'user/project'
|
42
|
-
method_option :branch, aliases: 'b', type: :string, banner: 'some-branch'
|
43
|
-
method_option :format, aliases: 'f', type: :string, banner: 'pretty/simple'
|
44
|
-
def builds
|
45
|
-
BuildsCommand.run(options)
|
46
|
-
end
|
47
|
-
|
48
|
-
desc 'build', 'show build description'
|
49
|
-
method_option :project, aliases: 'p', type: :string, banner: 'user/project'
|
50
|
-
method_option :build, aliases: 'n', type: :numeric, banner: 'build-number'
|
51
|
-
def build
|
52
|
-
BuildCommand.run(options)
|
53
|
-
end
|
54
|
-
|
55
|
-
desc 'browse', 'open circle ci website'
|
56
|
-
method_option :project, aliases: 'p', type: :string, banner: 'user/project'
|
57
|
-
method_option :build, aliases: 'n', type: :numeric, banner: 'build-number'
|
58
|
-
def browse
|
59
|
-
BrowseCommand.run(options)
|
60
|
-
end
|
61
|
-
|
62
|
-
desc 'retry', 'retry a build'
|
63
|
-
method_option :project, aliases: 'p', type: :string, banner: 'user/project'
|
64
|
-
method_option :build, aliases: 'n', type: :numeric, banner: 'build-number'
|
65
|
-
def retry
|
66
|
-
RetryCommand.run(options)
|
67
|
-
end
|
68
|
-
|
69
|
-
desc 'cancel', 'cancel a build'
|
70
|
-
method_option :project, aliases: 'p', type: :string, banner: 'user/project'
|
71
|
-
method_option :build, aliases: 'n', type: :numeric, banner: 'build-number'
|
72
|
-
def cancel
|
73
|
-
CancelCommand.run(options)
|
74
|
-
end
|
75
|
-
|
76
|
-
desc 'watch', 'watch a build in real time'
|
77
|
-
method_option :project, aliases: 'p', type: :string, banner: 'user/project'
|
78
|
-
method_option :build, aliases: 'n', type: :numeric, banner: 'build-number'
|
79
|
-
def watch
|
80
|
-
WatchCommand.run(options)
|
81
|
-
end
|
82
|
-
|
83
|
-
desc 'version', 'show gem version'
|
84
|
-
def version
|
85
|
-
say Circler::VERSION
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Circler
|
4
|
-
class BaseCommand
|
5
|
-
class << self
|
6
|
-
def setup_token
|
7
|
-
CircleCi.configure do |config|
|
8
|
-
config.token = ENV['CIRCLE_CI_TOKEN'] || ask('Circle CI token ? :')
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
def project_name(options)
|
13
|
-
if options.project
|
14
|
-
options.project
|
15
|
-
elsif reponame
|
16
|
-
reponame
|
17
|
-
else
|
18
|
-
say ProjectPrinter.new(Project.all).to_s
|
19
|
-
ask('Input user-name/project-name :')
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def reponame
|
24
|
-
repository = Rugged::Repository.new('.')
|
25
|
-
origin = repository.remotes.find { |r| r.name == 'origin' }
|
26
|
-
regexp = %r{git@github.com(?::|/)([\w_-]+/[\w_-]+)(?:\.git)*}
|
27
|
-
return Regexp.last_match(1) if origin.url =~ regexp
|
28
|
-
|
29
|
-
nil
|
30
|
-
end
|
31
|
-
|
32
|
-
def build_number(options)
|
33
|
-
options.build || ask('Input build number')
|
34
|
-
end
|
35
|
-
|
36
|
-
def should_be_pretty(options)
|
37
|
-
options['format'] != 'simple'
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Circler
|
4
|
-
class BrowseCommand < BaseCommand
|
5
|
-
class << self
|
6
|
-
def run(options)
|
7
|
-
setup_token
|
8
|
-
project = project_name(options)
|
9
|
-
number = options.build
|
10
|
-
Launchy.open url(project, number)
|
11
|
-
end
|
12
|
-
|
13
|
-
def url(project, number)
|
14
|
-
return "https://circleci.com/gh/#{project}" unless number
|
15
|
-
|
16
|
-
"https://circleci.com/gh/#{project}/#{number}"
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Circler
|
4
|
-
class BuildCommand < BaseCommand
|
5
|
-
class << self
|
6
|
-
def run(options)
|
7
|
-
setup_token
|
8
|
-
username, reponame = project_name(options).split('/')
|
9
|
-
number = build_number(options)
|
10
|
-
build = Build.get(username, reponame, number)
|
11
|
-
say StepPrinter.new(build.steps).to_s
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Circler
|
4
|
-
class BuildsCommand < BaseCommand
|
5
|
-
class << self
|
6
|
-
def run(options)
|
7
|
-
setup_token
|
8
|
-
username, reponame = project_name(options).split('/')
|
9
|
-
|
10
|
-
builds =
|
11
|
-
if options.branch
|
12
|
-
Build.branch(username, reponame, options.branch)
|
13
|
-
else
|
14
|
-
Build.all(username, reponame)
|
15
|
-
end
|
16
|
-
|
17
|
-
say BuildPrinter.new(builds, pretty: should_be_pretty(options)).to_s
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Circler
|
4
|
-
class CancelCommand < BaseCommand
|
5
|
-
class << self
|
6
|
-
def run(options)
|
7
|
-
setup_token
|
8
|
-
username, reponame = project_name(options).split('/')
|
9
|
-
number = build_number(options)
|
10
|
-
build = Build.cancel(username, reponame, number)
|
11
|
-
if build.username
|
12
|
-
say "build #{build.project_name} #{build.build_number} is canceled."
|
13
|
-
else
|
14
|
-
say "failed to cancel #{username}/#{reponame} #{number}."
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Circler
|
4
|
-
class RetryCommand < BaseCommand
|
5
|
-
class << self
|
6
|
-
def run(options)
|
7
|
-
setup_token
|
8
|
-
username, reponame = project_name(options).split('/')
|
9
|
-
number = build_number(options)
|
10
|
-
build = Build.retry(username, reponame, number)
|
11
|
-
if build.username
|
12
|
-
say "build #{username}/#{reponame} #{build.build_number} is triggered"
|
13
|
-
else
|
14
|
-
say "failed to trigger #{username}/#{reponame} #{number}"
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,73 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Circler
|
4
|
-
class WatchCommand < BaseCommand
|
5
|
-
class << self
|
6
|
-
def run(options)
|
7
|
-
setup_token
|
8
|
-
setup_client
|
9
|
-
|
10
|
-
build = get_build(options)
|
11
|
-
|
12
|
-
if build&.running?
|
13
|
-
start_watch(build)
|
14
|
-
wait_until_finish
|
15
|
-
finalize(build, build.channel_name)
|
16
|
-
else
|
17
|
-
say 'The build is not running'
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def setup_client
|
24
|
-
@client = CirclerPusherClient.new
|
25
|
-
@client.connect
|
26
|
-
end
|
27
|
-
|
28
|
-
def get_build(options)
|
29
|
-
username, reponame = project_name(options).split('/')
|
30
|
-
number = build_number options
|
31
|
-
Build.get(username, reponame, number)
|
32
|
-
end
|
33
|
-
|
34
|
-
def start_watch(build)
|
35
|
-
@running = true
|
36
|
-
text = "Start watching #{build.project_name} ##{build.build_number}"
|
37
|
-
print_bordered text
|
38
|
-
TerminalNotifier.notify text
|
39
|
-
|
40
|
-
bind_event_handling build.channel_name
|
41
|
-
end
|
42
|
-
|
43
|
-
def bind_event_handling(channel)
|
44
|
-
@client.bind_event_json(channel, 'newAction') do |json|
|
45
|
-
print_bordered json['log']['name'].green
|
46
|
-
end
|
47
|
-
|
48
|
-
@client.bind_event_json(channel, 'appendAction') do |json|
|
49
|
-
say json['out']['message']
|
50
|
-
end
|
51
|
-
|
52
|
-
@client.bind_event_json(channel, 'updateAction') do |json|
|
53
|
-
@running = json['log']['name'] != 'Disable SSH'
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def wait_until_finish
|
58
|
-
sleep(1) while @running
|
59
|
-
end
|
60
|
-
|
61
|
-
def finalize(build, channel)
|
62
|
-
@client.unsubscribe(channel)
|
63
|
-
text = "Finish watching #{build.project_name} ##{build.build_number}"
|
64
|
-
print_bordered text.blue
|
65
|
-
TerminalNotifier.notify text
|
66
|
-
end
|
67
|
-
|
68
|
-
def print_bordered(text)
|
69
|
-
say Terminal::Table.new(rows: [[text]], style: { width: 120 }).to_s
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
@@ -1,56 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'pusher-client'
|
4
|
-
|
5
|
-
class CirclerPusherClient
|
6
|
-
def connect
|
7
|
-
PusherClient.logger.level = Logger::ERROR
|
8
|
-
@socket = PusherClient::Socket.new(app_key, pusher_options)
|
9
|
-
@socket.connect(true)
|
10
|
-
end
|
11
|
-
|
12
|
-
def bind(channel, event)
|
13
|
-
@socket.subscribe(channel)
|
14
|
-
@socket[channel].bind(event) do |data|
|
15
|
-
yield data
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def bind_event_json(channel, event)
|
20
|
-
bind(channel, event) do |data|
|
21
|
-
JSON.parse(data).each { |json| yield(json) }
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def unsubscribe(channel)
|
26
|
-
@socket.unsubscribe(channel)
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
def app_key
|
32
|
-
'1cf6e0e755e419d2ac9a'
|
33
|
-
end
|
34
|
-
|
35
|
-
def pusher_options
|
36
|
-
{
|
37
|
-
secure: true,
|
38
|
-
auth_method: proc { |a, b| auth(a, b) },
|
39
|
-
logger: Logger.new('/dev/null')
|
40
|
-
}
|
41
|
-
end
|
42
|
-
|
43
|
-
def auth(socket_id, channel)
|
44
|
-
data = { socket_id: socket_id, channel_name: channel.name }
|
45
|
-
token = ENV['CIRCLE_CI_TOKEN'] || ask('Circle CI token ? :')
|
46
|
-
res = connection.post("/auth/pusher?circle-token=#{token}", data)
|
47
|
-
JSON.parse(res.body)['auth']
|
48
|
-
end
|
49
|
-
|
50
|
-
def connection
|
51
|
-
Faraday.new(url: 'https://circleci.com') do |f|
|
52
|
-
f.request :url_encoded
|
53
|
-
f.adapter Faraday.default_adapter
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|