ufo 6.2.2 → 6.2.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.cody/acceptance/bin/asg.sh +15 -0
- data/.cody/acceptance/bin/build.sh +6 -0
- data/.cody/acceptance/{role.rb → iam_role.rb} +1 -0
- data/.cody/acceptance/project.rb +5 -5
- data/.gitignore +1 -0
- data/CHANGELOG.md +12 -0
- data/lib/ufo/cli/scale.rb +1 -0
- data/lib/ufo/command.rb +1 -1
- data/lib/ufo/config/parse.rb +39 -0
- data/lib/ufo/config.rb +20 -27
- data/lib/ufo/info.rb +1 -0
- data/lib/ufo/layering/layer.rb +0 -3
- data/lib/ufo/task_definition/helpers/acm.rb +1 -1
- data/lib/ufo/task_definition/helpers/ecr.rb +1 -1
- data/lib/ufo/task_definition/helpers/stack_output.rb +1 -1
- data/lib/ufo/task_definition/helpers/vars/builder.rb +56 -14
- data/lib/ufo/task_definition/helpers/vars.rb +2 -2
- data/lib/ufo/task_definition/helpers/waf.rb +1 -1
- data/lib/ufo/utils/call_line.rb +1 -1
- data/lib/ufo/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 69d0e411c4b48b8ec8a0a2148caf5501b3c038cb991585c4741027579a102e0c
|
4
|
+
data.tar.gz: f080bdf97e783b18bc54723ced3be52557b0749094451561de41766c052aba0e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 860f1d782b915338e903d2c2c0cad43fbe4a915261b46a2b615a7d24870247170a3041de32b6e9de8b11161da1c8447dc3d12683e9179c8c6cd0af7ef3dc4d77
|
7
|
+
data.tar.gz: c02bc1f698f85055e2e1c99b7fbf6cf730044e23b7584509a5c2e66bd79259097b2c5ccf1706b186a64b329db31e5678fe6eacb3f120724dbfa896a0ab6fbb00
|
@@ -0,0 +1,15 @@
|
|
1
|
+
function scale_asg_to() {
|
2
|
+
n=$1
|
3
|
+
ASG=$(asg)
|
4
|
+
echo "Scaling $ASG to $n"
|
5
|
+
aws autoscaling update-auto-scaling-group --auto-scaling-group-name $ASG \
|
6
|
+
--desired-capacity $n --min-size $n --max-size $n
|
7
|
+
}
|
8
|
+
|
9
|
+
# aws cloudformation describe-stacks --stack-name ecs-qa | jq -r '.Stacks[].Outputs[] | select(.OutputKey == "Asg") | .OutputValue'
|
10
|
+
# aws cloudformation describe-stack-resources --stack-name ecs-qa | jq -r '.StackResources[] | select(.LogicalResourceId == "Asg") | .PhysicalResourceId'
|
11
|
+
function asg() {
|
12
|
+
STACK_NAME=ecs-qa
|
13
|
+
ASG=$(aws cloudformation describe-stacks --stack-name $STACK_NAME | jq -r '.Stacks[].Outputs[] | select(.OutputKey == "Asg") | .OutputValue')
|
14
|
+
echo $ASG
|
15
|
+
}
|
@@ -1,5 +1,8 @@
|
|
1
1
|
#!/bin/bash
|
2
2
|
|
3
|
+
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
4
|
+
source "$DIR/asg.sh"
|
5
|
+
|
3
6
|
final_status=0
|
4
7
|
function capture_status {
|
5
8
|
if [ "$?" -ne "0" ] && [ $final_status -ne 1 ] ; then
|
@@ -40,6 +43,7 @@ cat .ufo/vars/base.rb
|
|
40
43
|
cat .ufo/vars/dev.rb
|
41
44
|
|
42
45
|
export UFO_ENV=qa
|
46
|
+
scale_asg_to 1
|
43
47
|
|
44
48
|
# Deploy
|
45
49
|
ufo ship -y
|
@@ -95,3 +99,5 @@ ufo ps # see full output for debugging
|
|
95
99
|
ufo ps 2>&1 | grep Stack | grep worker # should be success. IE: exit 0
|
96
100
|
ufo destroy -y
|
97
101
|
ufo ps 2>&1 | grep No | grep found # should be success. IE: exit 0
|
102
|
+
|
103
|
+
scale_asg_to 0
|
data/.cody/acceptance/project.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
DOCKER_USER: "ssm
|
5
|
-
DOCKER_PASS: "ssm
|
1
|
+
github("boltops-tools/ufo")
|
2
|
+
image("aws/codebuild/amazonlinux2-x86_64-standard:3.0")
|
3
|
+
env_vars(
|
4
|
+
DOCKER_USER: "ssm:/#{Cody.env}/DOCKER_USER",
|
5
|
+
DOCKER_PASS: "ssm:/#{Cody.env}/DOCKER_PASS",
|
6
6
|
)
|
7
7
|
|
8
8
|
# triggers(
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,18 @@
|
|
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
|
+
## [6.2.5] - 2022-03-24
|
7
|
+
- [#159](https://github.com/tongueroo/ufo/pull/159) improve ufo call line
|
8
|
+
- [#160](https://github.com/tongueroo/ufo/pull/160) conventionally lookup up secrets and env file
|
9
|
+
- [#161](https://github.com/tongueroo/ufo/pull/161) layering support for env files
|
10
|
+
- improve acceptance pipeline
|
11
|
+
|
12
|
+
## [6.2.4] - 2022-03-20
|
13
|
+
- [#158](https://github.com/tongueroo/ufo/pull/158) warn on missing env and secrets file instead of error
|
14
|
+
|
15
|
+
## [6.2.3] - 2022-03-20
|
16
|
+
- [#157](https://github.com/tongueroo/ufo/pull/157) layering.show_for_commands option
|
17
|
+
|
6
18
|
## [6.2.2] - 2022-03-20
|
7
19
|
- [#155](https://github.com/tongueroo/ufo/pull/155) layering.show option ability to show layers
|
8
20
|
- [#156](https://github.com/tongueroo/ufo/pull/156) extra layering support
|
data/lib/ufo/cli/scale.rb
CHANGED
@@ -54,6 +54,7 @@ class Ufo::CLI
|
|
54
54
|
|
55
55
|
def register_scalable_target(scalable_target)
|
56
56
|
# service/dev/app1-web-dev-EcsService-Q0XkN6VtxGWv|ecs:service:DesiredCount|ecs
|
57
|
+
return unless scalable_target && scalable_target.physical_resource_id # stack still creating
|
57
58
|
resource_id, scalable_dimension, service_namespace = scalable_target.physical_resource_id.split('|')
|
58
59
|
applicationautoscaling.register_scalable_target(
|
59
60
|
max_capacity: @max,
|
data/lib/ufo/command.rb
CHANGED
@@ -78,7 +78,7 @@ module Ufo
|
|
78
78
|
# See comment where configure_dsl_evaluator is used about Ufo.role
|
79
79
|
def configure_dsl_evaluator
|
80
80
|
DslEvaluator.configure do |config|
|
81
|
-
config.backtrace.select_pattern = Ufo.root
|
81
|
+
config.backtrace.select_pattern = "#{Ufo.root}/.ufo"
|
82
82
|
config.logger = Ufo.logger
|
83
83
|
config.on_exception = :exit
|
84
84
|
config.root = Ufo.root
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# Some limitations:
|
2
|
+
#
|
3
|
+
# * Only parsing one file: .ufo/config.rb
|
4
|
+
# * If user is using Ruby code that cannot be parse will fallback to default
|
5
|
+
#
|
6
|
+
# Think it's worth it so user only has to configure
|
7
|
+
#
|
8
|
+
# config.layering.show = true
|
9
|
+
#
|
10
|
+
class Ufo::Config
|
11
|
+
class Parse
|
12
|
+
def for(config, type: :boolean)
|
13
|
+
lines = IO.readlines("#{Ufo.root}/.ufo/config.rb")
|
14
|
+
config_line = lines.find do |l|
|
15
|
+
# IE: Regexp.new("config\.layering.show.*=")
|
16
|
+
regexp = Regexp.new("config\.#{config}.*=")
|
17
|
+
l =~ regexp && l !~ /^\s+#/
|
18
|
+
end
|
19
|
+
return false unless config_line # default is false
|
20
|
+
config_value = config_line.gsub(/.*=/,'').strip.gsub(/["']/,'')
|
21
|
+
case type
|
22
|
+
when :boolean
|
23
|
+
config_value != "false" && config_value != "nil"
|
24
|
+
when :array
|
25
|
+
eval(config_value) # IE: '["a"]' => ["a"]
|
26
|
+
else
|
27
|
+
raise "Type #{type.inspect} not supported"
|
28
|
+
end
|
29
|
+
rescue Exception => e
|
30
|
+
# if ENV['UFO_DEBUG']
|
31
|
+
puts "#{e.class} #{e.message}".color(:yellow)
|
32
|
+
puts "WARN: Unable to parse for config.layering.show".color(:yellow)
|
33
|
+
puts "Using default: config.layering.show = false"
|
34
|
+
# end
|
35
|
+
false
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
data/lib/ufo/config.rb
CHANGED
@@ -86,7 +86,8 @@ module Ufo
|
|
86
86
|
config.exec.enabled = true # EcsService EnableExecuteCommand
|
87
87
|
|
88
88
|
config.layering = ActiveSupport::OrderedOptions.new
|
89
|
-
config.layering.show =
|
89
|
+
config.layering.show = parsed_layering_show
|
90
|
+
config.layering.show_for_commands = parsed_layering_show_for
|
90
91
|
|
91
92
|
config.log = ActiveSupport::OrderedOptions.new
|
92
93
|
config.log.root = Ufo.log_root
|
@@ -111,6 +112,7 @@ module Ufo
|
|
111
112
|
config.secrets.pattern.secretsmanager = ":APP-:ENV-:SECRET_NAME" # => demo-dev-DB_PASS
|
112
113
|
config.secrets.pattern.ssm = ":APP/:ENV/:SECRET_NAME" # => demo/dev/DB_PASS
|
113
114
|
config.secrets.provider = "ssm" # default provider for conventional expansion IE: ssm or secretsmanager
|
115
|
+
config.secrets.warning = true
|
114
116
|
|
115
117
|
config.ship = ActiveSupport::OrderedOptions.new
|
116
118
|
config.ship.docker = ActiveSupport::OrderedOptions.new
|
@@ -165,7 +167,7 @@ module Ufo
|
|
165
167
|
end
|
166
168
|
# load_project_config gets called so early that logger is not yet configured.
|
167
169
|
# Cannot use Ufo.config yet and cannot use logger which relies on Ufo.config
|
168
|
-
# Use puts and use
|
170
|
+
# Use puts and use parsed_layering_show
|
169
171
|
show = show_layers?
|
170
172
|
puts "Config Layers" if show
|
171
173
|
layers.each do |layer|
|
@@ -180,34 +182,25 @@ module Ufo
|
|
180
182
|
end
|
181
183
|
|
182
184
|
def show_layers?
|
183
|
-
|
185
|
+
show_for = parsed_layering_show_for
|
186
|
+
command = ARGV[0]
|
187
|
+
parsed_layering_show && show_for.include?(command)
|
184
188
|
end
|
185
|
-
private :show_layers?
|
186
189
|
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
return false unless config_line # default is false
|
200
|
-
config_value = config_line.gsub(/.*=/,'').strip.gsub(/["']/,'')
|
201
|
-
config_value != "false" && config_value != "nil"
|
202
|
-
rescue Exception => e
|
203
|
-
if ENV['UFO_DEBUG']
|
204
|
-
puts "#{e.class} #{e.message}".color(:yellow)
|
205
|
-
puts "WARN: Unable to parse for config.layering.show".color(:yellow)
|
206
|
-
puts "Using default: config.layering.show = false"
|
207
|
-
end
|
208
|
-
false
|
190
|
+
def parsed_layering_show_for
|
191
|
+
parse.for("layering.show_for_commands", type: :array) || %w[build ship] # IE: ps exec logs are not shown
|
192
|
+
end
|
193
|
+
memoize :parsed_layering_show_for
|
194
|
+
|
195
|
+
def parsed_layering_show
|
196
|
+
ENV['UFO_LAYERS'] || parse.for("layering.show", type: :boolean)
|
197
|
+
end
|
198
|
+
private :parsed_layering_show
|
199
|
+
|
200
|
+
def parse
|
201
|
+
Parse.new
|
209
202
|
end
|
210
|
-
memoize :
|
203
|
+
memoize :parse
|
211
204
|
|
212
205
|
# Works similiar to Layering::Layer. Consider combining the logic and usin Layering::Layer
|
213
206
|
#
|
data/lib/ufo/info.rb
CHANGED
@@ -28,6 +28,7 @@ module Ufo
|
|
28
28
|
)
|
29
29
|
target_group = resp.target_groups.first
|
30
30
|
load_balancer_arn = target_group.load_balancer_arns.first # assume first only
|
31
|
+
return unless load_balancer_arn # can occur while stack is being deleted
|
31
32
|
|
32
33
|
resp = elb.describe_load_balancers(load_balancer_arns: [load_balancer_arn])
|
33
34
|
resp.load_balancers.first
|
data/lib/ufo/layering/layer.rb
CHANGED
@@ -68,9 +68,7 @@ module Ufo::Layering
|
|
68
68
|
paths
|
69
69
|
end
|
70
70
|
|
71
|
-
@@shown = false
|
72
71
|
def show_layers(paths)
|
73
|
-
return if @@shown
|
74
72
|
logger.debug "Layers:"
|
75
73
|
paths.each do |path|
|
76
74
|
if ENV['UFO_LAYERS_ALL']
|
@@ -79,7 +77,6 @@ module Ufo::Layering
|
|
79
77
|
logger.info " #{pretty_path(path)}" if File.exist?(path)
|
80
78
|
end
|
81
79
|
end
|
82
|
-
@@shown = true
|
83
80
|
end
|
84
81
|
end
|
85
82
|
end
|
@@ -14,7 +14,7 @@ module Ufo::TaskDefinition::Helpers
|
|
14
14
|
else
|
15
15
|
# Logger causes infinite loop when waf helper used in .ufo/
|
16
16
|
logger.warn "WARN: ACM cert not found: #{domain}".color(:yellow)
|
17
|
-
call_line =
|
17
|
+
call_line = ufo_call_line
|
18
18
|
DslEvaluator.print_code(call_line)
|
19
19
|
nil
|
20
20
|
end
|
@@ -12,7 +12,7 @@ module Ufo::TaskDefinition::Helpers
|
|
12
12
|
resp.repositories.first
|
13
13
|
rescue Aws::ECR::Errors::RepositoryNotFoundException => e
|
14
14
|
logger.warn "WARN: #{e.class} #{e.message}".color(:yellow)
|
15
|
-
call_line =
|
15
|
+
call_line = ufo_call_line
|
16
16
|
DslEvaluator.print_code(call_line)
|
17
17
|
nil
|
18
18
|
end
|
@@ -9,7 +9,7 @@ module Ufo::TaskDefinition::Helpers
|
|
9
9
|
stack = find_stack(stack_name)
|
10
10
|
unless stack
|
11
11
|
logger.error "ERROR: Stack not found: #{stack_name}".color(:red)
|
12
|
-
call_line =
|
12
|
+
call_line = ufo_call_line
|
13
13
|
DslEvaluator.print_code(call_line)
|
14
14
|
return
|
15
15
|
end
|
@@ -5,8 +5,10 @@ module Ufo::TaskDefinition::Helpers::Vars
|
|
5
5
|
extend Memoist
|
6
6
|
include AwsHelper
|
7
7
|
include Ufo::Concerns::Names
|
8
|
-
include Ufo::Utils::Pretty
|
9
8
|
include Ufo::Config::CallableOption::Concern
|
9
|
+
include Ufo::Utils::CallLine
|
10
|
+
include Ufo::Utils::Logging
|
11
|
+
include Ufo::Utils::Pretty
|
10
12
|
|
11
13
|
def initialize(options={})
|
12
14
|
# use either file or text. text takes higher precedence
|
@@ -15,25 +17,61 @@ module Ufo::TaskDefinition::Helpers::Vars
|
|
15
17
|
end
|
16
18
|
|
17
19
|
def content
|
18
|
-
@text
|
20
|
+
@text if @text
|
21
|
+
read(*find_files)
|
19
22
|
end
|
20
23
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
24
|
+
# Not considering .env files in project root since this is more for deployment
|
25
|
+
# Also ufo supports a smarter format than the normal .env files
|
26
|
+
def find_files
|
27
|
+
return @file if @file
|
28
|
+
layers = [
|
29
|
+
"base",
|
30
|
+
"#{Ufo.env}",
|
31
|
+
"#{Ufo.app}",
|
32
|
+
"#{Ufo.app}/base",
|
33
|
+
"#{Ufo.app}/#{Ufo.env}",
|
34
|
+
"#{Ufo.app}/#{Ufo.role}",
|
35
|
+
"#{Ufo.app}/#{Ufo.role}/base",
|
36
|
+
"#{Ufo.app}/#{Ufo.role}/#{Ufo.env}",
|
37
|
+
]
|
38
|
+
layers.map! { |l| ".ufo/env_files/#{l}#{@ext}" }
|
39
|
+
show_layers(layers)
|
40
|
+
layers.select! { |l| File.exist?(l) }
|
41
|
+
layers
|
42
|
+
end
|
43
|
+
|
44
|
+
def show_layers(paths)
|
45
|
+
label = @ext.sub('.','').capitalize
|
46
|
+
paths.each do |path|
|
47
|
+
if ENV['UFO_LAYERS_ALL']
|
48
|
+
logger.info " #{path}"
|
49
|
+
elsif Ufo.config.layering.show
|
50
|
+
logger.info " #{path} "if File.exist?(path)
|
51
|
+
end
|
26
52
|
end
|
27
|
-
IO.read(full_path)
|
28
53
|
end
|
29
54
|
|
30
|
-
def
|
55
|
+
def read(*paths)
|
56
|
+
text= ""
|
57
|
+
paths.compact.each do |path|
|
58
|
+
text << IO.read("#{Ufo.root}/#{path}")
|
59
|
+
text << "\n"
|
60
|
+
end
|
61
|
+
text
|
62
|
+
end
|
63
|
+
|
64
|
+
def env(ext='.env')
|
65
|
+
@ext = ext # assign instance variable so dont have to pass around
|
31
66
|
lines = filtered_lines(content)
|
32
67
|
lines.map do |line|
|
68
|
+
line = line.sub('export ', '') # allow user to use export. ufo ignores it
|
33
69
|
key,*value = line.strip.split("=").map do |x|
|
34
70
|
remove_surrounding_quotes(x.strip)
|
35
71
|
end
|
36
72
|
value = value.join('=')
|
73
|
+
# Note: env vars do NOT support valueFrom
|
74
|
+
# Docs: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#container_definition_environment
|
37
75
|
{
|
38
76
|
name: key,
|
39
77
|
value: value,
|
@@ -42,7 +80,7 @@ module Ufo::TaskDefinition::Helpers::Vars
|
|
42
80
|
end
|
43
81
|
|
44
82
|
def secrets
|
45
|
-
secrets = env
|
83
|
+
secrets = env('.secrets')
|
46
84
|
secrets.map do |item|
|
47
85
|
value = item.delete(:value)
|
48
86
|
arn = normalize_to_arn(item[:name], value)
|
@@ -69,11 +107,15 @@ module Ufo::TaskDefinition::Helpers::Vars
|
|
69
107
|
# arn:aws:ssm:us-west-2:111111111111:parameter/demo/dev/DB-NAME
|
70
108
|
# arn:aws:ssm:us-west-2:111111111111:parameter/demo/dev/DB-NAME
|
71
109
|
def expansion(arn)
|
72
|
-
# performance improvement only run names.expansion on the name portion
|
73
110
|
md = arn.match(/(.*:)(parameter\/|secret:)(.*)/)
|
74
|
-
|
75
|
-
|
76
|
-
|
111
|
+
if md
|
112
|
+
prefix, type, name = md[1], md[2], md[3]
|
113
|
+
# performance improvement only run names.expansion on the name portion
|
114
|
+
expanded_name = names.expansion(name, dasherize: false) # dasherize: false. dont turn SECRET_NAME => SECRET-NAME
|
115
|
+
"#{prefix}#{type}#{expanded_name}"
|
116
|
+
else # not arn full value. In case user accidentally puts value in .secrets file KEY=value
|
117
|
+
names.expansion(arn, dasherize: false) # dasherize: false. dont turn SECRET_NAME => SECRET-NAME
|
118
|
+
end
|
77
119
|
end
|
78
120
|
|
79
121
|
# Examples with config.secrets.provider = "ssm"
|
@@ -6,7 +6,7 @@ module Ufo::TaskDefinition::Helpers
|
|
6
6
|
alias_method :env_vars, :env
|
7
7
|
alias_method :environment, :env
|
8
8
|
|
9
|
-
def env_file(path)
|
9
|
+
def env_file(path=nil)
|
10
10
|
Builder.new(file: path).env
|
11
11
|
end
|
12
12
|
|
@@ -14,7 +14,7 @@ module Ufo::TaskDefinition::Helpers
|
|
14
14
|
Builder.new(text: text).secrets
|
15
15
|
end
|
16
16
|
|
17
|
-
def secrets_file(path)
|
17
|
+
def secrets_file(path=nil)
|
18
18
|
Builder.new(file: path).secrets
|
19
19
|
end
|
20
20
|
end
|
@@ -20,7 +20,7 @@ module Ufo::TaskDefinition::Helpers
|
|
20
20
|
else
|
21
21
|
# Logger causes infinite loop when waf helper used in .ufo/
|
22
22
|
logger.warn "WARN: Web ACL not found: #{name}".color(:yellow)
|
23
|
-
call_line =
|
23
|
+
call_line = ufo_call_line
|
24
24
|
DslEvaluator.print_code(call_line)
|
25
25
|
end
|
26
26
|
end
|
data/lib/ufo/utils/call_line.rb
CHANGED
data/lib/ufo/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ufo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.2.
|
4
|
+
version: 6.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tung Nguyen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-03-
|
11
|
+
date: 2022-03-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-logs
|
@@ -453,10 +453,11 @@ extensions: []
|
|
453
453
|
extra_rdoc_files: []
|
454
454
|
files:
|
455
455
|
- ".cody/README.md"
|
456
|
+
- ".cody/acceptance/bin/asg.sh"
|
456
457
|
- ".cody/acceptance/bin/build.sh"
|
457
458
|
- ".cody/acceptance/buildspec.yml"
|
459
|
+
- ".cody/acceptance/iam_role.rb"
|
458
460
|
- ".cody/acceptance/project.rb"
|
459
|
-
- ".cody/acceptance/role.rb"
|
460
461
|
- ".cody/shared/script/install.sh"
|
461
462
|
- ".cody/shared/script/install/ufo.sh"
|
462
463
|
- ".github/ISSUE_TEMPLATE.md"
|
@@ -594,6 +595,7 @@ files:
|
|
594
595
|
- lib/ufo/config/callable_option.rb
|
595
596
|
- lib/ufo/config/callable_option/concern.rb
|
596
597
|
- lib/ufo/config/inits.rb
|
598
|
+
- lib/ufo/config/parse.rb
|
597
599
|
- lib/ufo/core.rb
|
598
600
|
- lib/ufo/docker/builder.rb
|
599
601
|
- lib/ufo/docker/cleaner.rb
|