codebuild-tail 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []