cody 1.0.4 → 1.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 +4 -4
- data/CHANGELOG.md +16 -0
- data/README.md +2 -0
- data/cody.gemspec +2 -0
- data/lib/cody/cli/start.rb +1 -0
- data/lib/cody/cli.rb +1 -1
- data/lib/cody/core.rb +0 -1
- data/lib/cody/dsl/base.rb +2 -1
- data/lib/cody/dsl/project/ssm.rb +1 -1
- data/lib/cody/dsl/role/registry.rb +25 -0
- data/lib/cody/dsl/role.rb +14 -6
- data/lib/cody/evaluate.rb +1 -40
- data/lib/cody/project.rb +1 -1
- data/lib/cody/role.rb +9 -2
- data/lib/cody/schedule.rb +1 -1
- data/lib/cody/setting.rb +6 -1
- data/lib/cody/stack/base.rb +2 -4
- data/lib/cody/stack/status.rb +7 -0
- data/lib/cody/stack.rb +1 -0
- data/lib/cody/version.rb +1 -1
- data/lib/cody.rb +3 -0
- metadata +33 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd70b6f28e07b8c790325ac4a3c0e7703f60c91bf787d757e2827a61b2eaed48
|
4
|
+
data.tar.gz: 353f4fe4eec6dc7b4e0d473f29cc9389a6e907ecfef2a3552b8e4b960873784f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d17eed03ad6069022ca100899bb10739acf31804a7743beed5deb2e9ed17c9dac3967a8e6ae51c6dd268c586e7d86f9f5db21de8763cefe7be1c883da8765bd
|
7
|
+
data.tar.gz: 91dfd9d4df7923fb6cb26081a53ec5eb8b6c8d1eda2dddb9882095cab80f9bc253aef38dd694e3ddc1b14eebc824b42885a4f4763a5c8c1da34076ba5d719718
|
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,22 @@
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
4
4
|
This project *tries* to adhere to [Semantic Versioning](http://semver.org/), even before v1.0.
|
5
5
|
|
6
|
+
## [1.1.0] - 2022-03-03
|
7
|
+
- [#33](https://github.com/tongueroo/cody/pull/33) fix cfn status when auto deleting rollback completed stack
|
8
|
+
- [#34](https://github.com/tongueroo/cody/pull/34) iam roles: support multiple calls
|
9
|
+
- update iam role docs
|
10
|
+
|
11
|
+
## [1.0.6] - 2021-12-17
|
12
|
+
- [#32](https://github.com/tongueroo/cody/pull/32) fix activesupport require
|
13
|
+
- fix warn not found ssm param message
|
14
|
+
|
15
|
+
## [1.0.5] - 2021-08-28
|
16
|
+
- add params overrides option
|
17
|
+
- docs: fix ecs permission, add iam:GetRole
|
18
|
+
- edge case: yaml has nothing but comments
|
19
|
+
- improve settings merge
|
20
|
+
- update vpc config exmaple with camelcase
|
21
|
+
|
6
22
|
## [1.0.4] - 2021-01-08
|
7
23
|
- loosen activesupport version pin
|
8
24
|
|
data/README.md
CHANGED
@@ -9,6 +9,8 @@
|
|
9
9
|
|
10
10
|
[](https://www.boltops.com)
|
11
11
|
|
12
|
+
Please **watch/star** this repo to help grow and support the project.
|
13
|
+
|
12
14
|
Cody is an AWS CodeBuild Management Tool. Cody lets you create AWS CodeBuild projects with a beautiful DSL. The documentation site is at: [cody.run](https://cody.run/)
|
13
15
|
|
14
16
|
## Quick Start
|
data/cody.gemspec
CHANGED
@@ -32,6 +32,7 @@ Gem::Specification.new do |spec|
|
|
32
32
|
spec.add_dependency "cfn-status"
|
33
33
|
spec.add_dependency "cfn_camelizer"
|
34
34
|
spec.add_dependency "cli-format"
|
35
|
+
spec.add_dependency "dsl_evaluator"
|
35
36
|
spec.add_dependency "memoist"
|
36
37
|
spec.add_dependency "rainbow"
|
37
38
|
spec.add_dependency "render_me_pretty"
|
@@ -41,6 +42,7 @@ Gem::Specification.new do |spec|
|
|
41
42
|
spec.add_development_dependency "bundler"
|
42
43
|
spec.add_development_dependency "byebug"
|
43
44
|
spec.add_development_dependency "cli_markdown"
|
45
|
+
spec.add_development_dependency "nokogiri"
|
44
46
|
spec.add_development_dependency "rake"
|
45
47
|
spec.add_development_dependency "rspec"
|
46
48
|
end
|
data/lib/cody/cli/start.rb
CHANGED
@@ -15,6 +15,7 @@ class Cody::CLI
|
|
15
15
|
source_version: source_version
|
16
16
|
}
|
17
17
|
params[:environment_variables_override] = environment_variables_override if @options[:env_vars]
|
18
|
+
params.merge!(@options[:overrides]) if @options[:overrides]
|
18
19
|
resp = codebuild.start_build(params)
|
19
20
|
|
20
21
|
puts "Build started for project: #{project_name}"
|
data/lib/cody/cli.rb
CHANGED
@@ -37,7 +37,7 @@ module Cody
|
|
37
37
|
long_desc Help.text(:start)
|
38
38
|
option :source_version, default: "master", desc: "git branch"
|
39
39
|
option :branch, aliases: "b", default: "master", desc: "git branch"
|
40
|
-
option :env_vars, type: :array, desc: "env var overrides. IE: KEY1=VALUE1 KEY2=VALUE2"
|
40
|
+
option :env_vars, aliases: "e", type: :array, desc: "env var overrides. IE: KEY1=VALUE1 KEY2=VALUE2"
|
41
41
|
common_options.call
|
42
42
|
def start(project_name=nil)
|
43
43
|
Start.new(options.merge(project_name: project_name)).run
|
data/lib/cody/core.rb
CHANGED
data/lib/cody/dsl/base.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
module Cody::Dsl
|
2
2
|
class Base
|
3
|
-
attr_reader :project_name, :full_project_name
|
3
|
+
attr_reader :options, :project_name, :full_project_name, :type
|
4
4
|
def initialize(options={})
|
5
5
|
@options = options
|
6
6
|
@project_name = options[:project_name]
|
7
|
+
@type = options[:type]
|
7
8
|
@full_project_name = options[:full_project_name] # includes -development at the end
|
8
9
|
@properties = default_properties # defaults make project.rb simpler
|
9
10
|
end
|
data/lib/cody/dsl/project/ssm.rb
CHANGED
@@ -0,0 +1,25 @@
|
|
1
|
+
require "set"
|
2
|
+
|
3
|
+
module Cody::Dsl::Role
|
4
|
+
class Registry
|
5
|
+
class_attribute :iam_statements
|
6
|
+
self.iam_statements = nil # nil to allow fallback to default_iam_statements in cody/role.rb
|
7
|
+
class_attribute :managed_policy_arns
|
8
|
+
self.managed_policy_arns = nil # nil to allow fallback to default_managed_policy_arns in cody/role.rb
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def register_policy(*statements)
|
12
|
+
statements.flatten!
|
13
|
+
self.iam_statements ||= []
|
14
|
+
self.iam_statements += statements # using set so DSL can safely be evaluated multiple times
|
15
|
+
end
|
16
|
+
|
17
|
+
def register_managed_policy(*policies)
|
18
|
+
policies.flatten!
|
19
|
+
self.managed_policy_arns ||= []
|
20
|
+
self.managed_policy_arns += policies # using set so DSL can safely be evaluated multiple times
|
21
|
+
self.managed_policy_arns.uniq!
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/cody/dsl/role.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
module Cody::Dsl
|
2
2
|
module Role
|
3
|
+
extend Memoist
|
4
|
+
|
3
5
|
PROPERTIES = %w[
|
4
6
|
AssumeRolePolicyDocument
|
5
7
|
ManagedPolicyArns
|
@@ -17,7 +19,13 @@ module Cody::Dsl
|
|
17
19
|
|
18
20
|
# convenience wrapper methods
|
19
21
|
def iam_policy(*definitions)
|
20
|
-
|
22
|
+
statements = definitions.map { |definition| standardize_iam_policy(definition) }
|
23
|
+
Registry.register_policy(statements)
|
24
|
+
end
|
25
|
+
|
26
|
+
def managed_iam_policy(*definitions)
|
27
|
+
managed_policy_arns = definitions.map { |definition| standardize_managed_iam_policy(definition) }
|
28
|
+
Registry.register_managed_policy(managed_policy_arns)
|
21
29
|
end
|
22
30
|
|
23
31
|
# Returns standarized IAM statement
|
@@ -36,15 +44,15 @@ module Cody::Dsl
|
|
36
44
|
end
|
37
45
|
end
|
38
46
|
|
39
|
-
def managed_iam_policy(*definitions)
|
40
|
-
@managed_policy_arns = definitions.map { |definition| standardize_managed_iam_policy(definition) }
|
41
|
-
end
|
42
|
-
|
43
47
|
# AmazonEC2ReadOnlyAccess => arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess
|
44
48
|
def standardize_managed_iam_policy(definition)
|
45
49
|
return definition if definition.include?('iam::aws:policy')
|
46
|
-
|
47
50
|
"arn:aws:iam::aws:policy/#{definition}"
|
48
51
|
end
|
52
|
+
|
53
|
+
def aws
|
54
|
+
AwsData.new
|
55
|
+
end
|
56
|
+
memoize :aws
|
49
57
|
end
|
50
58
|
end
|
data/lib/cody/evaluate.rb
CHANGED
@@ -1,47 +1,8 @@
|
|
1
1
|
module Cody
|
2
2
|
module Evaluate
|
3
|
+
include DslEvaluator
|
3
4
|
include Interface
|
4
5
|
|
5
|
-
def evaluate(path)
|
6
|
-
source_code = IO.read(path)
|
7
|
-
begin
|
8
|
-
instance_eval(source_code, path)
|
9
|
-
rescue Exception => e
|
10
|
-
if e.class == SystemExit # allow exit to happen normally
|
11
|
-
raise
|
12
|
-
else
|
13
|
-
task_definition_error(e)
|
14
|
-
puts "\nFull error:"
|
15
|
-
raise
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
# Prints out a user friendly task_definition error message
|
22
|
-
def task_definition_error(e)
|
23
|
-
error_info = e.backtrace.first
|
24
|
-
path, line_no, _ = error_info.split(':')
|
25
|
-
line_no = line_no.to_i
|
26
|
-
puts "Error evaluating #{path}:".color(:red)
|
27
|
-
puts e.message
|
28
|
-
puts "Here's the line in #{path} with the error:\n\n"
|
29
|
-
|
30
|
-
contents = IO.read(path)
|
31
|
-
content_lines = contents.split("\n")
|
32
|
-
context = 5 # lines of context
|
33
|
-
top, bottom = [line_no-context-1, 0].max, line_no+context-1
|
34
|
-
spacing = content_lines.size.to_s.size
|
35
|
-
content_lines[top..bottom].each_with_index do |line_content, index|
|
36
|
-
line_number = top+index+1
|
37
|
-
if line_number == line_no
|
38
|
-
printf("%#{spacing}d %s\n".color(:red), line_number, line_content)
|
39
|
-
else
|
40
|
-
printf("%#{spacing}d %s\n", line_number, line_content)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
6
|
def lookup_cody_file(name)
|
46
7
|
[".cody", @options[:type], name].compact.join("/")
|
47
8
|
end
|
data/lib/cody/project.rb
CHANGED
data/lib/cody/role.rb
CHANGED
@@ -2,9 +2,9 @@ require "yaml"
|
|
2
2
|
|
3
3
|
module Cody
|
4
4
|
class Role < Dsl::Base
|
5
|
-
include Cody::Dsl::Role
|
6
5
|
include Evaluate
|
7
6
|
include Variables
|
7
|
+
include Dsl::Role
|
8
8
|
|
9
9
|
def initialize(options={})
|
10
10
|
super
|
@@ -14,7 +14,8 @@ module Cody
|
|
14
14
|
|
15
15
|
def run
|
16
16
|
load_variables
|
17
|
-
|
17
|
+
evaluate_file(@role_path) if File.exist?(@role_path) # registers definitions to registry
|
18
|
+
build # build definitions from registry. can set: @iam_statements and @managed_policy_arns
|
18
19
|
@properties[:Policies] = [{
|
19
20
|
PolicyName: "CodeBuildAccess",
|
20
21
|
PolicyDocument: {
|
@@ -35,6 +36,12 @@ module Cody
|
|
35
36
|
end
|
36
37
|
|
37
38
|
private
|
39
|
+
Registry = Cody::Dsl::Role::Registry
|
40
|
+
def build
|
41
|
+
@iam_statements = Registry.iam_statements if Registry.iam_statements
|
42
|
+
@managed_policy_arns = Registry.managed_policy_arns if Registry.managed_policy_arns
|
43
|
+
end
|
44
|
+
|
38
45
|
def get_role_path
|
39
46
|
lookup_cody_file("role.rb")
|
40
47
|
end
|
data/lib/cody/schedule.rb
CHANGED
data/lib/cody/setting.rb
CHANGED
@@ -25,7 +25,10 @@ module Cody
|
|
25
25
|
|
26
26
|
all_envs = default.deep_merge(user.deep_merge(project))
|
27
27
|
all_envs = merge_base(all_envs)
|
28
|
-
|
28
|
+
|
29
|
+
env_data = all_envs[cb_env] || {}
|
30
|
+
base_data = all_envs["base"] || {}
|
31
|
+
data = base_data.merge(env_data)
|
29
32
|
data.deep_symbolize_keys
|
30
33
|
end
|
31
34
|
memoize :data
|
@@ -37,6 +40,7 @@ module Cody
|
|
37
40
|
path = "#{cb_root}/.cody/settings.yml"
|
38
41
|
if File.exist?(path)
|
39
42
|
settings = YAML.load_file(path)
|
43
|
+
settings = {} unless settings.is_a?(Hash) # in case YAML has nothing but comments
|
40
44
|
env = settings.find do |_env, section|
|
41
45
|
section ||= {}
|
42
46
|
ENV['AWS_PROFILE'] && ENV['AWS_PROFILE'] == section['aws_profile']
|
@@ -54,6 +58,7 @@ module Cody
|
|
54
58
|
|
55
59
|
content = RenderMePretty.result(path)
|
56
60
|
data = YAML.load(content)
|
61
|
+
data = {} unless data.is_a?(Hash) # in case YAML has nothing but comments
|
57
62
|
# If key is is accidentally set to nil it screws up the merge_base later.
|
58
63
|
# So ensure that all keys with nil value are set to {}
|
59
64
|
data.each do |env, _setting|
|
data/lib/cody/stack/base.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
class Cody::Stack
|
2
2
|
class Base
|
3
3
|
include Cody::AwsServices
|
4
|
+
include Status
|
4
5
|
|
5
6
|
def initialize(options)
|
6
7
|
@options = options
|
@@ -40,6 +41,7 @@ class Cody::Stack
|
|
40
41
|
FileUtils.mkdir_p(File.dirname(template_path))
|
41
42
|
IO.write(template_path, YAML.dump(@template))
|
42
43
|
puts "Generated CloudFormation template at #{template_path.color(:green)}"
|
44
|
+
|
43
45
|
return if @options[:noop]
|
44
46
|
puts "Deploying stack #{@stack_name.color(:green)} with CodeBuild project #{@full_project_name.color(:green)}"
|
45
47
|
|
@@ -68,10 +70,6 @@ class Cody::Stack
|
|
68
70
|
puts "Here's the CloudFormation url to check for more details #{url}"
|
69
71
|
end
|
70
72
|
|
71
|
-
def status
|
72
|
-
@status ||= CfnStatus.new(@stack_name)
|
73
|
-
end
|
74
|
-
|
75
73
|
def rollback_complete?(stack)
|
76
74
|
stack.stack_status == 'ROLLBACK_COMPLETE'
|
77
75
|
end
|
data/lib/cody/stack.rb
CHANGED
data/lib/cody/version.rb
CHANGED
data/lib/cody.rb
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
$:.unshift(File.expand_path("../", __FILE__))
|
2
|
+
require "active_support"
|
3
|
+
require "active_support/core_ext/string"
|
2
4
|
require "aws_data"
|
3
5
|
require "cfn_camelizer"
|
4
6
|
require "cfn_status"
|
5
7
|
require "cody/version"
|
8
|
+
require "dsl_evaluator"
|
6
9
|
require "memoist"
|
7
10
|
require "rainbow/ext/string"
|
8
11
|
require "yaml"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cody
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tung Nguyen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-03-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -150,6 +150,20 @@ dependencies:
|
|
150
150
|
- - ">="
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: dsl_evaluator
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
153
167
|
- !ruby/object:Gem::Dependency
|
154
168
|
name: memoist
|
155
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -262,6 +276,20 @@ dependencies:
|
|
262
276
|
- - ">="
|
263
277
|
- !ruby/object:Gem::Version
|
264
278
|
version: '0'
|
279
|
+
- !ruby/object:Gem::Dependency
|
280
|
+
name: nokogiri
|
281
|
+
requirement: !ruby/object:Gem::Requirement
|
282
|
+
requirements:
|
283
|
+
- - ">="
|
284
|
+
- !ruby/object:Gem::Version
|
285
|
+
version: '0'
|
286
|
+
type: :development
|
287
|
+
prerelease: false
|
288
|
+
version_requirements: !ruby/object:Gem::Requirement
|
289
|
+
requirements:
|
290
|
+
- - ">="
|
291
|
+
- !ruby/object:Gem::Version
|
292
|
+
version: '0'
|
265
293
|
- !ruby/object:Gem::Dependency
|
266
294
|
name: rake
|
267
295
|
requirement: !ruby/object:Gem::Requirement
|
@@ -343,6 +371,7 @@ files:
|
|
343
371
|
- lib/cody/dsl/project.rb
|
344
372
|
- lib/cody/dsl/project/ssm.rb
|
345
373
|
- lib/cody/dsl/role.rb
|
374
|
+
- lib/cody/dsl/role/registry.rb
|
346
375
|
- lib/cody/dsl/schedule.rb
|
347
376
|
- lib/cody/evaluate.rb
|
348
377
|
- lib/cody/evaluate/interface.rb
|
@@ -355,6 +384,7 @@ files:
|
|
355
384
|
- lib/cody/stack.rb
|
356
385
|
- lib/cody/stack/base.rb
|
357
386
|
- lib/cody/stack/create.rb
|
387
|
+
- lib/cody/stack/status.rb
|
358
388
|
- lib/cody/stack/update.rb
|
359
389
|
- lib/cody/tailer.rb
|
360
390
|
- lib/cody/variables.rb
|
@@ -387,7 +417,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
387
417
|
- !ruby/object:Gem::Version
|
388
418
|
version: '0'
|
389
419
|
requirements: []
|
390
|
-
rubygems_version: 3.
|
420
|
+
rubygems_version: 3.2.32
|
391
421
|
signing_key:
|
392
422
|
specification_version: 4
|
393
423
|
summary: Cody provides a beautiful DSL to create and manage AWS CodeBuild projects
|