buildkite-builder 1.0.0.beta.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +118 -14
  3. data/VERSION +1 -0
  4. data/bin/buildkite-builder +1 -1
  5. data/exe/buildkite-builder +6 -0
  6. data/lib/buildkite/builder.rb +12 -17
  7. data/lib/buildkite/builder/commands.rb +1 -0
  8. data/lib/buildkite/builder/commands/abstract.rb +1 -1
  9. data/lib/buildkite/builder/commands/preview.rb +10 -8
  10. data/lib/buildkite/builder/commands/run.rb +27 -0
  11. data/lib/buildkite/builder/context.rb +70 -0
  12. data/lib/buildkite/builder/loaders/abstract.rb +6 -10
  13. data/lib/buildkite/builder/loaders/manifests.rb +1 -1
  14. data/lib/buildkite/builder/loaders/processors.rb +2 -2
  15. data/lib/buildkite/builder/loaders/templates.rb +1 -1
  16. data/lib/buildkite/builder/manifest.rb +1 -1
  17. data/lib/buildkite/builder/processors/abstract.rb +7 -7
  18. data/lib/buildkite/builder/rainbow.rb +1 -1
  19. data/lib/buildkite/builder/runner.rb +26 -63
  20. data/lib/buildkite/pipelines.rb +1 -0
  21. data/lib/buildkite/pipelines/pipeline.rb +20 -9
  22. data/lib/buildkite/pipelines/step_context.rb +23 -0
  23. data/lib/buildkite/pipelines/steps/abstract.rb +4 -3
  24. data/lib/buildkite/pipelines/steps/block.rb +1 -0
  25. metadata +116 -36
  26. data/.gitignore +0 -11
  27. data/.rspec +0 -3
  28. data/CODE_OF_CONDUCT.md +0 -74
  29. data/Gemfile +0 -13
  30. data/Gemfile.lock +0 -56
  31. data/Rakefile +0 -6
  32. data/buildkite-builder.gemspec +0 -28
  33. data/lib/vendor/rainbow/Changelog.md +0 -101
  34. data/lib/vendor/rainbow/Gemfile +0 -30
  35. data/lib/vendor/rainbow/LICENSE +0 -20
  36. data/lib/vendor/rainbow/README.markdown +0 -225
  37. data/lib/vendor/rainbow/Rakefile +0 -11
  38. data/lib/vendor/rainbow/lib/rainbow.rb +0 -13
  39. data/lib/vendor/rainbow/lib/rainbow/color.rb +0 -150
  40. data/lib/vendor/rainbow/lib/rainbow/ext/string.rb +0 -64
  41. data/lib/vendor/rainbow/lib/rainbow/global.rb +0 -25
  42. data/lib/vendor/rainbow/lib/rainbow/null_presenter.rb +0 -100
  43. data/lib/vendor/rainbow/lib/rainbow/presenter.rb +0 -144
  44. data/lib/vendor/rainbow/lib/rainbow/refinement.rb +0 -14
  45. data/lib/vendor/rainbow/lib/rainbow/string_utils.rb +0 -22
  46. data/lib/vendor/rainbow/lib/rainbow/version.rb +0 -5
  47. data/lib/vendor/rainbow/lib/rainbow/wrapper.rb +0 -22
  48. data/lib/vendor/rainbow/lib/rainbow/x11_color_names.rb +0 -153
  49. data/lib/vendor/rainbow/rainbow.gemspec +0 -23
@@ -19,7 +19,7 @@ module Buildkite
19
19
  return unless path.directory?
20
20
 
21
21
  path.children.map do |file|
22
- required_status = require(file)
22
+ required_status = require(file.to_s)
23
23
  add(file.basename, { required: required_status })
24
24
  end
25
25
  end
@@ -29,7 +29,7 @@ module Buildkite
29
29
  end
30
30
 
31
31
  def pipeline_processors_path
32
- pipeline_path.join(PROCESSORS_PATH)
32
+ root.join(PROCESSORS_PATH)
33
33
  end
