codebuild-tail 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 725f46b3de3bd6b62ec3103f2f9dfb250b36a40d
4
+ data.tar.gz: d3c99c52a294767bfdf85bb108461a36950a213a
5
+ SHA512:
6
+ metadata.gz: 220fcf23d5428dd8c95ea796f1a9eff3e36b343c368aaf3382bd5f6cafb9637a46a3c7bbfb3472172fbc045f14efb0dbfb6920662b5fd7898be7aad6d09349bf
7
+ data.tar.gz: 4a2c100af5a95112bcae79fa01a19e339543acd2816547eefd938134f5daf1630dd82dff7d1282422b7f4459a8d9f1285fb377ab2beacf61c363808e5c733a72
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'code_build_tail/main'
4
+
5
+ STDOUT.sync = true
6
+ main = CodeBuildTail::Main.new($stdin)
7
+ exit(main.run)
@@ -0,0 +1,37 @@
1
+
2
+ module CodeBuildTail
3
+ class Build
4
+ attr_reader :build_id, :build, :refresh_count
5
+ def initialize(client, build_id)
6
+ @refresh_count = 0
7
+ @client = client
8
+ @build_id = build_id
9
+ end
10
+
11
+ def logs
12
+ @build.logs
13
+ end
14
+
15
+ def missing?
16
+ @build.nil?
17
+ end
18
+
19
+ def running?
20
+ @build.build_status == "IN_PROGRESS"
21
+ end
22
+
23
+ def successful?
24
+ @build.build_status == "SUCCEEDED"
25
+ end
26
+
27
+ def refresh
28
+ response = @client.batch_get_builds({ ids: [@build_id] })
29
+ @refresh_count += 1
30
+ @build = if response[:builds].empty?
31
+ nil
32
+ else
33
+ response[:builds][0]
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,34 @@
1
+
2
+ module CodeBuildTail
3
+ class Logs
4
+ def initialize(_cloudwatch_client, poll_from_start, log_limit)
5
+ @log_limit = log_limit
6
+ @next_forward_token = nil
7
+ @poll_from_start = poll_from_start
8
+ @cloudwatch_client = Aws::CloudWatchLogs::Client.new
9
+ end
10
+
11
+ def get_latest_logs(group_name, stream_name)
12
+ params = {
13
+ log_group_name: group_name,
14
+ log_stream_name: stream_name,
15
+ next_token: @next_forward_token,
16
+ start_from_head: @poll_from_start,
17
+ limit: @log_limit
18
+ }
19
+ resp = @cloudwatch_client.get_log_events(params)
20
+ @next_forward_token = resp.next_forward_token
21
+ resp.events
22
+ end
23
+
24
+ def poll_and_show_logs(group_name, stream_name)
25
+ log_events = get_latest_logs(group_name, stream_name)
26
+ until log_events.empty?
27
+ log_events.each do |event|
28
+ print event.message
29
+ end
30
+ log_events = get_latest_logs(group_name, stream_name)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,64 @@
1
+
2
+ require 'json'
3
+ require 'aws-sdk-codebuild'
4
+ require 'aws-sdk-cloudwatchlogs'
5
+ require 'code_build_tail/logs'
6
+ require 'code_build_tail/build'
7
+
8
+ module CodeBuildTail
9
+ class Main
10
+ def initialize(source)
11
+ @source = source
12
+ @logs = CodeBuildTail::Logs.new(Aws::CloudWatchLogs::Client.new, true, 100)
13
+ end
14
+
15
+ def read_build
16
+ build_str = @source.read
17
+ JSON.parse(build_str)
18
+ rescue JSON::ParserError => e
19
+ puts e
20
+ nil
21
+ end
22
+
23
+ def run
24
+ build_hash = read_build
25
+ if build_hash.nil?
26
+ puts "Unable to parse build"
27
+ return 1
28
+ end
29
+ unless build_hash.key?("build") && build_hash["build"].key?("id")
30
+ puts "Parsed build json, but no id field"
31
+ return 1
32
+ end
33
+ @build = CodeBuildTail::Build.new(Aws::CodeBuild::Client.new, build_hash["build"]["id"])
34
+ follow_build
35
+ end
36
+
37
+ def follow_build
38
+ @build.refresh
39
+ if @build.missing?
40
+ puts "No build found for id #{@build.build_id}"
41
+ return 1
42
+ end
43
+
44
+ loop do
45
+ @logs.poll_and_show_logs(@build.logs.group_name, @build.logs.stream_name) unless @build.logs.nil?
46
+ @build.refresh
47
+ break unless @build.running?
48
+
49
+ # Prevent us from getting rate limitted.
50
+ sleep(sleep_time)
51
+ end
52
+ @logs.poll_and_show_logs(@build.logs.group_name, @build.logs.stream_name) unless @build.logs.nil?
53
+ if @build.successful?
54
+ 0
55
+ else
56
+ 1
57
+ end
58
+ end
59
+
60
+ def sleep_time
61
+ 5 + @build.refresh_count
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,5 @@
1
+
2
+
3
+ module CodeBuildTail
4
+ VERSION = "0.1.0".freeze
5
+ end
@@ -0,0 +1,5 @@
1
+
2
+
3
+ require "code_build_tail/build"
4
+ require "code_build_tail/logs"
5
+ require "code_build_tail/main"
metadata ADDED
@@ -0,0 +1,108 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: codebuild-tail
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Mark Roddy
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-08-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.8'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.8'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rubocop
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.43.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.43.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: aws-sdk-cloudwatchlogs
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.23'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.23'
55
+ - !ruby/object:Gem::Dependency
56
+ name: aws-sdk-codebuild
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.38'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.38'
69
+ description: codebuild-tail lets you follow the progress of running AWS CodeBuild
70
+ jobs
71
+ email:
72
+ - mroddy@primary.com
73
+ executables:
74
+ - codebuild-tail
75
+ extensions: []
76
+ extra_rdoc_files: []
77
+ files:
78
+ - bin/codebuild-tail
79
+ - lib/code_build_tail.rb
80
+ - lib/code_build_tail/build.rb
81
+ - lib/code_build_tail/logs.rb
82
+ - lib/code_build_tail/main.rb
83
+ - lib/code_build_tail/version.rb
84
+ homepage: https://github.com/PrimaryKids/codebuild-tail
85
+ licenses:
86
+ - Apache
87
+ metadata: {}
88
+ post_install_message:
89
+ rdoc_options: []
90
+ require_paths:
91
+ - lib
92
+ required_ruby_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ required_rubygems_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ requirements: []
103
+ rubyforge_project:
104
+ rubygems_version: 2.4.5.1
105
+ signing_key:
106
+ specification_version: 4
107
+ summary: Follow the status of CodeBuild jobs
108
+ test_files: []