34
34
  end
35
35
  end
@@ -17,7 +17,7 @@ module Buildkite
17
17
  end
18
18
 
19
19
  def templates_path
20
- pipeline_path.join(TEMPLATES_PATH)
20
+ root.join(TEMPLATES_PATH)
21
21
  end
22
22
  end
23
23
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'digest/md5'
4
4
  require 'pathname'
5
- require 'set'
5
+ require 'sorted_set'
6
6
 
7
7
  module Buildkite
8
8
  module Builder
@@ -7,12 +7,12 @@ module Buildkite
7
7
  include LoggingUtils
8
8
  using Rainbow
9
9
 
10
- def self.process(runner)
11
- new(runner).run
10
+ def self.process(context)
11
+ new(context).run
12
12
  end
13
13
 
14
- def initialize(runner)
15
- @runner = runner
14
+ def initialize(context)
15
+ @context = context
16
16
  end
17
17
 
18
18
  def run
@@ -21,18 +21,18 @@ module Buildkite
21
21
 
22
22
  private
23
23
 
24
- attr_reader :runner
24
+ attr_reader :context
25
25
 
26
26
  def process
27
27
  raise NotImplementedError
28
28
  end
29
29
 
30
30
  def log
31
- runner.log
31
+ context.logger
32
32
  end
33
33
 
34
34
  def pipeline
35
- runner.pipeline
35
+ context.pipeline
36
36
  end
37
37
 
38
38
  def buildkite
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../vendor/rainbow/lib/rainbow/refinement'
3
+ require 'rainbow/refinement'
4
4
 
5
5
  module Buildkite
6
6
  module Builder
@@ -3,76 +3,52 @@
3
3
  require 'bundler'
4
4
  require 'pathname'
5
5
  require 'tempfile'
6
+ require 'logger'
6
7
 
7
8
  module Buildkite
8
9
  module Builder
9
10
  class Runner
10
- include Definition::Helper
11
11
  include LoggingUtils
12
12
  using Rainbow
13
13
 
14
- PIPELINES_PATH = Pathname.new('.buildkite/pipelines').freeze
15
- PIPELINE_DEFINITION_PATH = Pathname.new('pipeline.rb').freeze
14
+ PIPELINES_PATH = Pathname.new('pipelines').freeze
16
15
 
17
16
  attr_reader :options
18
17
 
19
- # This entrypoint is for running on CI. It expects certain environment variables to
20
- # be set.
21
- def self.run
22
- new(
23
- upload: true,
24
- pipeline: Buildkite.env.pipeline_slug
25
- ).run
26
- end
27
-
28
18
  def initialize(**options)
29
- @options = {
30
- verbose: true,
31
- }.merge(options)
19
+ @options = options
32
20
  end
33
21
 
34
22
  def run
35
- log.info "#{'+++ ' if Buildkite.env}🧰 " + 'Buildkite-builder'.color(:springgreen) + " ─ #{@options[:pipeline].yellow}"
23
+ log.info "#{'+++ ' if Buildkite.env}🧰 " + 'Buildkite Builder'.color(:springgreen) + " ─ #{@options[:pipeline].yellow}"
24
+ context = Context.new(root, logger: log)
36
25
 
37
26
  results = benchmark("\nDone (%s)".color(:springgreen)) do
38
- load_manifests
39
- load_templates
40
- load_processors
41
- load_pipeline
42
- run_processors
27
+ context.build
43
28
  end
44
- log.info results
45
-
46
- upload! if options[:upload]
47
- # Always return the pipeline.
29
+ log.info(results)
48
30
 
49
- pipeline
50
- end
31
+ if options[:upload]
32
+ upload(context.pipeline)
33
+ end
51
34
 
52
- def pipeline
53
- @pipeline ||= Buildkite::Pipelines::Pipeline.new
35
+ # Always return the pipeline.
36
+ context.pipeline
54
37
  end
55
38
 
56
- def pipeline_definition
57
- @pipeline_definition ||= begin
58
- expected = Definition::Pipeline
59
- load_definition(Buildkite::Builder.root.join(".buildkite/pipelines/#{options[:pipeline]}").join(PIPELINE_DEFINITION_PATH), expected)
60
- end
61
- end
39
+ private
62
40
 
63
41
  def log
64
42
  @log ||= begin
65
- Logger.new(options[:verbose] ? $stdout : StringIO.new).tap do |lgr|
66
- lgr.formatter = proc do |_severity, _datetime, _progname, msg|
43
+ Logger.new($stdout).tap do |logger|
44
+ logger.formatter = proc do |_severity, _datetime, _progname, msg|
67
45
  "#{msg}\n"
68
46
  end
69
47
  end
70
48
  end
71
49
  end
72
50
 
73
- private
74
-
75
- def upload!
51
+ def upload(pipeline)
76
52
  Tempfile.create(['pipeline', '.yml']) do |file|
77
53
  file.sync = true
78
54
  file.write(pipeline.to_yaml)
@@ -84,31 +60,18 @@ module Buildkite
84
60
  end
85
61
  end
86
62
 
87
- def load_manifests
88
- Loaders::Manifests.load(options[:pipeline]).each do |name, asset|
89
- Manifest[name] = asset
90
- end
91
- end
92
-
93
- def load_templates
94
- Loaders::Templates.load(options[:pipeline]).each do |name, asset|
95
- pipeline.template(name, &asset)
96
- end
97
- end
98
-
99
- def load_processors
100
- Loaders::Processors.load(options[:pipeline])
101
- end
102
-
103
- def run_processors
104
- pipeline.processors.each do |processor|
105
- processor.process(self)
63
+ def root
64
+ @root ||= begin
65
+ path = Builder.root.join(Builder::BUILDKITE_DIRECTORY_NAME)
66
+ if options[:pipeline]
67
+ pipeline_path = path.join(PIPELINES_PATH).join(options[:pipeline])
68
+ if pipeline_path.directory?
69
+ path = pipeline_path
70
+ end
71
+ end
72
+ path
106
73
  end
107
74
  end
108
-
109
- def load_pipeline
110
- pipeline.instance_eval(&pipeline_definition)
111
- end
112
75
  end
113
76
  end
114
77
  end
@@ -8,6 +8,7 @@ module Buildkite
8
8
  autoload :Helpers, File.expand_path('pipelines/helpers', __dir__)
9
9
  autoload :Pipeline, File.expand_path('pipelines/pipeline', __dir__)
10
10
  autoload :Plugin, File.expand_path('pipelines/plugin', __dir__)
11
+ autoload :StepContext, File.expand_path('pipelines/step_context', __dir__)
11
12
  autoload :Steps, File.expand_path('pipelines/steps', __dir__)
12
13
  end
13
14
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'yaml'
4
+ require 'pathname'
4
5
 
5
6
  module Buildkite
6
7
  module Pipelines
@@ -15,6 +16,7 @@ module Buildkite
15
16
  @plugins = {}
16
17
  @templates = {}
17
18
  @processors = []
19
+ @notify = []
18
20
 
19
21
  instance_eval(&definition) if definition
20
22
  instance_eval(&block) if block_given?
@@ -26,8 +28,18 @@ module Buildkite
26
28
  Steps::Input,
27
29
  Steps::Trigger,
28
30
  ].each do |type|
29
- define_method(type.to_sym) do |template = nil, &block|
30
- add(type, template, &block)
31
+ define_method(type.to_sym) do |template = nil, **args, &block|
32
+ add(type, template, **args, &block)
33
+ end
34
+ end
35
+
36
+ def notify(*args)
37
+ if args.empty?
38
+ @notify
39
+ elsif args.first.is_a?(Hash)
40
+ @notify.push(args.first.transform_keys(&:to_s))
41
+ else
42
+ raise ArgumentError, 'value must be hash'
31
43
  end
32
44
  end
33
45
 
@@ -41,8 +53,8 @@ module Buildkite
41
53
  end
42
54
  end
43
55
 
44
- def skip(template = nil, &block)
45
- step = add(Steps::Skip, template, &block)
56
+ def skip(template = nil, **args, &block)
57
+ step = add(Steps::Skip, template, **args, &block)
46
58
  # A skip step has a nil/noop command.
47
59
  step.command(nil)
48
60
  # Always set the skip attribute if it's in a falsey state.
@@ -99,9 +111,8 @@ module Buildkite
99
111
 
100
112
  def to_h
101
113
  pipeline = {}
102
- if env.any?
103
- pipeline[:env] = env
104
- end
114
+ pipeline[:env] = env if env.any?
115
+ pipeline[:notify] = notify if notify.any?
105
116
  pipeline[:steps] = steps.map(&:to_h)
106
117
 
107
118
  Helpers.sanitize(pipeline)
@@ -113,8 +124,8 @@ module Buildkite
113
124
 
114
125
  private
115
126
 
116
- def add(step_class, template = nil, &block)
117
- steps.push(step_class.new(self, find_template(template), &block)).last
127
+ def add(step_class, template = nil, **args, &block)
128
+ steps.push(step_class.new(self, find_template(template), **args, &block)).last
118
129
  end
119
130
 
120
131
  def find_template(name)
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Buildkite
4
+ module Pipelines
5
+ class StepContext
6
+ attr_reader :step
7
+ attr_reader :args
8
+
9
+ def initialize(step, **args)
10
+ @step = step
11
+ @args = args
12
+ end
13
+
14
+ def pipeline
15
+ step.pipeline
16
+ end
17
+
18
+ def [](key)
19
+ args[key]
20
+ end
21
+ end
22
+ end
23
+ end
@@ -13,12 +13,13 @@ module Buildkite
13
13
  name.split('::').last.downcase.to_sym
14
14
  end
15
15
 
16
- def initialize(pipeline, template = nil, &block)
16
+ def initialize(pipeline, template = nil, **args, &block)
17
17
  @pipeline = pipeline
18
18
  @template = template
19
+ context = StepContext.new(self, **args)
19
20
 
20
- instance_eval(&template) if template
21
- instance_eval(&block) if block_given?
21
+ instance_exec(context, &template) if template
22
+ instance_exec(context, &block) if block_given?
22
23
  end
23
24
  end
24
25
  end
@@ -14,6 +14,7 @@ module Buildkite
14
14
  attribute :allow_dependency_failure
15
15
  attribute :branches
16
16
  attribute :fields
17
+ attribute :blocked_state
17
18
  end
18
19
  end
19
20
  end
metadata CHANGED
@@ -1,17 +1,116 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: buildkite-builder
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.beta.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ngan Pham
8
8
  - Andrew Lee
9
- autorequire:
10
- bindir: bin
9
+ autorequire:
10
+ bindir: exe
11
11
  cert_chain: []
12
- date: 2020-11-24 00:00:00.000000000 Z
13
- dependencies: []
14
- description: Write a longer description or delete this line.
12
+ date: 2021-02-16 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: sorted_set
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rainbow
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '3'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '3'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rake
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: byebug
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: pry-byebug
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rspec
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: webmock
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ description: Buildkite Builder is a tool that provides projects using Buildkite to
113
+ have dynamic pipeline functionality.
15
114
  email:
16
115
  - gusto-opensource-buildkite@gusto.com
17
116
  executables:
@@ -19,25 +118,22 @@ executables:
19
118
  extensions: []
20
119
  extra_rdoc_files: []
21
120
  files:
22
- - ".gitignore"
23
- - ".rspec"
24
121
  - CHANGELOG.md
25
- - CODE_OF_CONDUCT.md
26
- - Gemfile
27
- - Gemfile.lock
28
122
  - LICENSE.txt
29
123
  - README.md
30
- - Rakefile
124
+ - VERSION
31
125
  - bin/buildkite-builder
32
126
  - bin/console
33
127
  - bin/setup
34
- - buildkite-builder.gemspec
128
+ - exe/buildkite-builder
35
129
  - lib/buildkite-builder.rb
36
130
  - lib/buildkite/builder.rb
37
131
  - lib/buildkite/builder/commands.rb
38
132
  - lib/buildkite/builder/commands/abstract.rb
39
133
  - lib/buildkite/builder/commands/files.rb
40
134
  - lib/buildkite/builder/commands/preview.rb
135
+ - lib/buildkite/builder/commands/run.rb
136
+ - lib/buildkite/builder/context.rb
41
137
  - lib/buildkite/builder/definition.rb
42
138
  - lib/buildkite/builder/file_resolver.rb
43
139
  - lib/buildkite/builder/github.rb
@@ -71,6 +167,7 @@ files:
71
167
  - lib/buildkite/pipelines/helpers/timeout_in_minutes.rb
72
168
  - lib/buildkite/pipelines/pipeline.rb
73
169
  - lib/buildkite/pipelines/plugin.rb
170
+ - lib/buildkite/pipelines/step_context.rb
74
171
  - lib/buildkite/pipelines/steps.rb
75
172
  - lib/buildkite/pipelines/steps/abstract.rb
76
173
  - lib/buildkite/pipelines/steps/block.rb
@@ -79,23 +176,6 @@ files:
79
176
  - lib/buildkite/pipelines/steps/skip.rb
80
177
  - lib/buildkite/pipelines/steps/trigger.rb
81
178
  - lib/buildkite/pipelines/steps/wait.rb
82
- - lib/vendor/rainbow/Changelog.md
83
- - lib/vendor/rainbow/Gemfile
84
- - lib/vendor/rainbow/LICENSE
85
- - lib/vendor/rainbow/README.markdown
86
- - lib/vendor/rainbow/Rakefile
87
- - lib/vendor/rainbow/lib/rainbow.rb
88
- - lib/vendor/rainbow/lib/rainbow/color.rb
89
- - lib/vendor/rainbow/lib/rainbow/ext/string.rb
90
- - lib/vendor/rainbow/lib/rainbow/global.rb
91
- - lib/vendor/rainbow/lib/rainbow/null_presenter.rb
92
- - lib/vendor/rainbow/lib/rainbow/presenter.rb
93
- - lib/vendor/rainbow/lib/rainbow/refinement.rb
94
- - lib/vendor/rainbow/lib/rainbow/string_utils.rb
95
- - lib/vendor/rainbow/lib/rainbow/version.rb
96
- - lib/vendor/rainbow/lib/rainbow/wrapper.rb
97
- - lib/vendor/rainbow/lib/rainbow/x11_color_names.rb
98
- - lib/vendor/rainbow/rainbow.gemspec
99
179
  homepage: https://github.com/Gusto/buildkite-builder
100
180
  licenses:
101
181
  - MIT
@@ -104,7 +184,7 @@ metadata:
104
184
  source_code_uri: https://github.com/Gusto/buildkite-builder
105
185
  changelog_uri: https://github.com/Gusto/buildkite-builder/blob/master/CHANGELOG.md
106
186
  bug_tracker_uri: https://github.com/Gusto/buildkite-builder/issues
107
- post_install_message:
187
+ post_install_message:
108
188
  rdoc_options: []
109
189
  require_paths:
110
190
  - lib
@@ -115,12 +195,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
115
195
  version: 2.3.0
116
196
  required_rubygems_version: !ruby/object:Gem::Requirement
117
197
  requirements:
118
- - - ">"
198
+ - - ">="
119
199
  - !ruby/object:Gem::Version
120
- version: 1.3.1
200
+ version: '0'
121
201
  requirements: []
122
- rubygems_version: 3.1.4
123
- signing_key:
202
+ rubygems_version: 3.2.2
203
+ signing_key:
124
204
  specification_version: 4
125
- summary: Write a short summary, because RubyGems requires one.
205
+ summary: A gem for programmatically creating Buildkite pipelines.
126
206
  test_files: []