rubycfn 0.3.2 → 0.3.3
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 +5 -1
- data/Gemfile.lock +1 -1
- data/README.md +13 -40
- data/bin/rubycfn +56 -20
- data/lib/cli_methods.rb +5 -1
- data/lib/rubycfn/version.rb +1 -1
- data/lib/rubycfn.rb +0 -1
- data/templates/.env.erb +0 -1
- data/templates/.env.production.erb +6 -0
- data/templates/.env.rspec.erb +6 -0
- data/templates/.env.test.erb +5 -1
- data/templates/.gitignore.erb +82 -0
- data/templates/.gitlab-ci.yml.erb +75 -0
- data/templates/.rubocop.yml.erb +91 -0
- data/templates/Gemfile.erb +13 -5
- data/templates/Rakefile.erb +34 -1
- data/templates/aws_sdk.rb.erb +18 -0
- data/templates/compiler.rb.erb +61 -0
- data/templates/core_compile.rb.erb +6 -0
- data/templates/core_deploy.rb.erb +115 -0
- data/templates/core_diff.rb.erb +59 -0
- data/templates/core_upload.rb.erb +3 -0
- data/templates/dependencies.rb.erb +23 -0
- data/templates/deploy.rb.erb +53 -0
- data/templates/ecs_stack.rb.erb +12 -0
- data/templates/ecs_stack_concern.rb.erb +20 -0
- data/templates/global_variables.rb.erb +4 -0
- data/templates/helper_methods.rb.erb +3 -0
- data/templates/helpers.rb.erb +7 -0
- data/templates/main.rb.erb +4 -4
- data/templates/main_aws_helper.rb.erb +16 -0
- data/templates/parent_stack_spec.rb.erb +38 -0
- data/templates/project_concern.rb.erb +16 -50
- data/templates/project_stack.rb.erb +5 -2
- data/templates/shared_methods.rb.erb +38 -0
- data/templates/spec_helper.rb.erb +3 -1
- data/templates/subnets.rb.erb +18 -0
- data/templates/upload_stack.rb.erb +27 -0
- data/templates/vpc_concerns.rb.erb +87 -0
- data/templates/vpc_spec.rb.erb +40 -0
- data/templates/vpc_stack.rb.erb +12 -0
- metadata +30 -13
- data/lib/compound/resources.rb +0 -1
- data/lib/compound/vpc.rb +0 -90
- data/lib/compound.rb +0 -1
- data/templates/buildspec.yml.erb +0 -21
- data/templates/cfn2rubycfn.erb +0 -127
- data/templates/cicd.rb.erb +0 -91
- data/templates/compile.rb.erb +0 -18
- data/templates/example_stack_spec.rb.erb +0 -101
- data/templates/format.vim.erb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f3e0e86dd1547d4101efb979eec8e2d7fc86317c
|
4
|
+
data.tar.gz: 7eeb0659142403b03a6595684ea82dd075bd649f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4247d0ba01aea95e143db51a2cbe6468c74be2107e558a0659de5c9528785b93caf48d0584299f430eace4bc048796905f727923c010bc4ea6788eb7758f533c
|
7
|
+
data.tar.gz: 3ee4eb5457c89813e811a63c502d8628ff76bd1b905329d44e1a3a27b177fbf0d03191d80589dabaf7fb12b56b55f4db89b3516097f76ab26e5e124a57ecaf35
|
data/CHANGELOG.md
CHANGED
@@ -2,7 +2,11 @@
|
|
2
2
|
All notable changes to Rubycfn will be documented in this file.
|
3
3
|
This project uses [Semantic Versioning](http://semver.org/).
|
4
4
|
|
5
|
-
## 0.3.
|
5
|
+
## 0.3.4 (Next Release)
|
6
|
+
|
7
|
+
## 0.3.3
|
8
|
+
|
9
|
+
* Added new skeleton for projects -- [@dennisvink][@dennisvink]
|
6
10
|
|
7
11
|
## 0.3.2
|
8
12
|
* Added AWS::Serverless::Transform capability -- [@dennisvink][@dennisvink]
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -3,6 +3,10 @@
|
|
3
3
|
[RubyCfn](https://rubycfn.com/) is a light-weight tiny CloudFormation, Deployment Manager and ARM DSL to make expressing
|
4
4
|
AWS templates as Ruby code a bit more pleasing to the eye.
|
5
5
|
|
6
|
+
Note, as of 0.3.3 the default project structure changed quite a bit. The README.md does not reflect
|
7
|
+
those changes yet. A rubycfn project is now provisioned with a nested stack set up, and includes
|
8
|
+
a nested VPC and a nested ECS stack.
|
9
|
+
|
6
10
|
## Quick start
|
7
11
|
|
8
12
|
Install Rubycfn:
|
@@ -16,7 +20,7 @@ __________ ____ __________________.___._________ _____________________
|
|
16
20
|
| _/ | /| | _// | |/ \ \/ | __) | | _/
|
17
21
|
| | \ | / | | \\____ |\ \____| \ | | \
|
18
22
|
|____|_ /______/ |______ // ______| \______ /\___ / |______ /
|
19
|
-
\/ \/ \/ \/ \/ \/ [v0.3.
|
23
|
+
\/ \/ \/ \/ \/ \/ [v0.3.3]
|
20
24
|
Project name? example
|
21
25
|
Account ID? 1234567890
|
22
26
|
Select region EU (Frankfurt)
|
@@ -37,8 +41,14 @@ Running Rubycfn unit tests:
|
|
37
41
|
Running tests and compiling:
|
38
42
|
`rake`
|
39
43
|
|
40
|
-
|
41
|
-
|
44
|
+
Uploading built stacks to s3:
|
45
|
+
`rake upload`
|
46
|
+
|
47
|
+
Checking difference between local and remote stack:
|
48
|
+
`rake diff`
|
49
|
+
|
50
|
+
Deploying stack to AWS:
|
51
|
+
`rake apply`
|
42
52
|
|
43
53
|
## Philosophy
|
44
54
|
|
@@ -249,7 +259,6 @@ You start a new project by typing `rubycfn` at the prompt. This will ask you a c
|
|
249
259
|
-rw-r--r-- 1 binx staff 246 Oct 17 16:06 Gemfile
|
250
260
|
-rw-r--r-- 1 binx staff 346 Oct 17 16:06 Rakefile
|
251
261
|
drwxr-xr-x 2 binx staff 64 Oct 17 16:06 build
|
252
|
-
-rwxrwxrwx 1 binx staff 3223 Oct 17 16:06 cfn2rubycfn
|
253
262
|
drwxr-xr-x 3 binx staff 96 Oct 17 16:06 config
|
254
263
|
-rw-r--r-- 1 binx staff 15 Oct 17 16:06 format.vim
|
255
264
|
drwxr-xr-x 6 binx staff 192 Oct 17 16:06 lib
|
@@ -271,42 +280,6 @@ The `Gemfile` is a collection of Ruby dependencies. By running `bundle` you inst
|
|
271
280
|
|
272
281
|
The `Rakefile` contain the tasks that are performed when you type the `rake` command. It consists of a `compile` task and a `spec` task. You can invoke the tasks individually by typing `rake compile` or `rake spec`, but by default the `spec` task is ran first, and then the `compile` task. A “spec” is another word for unit test. It’s important to run the unit test first, so that if a test fails no template is generated. If you just run `rake` both tasks are executed sequentially, provided the specs throw no error.
|
273
282
|
|
274
|
-
`cfn2rubycfn` is a small helper script that converts AWS CloudFormation scripts to Rubycfn code. This allows you to migrate your existing projects over to Rubycfn quickly. It exports the converted CloudFormation script to `generated.rb`, a ready to use module for your stacks.
|
275
|
-
|
276
|
-
Example:
|
277
|
-
```
|
278
|
-
$ cat sample.json
|
279
|
-
{
|
280
|
-
"AWSTemplateFormatVersion": "2010-09-09",
|
281
|
-
"Resources": {
|
282
|
-
"ApiGatewayRestApi": {
|
283
|
-
"Properties": {
|
284
|
-
"Name": "trigger-github-webhook"
|
285
|
-
},
|
286
|
-
"Type": "AWS::ApiGateway::RestApi"
|
287
|
-
}
|
288
|
-
}
|
289
|
-
}
|
290
|
-
|
291
|
-
$ ./cfn2rubycfn sample.json
|
292
|
-
Reformatting code...
|
293
|
-
|
294
|
-
$ cat generated.rb
|
295
|
-
module ConvertedStack
|
296
|
-
module Main
|
297
|
-
extend ActiveSupport::Concern
|
298
|
-
included do
|
299
|
-
resource :api_gateway_rest_api,
|
300
|
-
type: "AWS::ApiGateway::RestApi" do |r|
|
301
|
-
r.property(:name) { "trigger-github-webhook" }
|
302
|
-
end
|
303
|
-
end
|
304
|
-
end
|
305
|
-
end
|
306
|
-
```
|
307
|
-
|
308
|
-
The `format.vim` file is used by the CloudFormation conversion script to reindent the file after conversion. You can make changes to the file to reflect your preferred style of code indentation.
|
309
|
-
|
310
283
|
Onto the subdirectories:
|
311
284
|
|
312
285
|
The `build` directory is where all the compiled templates end up.
|
data/bin/rubycfn
CHANGED
@@ -32,41 +32,77 @@ dotenv = render('.env', {
|
|
32
32
|
:region => region
|
33
33
|
}, path)
|
34
34
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
35
|
+
aws_sdk = render('aws_sdk.rb', {}, path)
|
36
|
+
compiler = render('compiler.rb', {}, path)
|
37
|
+
core_deploy = render('core_deploy.rb', { name: project_name }, path)
|
38
|
+
core_upload = render('core_upload.rb', {}, path)
|
39
|
+
core_compile = render('core_compile.rb', {}, path)
|
40
|
+
core_diff = render('core_diff.rb', {}, path)
|
41
|
+
dependencies = render('dependencies.rb', {}, path)
|
42
|
+
deploy = render('deploy.rb', {}, path)
|
43
|
+
dotenv_test = render('.env.test', { name: project_name }, path)
|
44
|
+
dotenv_production = render('.env.production', { name: project_name }, path)
|
45
|
+
dotenv_rspec = render('.env.rspec', { name: project_name }, path)
|
46
|
+
ecs_stack = render('ecs_stack.rb', {}, path)
|
47
|
+
ecs_stack_concern = render('ecs_Stack_concern.rb', { name: project_name }, path)
|
40
48
|
gemfile = render('Gemfile', { version: Rubycfn::VERSION }, path)
|
41
|
-
global_variables = render('global_variables.rb', {}, path)
|
49
|
+
global_variables = render('global_variables.rb', { name: project_name.downcase }, path)
|
50
|
+
helpers = render('helpers.rb', {}, path)
|
51
|
+
helper_methods = render('helper_methods.rb', {}, path)
|
42
52
|
main = render('main.rb', {}, path)
|
53
|
+
main_aws_helper = render('main_aws_helper.rb', {}, path)
|
54
|
+
parent_spec = render('parent_stack_spec.rb', { name: project_name.capitalize }, path)
|
43
55
|
project_concern = render('project_concern.rb', { name: project_name.capitalize }, path)
|
44
56
|
project_stack = render('project_stack.rb', { name: project_name.capitalize }, path)
|
45
57
|
rakefile = render('Rakefile', {}, path)
|
58
|
+
rubocop = render('.rubocop.yml', {}, path)
|
59
|
+
shared_methods = render('shared_methods.rb', {}, path)
|
46
60
|
spec_helper = render('spec_helper.rb', {}, path)
|
47
|
-
|
48
|
-
|
61
|
+
subnets = render('subnets.rb', { name: project_name }, path)
|
62
|
+
upload_stack = render('upload_stack.rb', {}, path)
|
63
|
+
vpc_stack = render('vpc_stack.rb', { name: project_name }, path)
|
64
|
+
vpc_concern = render('vpc_concerns.rb', { name: project_name }, path)
|
65
|
+
vpc_spec = render('vpc_spec.rb', { name: project_name.capitalize }, path)
|
49
66
|
|
50
67
|
# Create directory structure
|
51
|
-
FileUtils.mkdir_p project_path + '/lib/stacks/' + project_name + '_stack'
|
52
68
|
rubycfn_structure(project_path).each do |dir|
|
53
69
|
FileUtils.mkdir_p dir
|
54
70
|
end
|
55
71
|
|
72
|
+
File.open("#{project_path}/lib/aws_helper/aws_sdk.rb", 'w') { |file| file.write(aws_sdk) }
|
73
|
+
File.open("#{project_path}/lib/aws_helper/compiler.rb", 'w') { |file| file.write(compiler) }
|
74
|
+
File.open("#{project_path}/lib/aws_helper/dependencies.rb", 'w') { |file| file.write(dependencies) }
|
75
|
+
File.open("#{project_path}/lib/aws_helper/deploy.rb", 'w') { |file| file.write(deploy) }
|
76
|
+
File.open("#{project_path}/lib/core/deploy.rb", 'w') { |file| file.write(core_deploy) }
|
77
|
+
File.open("#{project_path}/lib/core/compile.rb", 'w') { |file| file.write(core_compile) }
|
78
|
+
File.open("#{project_path}/lib/core/diff.rb", 'w') { |file| file.write(core_diff) }
|
79
|
+
File.open("#{project_path}/lib/core/upload.rb", 'w') { |file| file.write(core_upload) }
|
56
80
|
File.open("#{project_path}/.env", 'w') { |file| file.write(dotenv) }
|
57
81
|
File.open("#{project_path}/.env.test", 'w') { |file| file.write(dotenv_test) }
|
82
|
+
File.open("#{project_path}/.env.production", 'w') { |file| file.write(dotenv_production) }
|
83
|
+
File.open("#{project_path}/.env.rspec", 'w') { |file| file.write(dotenv_rspec) }
|
84
|
+
File.open("#{project_path}/lib/stacks/ecs_stack.rb", 'w') { |file| file.write(ecs_stack) }
|
85
|
+
File.open("#{project_path}/lib/stacks/ecs_stack/ecs_cluster.rb", 'w') { |file| file.write(ecs_stack_concern) }
|
58
86
|
File.open("#{project_path}/Gemfile", 'w') { |file| file.write(gemfile) }
|
59
|
-
File.open("#{project_path}/Rakefile", 'w') { |file| file.write(rakefile) }
|
60
|
-
File.open("#{project_path}/cfn2rubycfn", 'w') { |file| file.write(converter) }
|
61
|
-
File.chmod(0777,"#{project_path}/cfn2rubycfn")
|
62
|
-
File.open("#{project_path}/format.vim", 'w') { |file| file.write(vimfile) }
|
63
|
-
File.open("#{project_path}/config/buildspec.yml", 'w') { |file| file.write(buildspec) }
|
64
|
-
File.open("#{project_path}/lib/main.rb", 'w') { |file| file.write(main) }
|
65
|
-
File.open("#{project_path}/lib/compile.rb", 'w') { |file| file.write(compile) }
|
66
87
|
File.open("#{project_path}/lib/shared_concerns/global_variables.rb", 'w') { |file| file.write(global_variables) }
|
67
|
-
File.open("#{project_path}/lib/
|
68
|
-
File.open("#{project_path}/lib/
|
69
|
-
File.open("#{project_path}/lib/
|
88
|
+
File.open("#{project_path}/lib/aws_helper/helpers.rb", 'w') { |file| file.write(helpers) }
|
89
|
+
File.open("#{project_path}/lib/shared_concerns/helper_methods.rb", 'w') { |file| file.write(helper_methods) }
|
90
|
+
File.open("#{project_path}/lib/main.rb", 'w') { |file| file.write(main) }
|
91
|
+
File.open("#{project_path}/lib/aws_helper/main.rb", 'w') { |file| file.write(main_aws_helper) }
|
92
|
+
File.open("#{project_path}/spec/lib/parent_spec.rb", 'w') { |file| file.write(parent_spec) }
|
93
|
+
File.open("#{project_path}/lib/stacks/parent_stack.rb", 'w') { |file| file.write(project_stack) }
|
94
|
+
File.open("#{project_path}/lib/stacks/parent_stack/parent.rb", 'w') { |file| file.write(project_concern) }
|
95
|
+
File.open("#{project_path}/Rakefile", 'w') { |file| file.write(rakefile) }
|
96
|
+
File.open("#{project_path}/.rubocop.yml", 'w') { |file| file.write(rubocop) }
|
97
|
+
File.open("#{project_path}/lib/shared_concerns/shared_methods.rb", 'w') { |file| file.write(shared_methods) }
|
70
98
|
File.open("#{project_path}/spec/spec_helper.rb", 'w') { |file| file.write(spec_helper) }
|
71
|
-
File.open("#{project_path}/
|
99
|
+
File.open("#{project_path}/lib/stacks/vpc_stack/subnets.rb", 'w') { |file| file.write(subnets) }
|
100
|
+
File.open("#{project_path}/lib/aws_helper/upload_stack.rb", 'w') { |file| file.write(upload_stack) }
|
101
|
+
File.open("#{project_path}/spec/lib/vpc_spec.rb", 'w') { |file| file.write(vpc_spec) }
|
102
|
+
File.open("#{project_path}/lib/stacks/vpc_stack.rb", 'w') { |file| file.write(vpc_stack) }
|
103
|
+
File.open("#{project_path}/lib/stacks/vpc_stack/vpc.rb", 'w') { |file| file.write(vpc_concern) }
|
72
104
|
|
105
|
+
puts "Setting up Rubycfn #{project_name} project..."
|
106
|
+
`cd #{project_name}-rubycfn && git init && bundle`
|
107
|
+
`bundle`
|
108
|
+
puts "Done!"
|
data/lib/cli_methods.rb
CHANGED
@@ -39,9 +39,13 @@ def rubycfn_structure(project_name)
|
|
39
39
|
[
|
40
40
|
project_name,
|
41
41
|
project_name + '/build',
|
42
|
-
project_name + '/
|
42
|
+
project_name + '/lib/aws_helper',
|
43
|
+
project_name + '/lib/core',
|
43
44
|
project_name + '/lib/shared_concerns',
|
44
45
|
project_name + '/lib/stacks',
|
46
|
+
project_name + '/lib/stacks/ecs_stack',
|
47
|
+
project_name + '/lib/stacks/parent_stack',
|
48
|
+
project_name + '/lib/stacks/vpc_stack',
|
45
49
|
project_name + '/spec',
|
46
50
|
project_name + '/spec/lib'
|
47
51
|
]
|
data/lib/rubycfn/version.rb
CHANGED
data/lib/rubycfn.rb
CHANGED
data/templates/.env.erb
CHANGED
@@ -0,0 +1,6 @@
|
|
1
|
+
# ENV vars for production environment
|
2
|
+
CLOUD_TRAIL_MONITOR_SNS_RECIPIENTS="changeme@example.com,changemetoo@example.com"
|
3
|
+
ROOT_MONITOR_SNS_RECIPIENTS="changeme@example.com,changemetoo@example.com"
|
4
|
+
VPC_CIDR_BLOCK="10.200.0.0/16"
|
5
|
+
ARTIFACT_BUCKET="my-awesome-cloudformation-artifact-bucket-for-production"
|
6
|
+
STACK_NAME="production"
|
data/templates/.env.test.erb
CHANGED
@@ -1,2 +1,6 @@
|
|
1
1
|
# ENV vars for test environment
|
2
|
-
|
2
|
+
CLOUD_TRAIL_MONITOR_SNS_RECIPIENTS="changeme@example.com,changemetoo@example.com"
|
3
|
+
ROOT_MONITOR_SNS_RECIPIENTS="changeme@example.com,changemetoo@example.com"
|
4
|
+
VPC_CIDR_BLOCK="10.100.0.0/16"
|
5
|
+
ARTIFACT_BUCKET="my-awesome-cloudformation-artifact-bucket"
|
6
|
+
STACK_NAME="test"
|
@@ -0,0 +1,82 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
/.config
|
4
|
+
.idea/
|
5
|
+
/coverage/
|
6
|
+
/InstalledFiles
|
7
|
+
/pkg/
|
8
|
+
/spec/reports/
|
9
|
+
/spec/examples.txt
|
10
|
+
/test/tmp/
|
11
|
+
/test/version_tmp/
|
12
|
+
/tmp/
|
13
|
+
.dat*
|
14
|
+
.repl_history
|
15
|
+
build/
|
16
|
+
*.bridgesupport
|
17
|
+
build-iPhoneOS/
|
18
|
+
build-iPhoneSimulator/
|
19
|
+
/.yardoc/
|
20
|
+
/_yardoc/
|
21
|
+
/doc/
|
22
|
+
/rdoc/
|
23
|
+
/.bundle/
|
24
|
+
/vendor/bundle
|
25
|
+
/lib/bundler/man/
|
26
|
+
.rvmrc
|
27
|
+
Thumbs.db
|
28
|
+
ehthumbs.db
|
29
|
+
ehthumbs_vista.db
|
30
|
+
*.stackdump
|
31
|
+
[Dd]esktop.ini
|
32
|
+
$RECYCLE.BIN/
|
33
|
+
*.cab
|
34
|
+
*.msi
|
35
|
+
*.msix
|
36
|
+
*.msm
|
37
|
+
*.msp
|
38
|
+
*.lnk
|
39
|
+
.DS_Store
|
40
|
+
.AppleDouble
|
41
|
+
.LSOverride
|
42
|
+
Icon
|
43
|
+
._*
|
44
|
+
.DocumentRevisions-V100
|
45
|
+
.fseventsd
|
46
|
+
.Spotlight-V100
|
47
|
+
.TemporaryItems
|
48
|
+
.Trashes
|
49
|
+
.VolumeIcon.icns
|
50
|
+
.com.apple.timemachine.donotpresent
|
51
|
+
.AppleDB
|
52
|
+
.AppleDesktop
|
53
|
+
Network Trash Folder
|
54
|
+
Temporary Items
|
55
|
+
.apdisk
|
56
|
+
*~
|
57
|
+
.fuse_hidden*
|
58
|
+
.directory
|
59
|
+
.Trash-*
|
60
|
+
.nfs*
|
61
|
+
[._]*.s[a-v][a-z]
|
62
|
+
[._]*.sw[a-p]
|
63
|
+
[._]s[a-v][a-z]
|
64
|
+
[._]sw[a-p]
|
65
|
+
Session.vim
|
66
|
+
.netrwhist
|
67
|
+
*~
|
68
|
+
tags
|
69
|
+
[._]*.un~
|
70
|
+
cmake-build-debug/
|
71
|
+
cmake-build-release/
|
72
|
+
*.iws
|
73
|
+
out/
|
74
|
+
atlassian-ide-plugin.xml
|
75
|
+
com_crashlytics_export_strings.xml
|
76
|
+
crashlytics.properties
|
77
|
+
crashlytics-build.properties
|
78
|
+
fabric.properties
|
79
|
+
.env.private
|
80
|
+
test-reports
|
81
|
+
temp/
|
82
|
+
attic/
|
@@ -0,0 +1,75 @@
|
|
1
|
+
image: rubycfn/rubycfn:latest
|
2
|
+
|
3
|
+
before_script:
|
4
|
+
- bundle
|
5
|
+
|
6
|
+
variables:
|
7
|
+
CFN_ARTIFACT_BUCKET: "my-awesome-cloudformation-bucket"
|
8
|
+
STAGING_AWS_REGION: eu-west-1
|
9
|
+
PROD_AWS_REGION: eu-west-1
|
10
|
+
|
11
|
+
stages:
|
12
|
+
- build
|
13
|
+
- test
|
14
|
+
- upload
|
15
|
+
- staging
|
16
|
+
- production
|
17
|
+
|
18
|
+
build:
|
19
|
+
stage: build
|
20
|
+
variables:
|
21
|
+
ARTIFACT_BUCKET: ${CFN_ARTIFACT_BUCKET}
|
22
|
+
script:
|
23
|
+
- export SLACK_WEBHOOK=$K8S_SECRET_SLACK_POST_HOOK
|
24
|
+
- ENVIRONMENT="test" rake compile
|
25
|
+
- ENVIRONMENT="production" rake compile
|
26
|
+
- rubocop
|
27
|
+
- cfn_nag_scan --input-path build/ || true
|
28
|
+
artifacts:
|
29
|
+
paths:
|
30
|
+
- build/
|
31
|
+
|
32
|
+
test:
|
33
|
+
stage: test
|
34
|
+
script:
|
35
|
+
- rake spec
|
36
|
+
dependencies:
|
37
|
+
- build
|
38
|
+
|
39
|
+
upload:
|
40
|
+
stage: upload
|
41
|
+
variables:
|
42
|
+
ARTIFACT_BUCKET: ${CFN_ARTIFACT_BUCKET}
|
43
|
+
AWS_REGION: ${STAGING_AWS_REGION}
|
44
|
+
script:
|
45
|
+
- export AWS_SECRET_ACCESS_KEY=$K8S_SECRET_AWS_SECRET_ACCESS_KEY
|
46
|
+
- export AWS_ACCESS_KEY_ID=$K8S_SECRET_AWS_ACCESS_KEY_ID
|
47
|
+
- ENVIRONMENT="test" rake upload
|
48
|
+
- ENVIRONMENT="production" rake upload
|
49
|
+
|
50
|
+
deploy_staging:
|
51
|
+
stage: staging
|
52
|
+
variables:
|
53
|
+
ARTIFACT_BUCKET: ${CFN_ARTIFACT_BUCKET}
|
54
|
+
AWS_REGION: ${STAGING_AWS_REGION}
|
55
|
+
script:
|
56
|
+
- export AWS_SECRET_ACCESS_KEY=$K8S_SECRET_AWS_SECRET_ACCESS_KEY
|
57
|
+
- export AWS_ACCESS_KEY_ID=$K8S_SECRET_AWS_ACCESS_KEY_ID
|
58
|
+
- export ENVIRONMENT="test"
|
59
|
+
- rake apply
|
60
|
+
allow_failure: false
|
61
|
+
|
62
|
+
deploy_prod:
|
63
|
+
stage: production
|
64
|
+
variables:
|
65
|
+
ARTIFACT_BUCKET: ${CFN_ARTIFACT_BUCKET}
|
66
|
+
AWS_REGION: ${PROD_AWS_REGION}
|
67
|
+
script:
|
68
|
+
- export AWS_SECRET_ACCESS_KEY=$K8S_SECRET_AWS_SECRET_ACCESS_KEY
|
69
|
+
- export AWS_ACCESS_KEY_ID=$K8S_SECRET_AWS_ACCESS_KEY_ID
|
70
|
+
- export ENVIRONMENT="production"
|
71
|
+
- rake apply
|
72
|
+
dependencies:
|
73
|
+
- deploy_staging
|
74
|
+
when: manual
|
75
|
+
allow_failure: false
|
@@ -0,0 +1,91 @@
|
|
1
|
+
AllCops:
|
2
|
+
TargetRubyVersion: 2.3
|
3
|
+
|
4
|
+
DisplayCopNames: true
|
5
|
+
Include:
|
6
|
+
- "Gemfile"
|
7
|
+
- "Rakefile"
|
8
|
+
- "bin/*"
|
9
|
+
- "*.gemspec"
|
10
|
+
- "lib/**/*.rb"
|
11
|
+
Exclude:
|
12
|
+
- "test/**/*.rb"
|
13
|
+
- "spec/**/*.rb"
|
14
|
+
|
15
|
+
Metrics/AbcSize:
|
16
|
+
Max: 500
|
17
|
+
Exclude:
|
18
|
+
- "test/**/*"
|
19
|
+
- "spec/**/*"
|
20
|
+
|
21
|
+
Metrics/ClassLength:
|
22
|
+
Max: 500
|
23
|
+
Exclude:
|
24
|
+
- "test/**/*"
|
25
|
+
- "spec/**/*"
|
26
|
+
|
27
|
+
Metrics/CyclomaticComplexity:
|
28
|
+
Max: 40
|
29
|
+
Exclude:
|
30
|
+
- "test/**/*"
|
31
|
+
- "spec/**/*"
|
32
|
+
|
33
|
+
Style/Documentation:
|
34
|
+
Enabled: false
|
35
|
+
|
36
|
+
Metrics/LineLength:
|
37
|
+
Max: 500
|
38
|
+
Exclude:
|
39
|
+
- "test/**/*"
|
40
|
+
- "spec/**/*"
|
41
|
+
|
42
|
+
Metrics/ModuleLength:
|
43
|
+
Max: 500
|
44
|
+
|
45
|
+
Metrics/MethodLength:
|
46
|
+
Max: 40
|
47
|
+
|
48
|
+
Metrics/BlockLength:
|
49
|
+
Max: 500
|
50
|
+
|
51
|
+
Performance/Casecmp:
|
52
|
+
Enabled: false
|
53
|
+
|
54
|
+
Style/DoubleNegation:
|
55
|
+
Enabled: false
|
56
|
+
|
57
|
+
Style/StringLiterals:
|
58
|
+
EnforcedStyle: double_quotes
|
59
|
+
|
60
|
+
Style/StringLiteralsInInterpolation:
|
61
|
+
EnforcedStyle: double_quotes
|
62
|
+
|
63
|
+
Style/Next:
|
64
|
+
Enabled: false
|
65
|
+
|
66
|
+
Style/FrozenStringLiteralComment:
|
67
|
+
Enabled: false
|
68
|
+
|
69
|
+
Security/MarshalLoad:
|
70
|
+
Enabled: false
|
71
|
+
|
72
|
+
Style/PercentLiteralDelimiters:
|
73
|
+
PreferredDelimiters:
|
74
|
+
default: '()'
|
75
|
+
'%i': '()'
|
76
|
+
'%w': '()'
|
77
|
+
|
78
|
+
Style/ExpandPathArguments:
|
79
|
+
Enabled: false
|
80
|
+
|
81
|
+
Style/RescueStandardError:
|
82
|
+
EnforcedStyle: "implicit"
|
83
|
+
|
84
|
+
Style/IfUnlessModifier:
|
85
|
+
Enabled: false
|
86
|
+
|
87
|
+
Style/DateTime:
|
88
|
+
Enabled: false
|
89
|
+
|
90
|
+
Layout/SpaceInsideHashLiteralBraces:
|
91
|
+
EnforcedStyle: space
|
data/templates/Gemfile.erb
CHANGED
@@ -1,9 +1,17 @@
|
|
1
1
|
source "https://rubygems.org" do
|
2
|
-
gem "
|
3
|
-
gem "
|
4
|
-
gem "
|
5
|
-
gem "
|
2
|
+
gem "aws-sdk", "~> 3.0.1"
|
3
|
+
gem "aws-sdk-s3", "~> 1.36.0"
|
4
|
+
gem "colorize", "~> 0.8.1"
|
5
|
+
gem "diffy", "~> 3.3.0"
|
6
|
+
gem "git-revision", "~> 0.0.2"
|
7
|
+
gem "launchy", "~> 2.4.3"
|
8
|
+
gem "rspec", "~> 3.8"
|
9
|
+
gem "rspec-expectations", "~> 3.8", ">= 3.8.3"
|
10
|
+
gem "rspec-given", "~> 3.8"
|
11
|
+
gem "rspec-its", "~> 1.3"
|
12
|
+
gem "rspec-mocks", "~> 3.8"
|
6
13
|
gem "rspec_junit_formatter", "~> 0.2"
|
14
|
+
gem "rubocop", "~> 0.57.1"
|
15
|
+
gem "rubycfn", "~> <%= version %>"
|
7
16
|
gem "simplecov", "~> 0.16.1"
|
8
|
-
gem "launchy", "~> 2.4.3"
|
9
17
|
end
|
data/templates/Rakefile.erb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
require "rubygems"
|
2
2
|
require "bundler"
|
3
3
|
require "rspec/core/rake_task"
|
4
|
+
require "rubocop/rake_task"
|
5
|
+
|
6
|
+
Bundler.setup
|
4
7
|
|
5
8
|
RSpec::Core::RakeTask.new do |t|
|
6
9
|
t.rspec_opts = \
|
@@ -8,10 +11,40 @@ RSpec::Core::RakeTask.new do |t|
|
|
8
11
|
" --out test-reports/rspec.xml"
|
9
12
|
end
|
10
13
|
|
14
|
+
desc "Apply CloudFormation template"
|
15
|
+
task :apply do
|
16
|
+
require_relative "lib/main"
|
17
|
+
require_relative "lib/core/deploy"
|
18
|
+
end
|
19
|
+
|
20
|
+
desc "Upload stacks to s3"
|
21
|
+
task :upload do
|
22
|
+
require_relative "lib/main"
|
23
|
+
require_relative "lib/core/upload"
|
24
|
+
end
|
25
|
+
|
26
|
+
desc "Clean build directory"
|
27
|
+
task :clean do
|
28
|
+
Dir.foreach("build/") do |f|
|
29
|
+
fn = File.join("build/", f)
|
30
|
+
File.delete(fn) if f != "." && f != ".."
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
desc "Diff CloudFormation template"
|
35
|
+
task :diff do
|
36
|
+
require_relative "lib/main"
|
37
|
+
require_relative "lib/core/diff"
|
38
|
+
end
|
39
|
+
|
11
40
|
desc "Compile CloudFormation"
|
12
41
|
task :compile do
|
13
42
|
require_relative "lib/main"
|
14
|
-
require_relative "lib/compile"
|
43
|
+
require_relative "lib/core/compile"
|
44
|
+
end
|
45
|
+
|
46
|
+
RuboCop::RakeTask.new(:rubocop) do |t|
|
47
|
+
t.options = ["--display-cop-names"]
|
15
48
|
end
|
16
49
|
|
17
50
|
task default: %i(spec compile)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
def create_bucket_if_not_exists(aws_region, artifact_bucket)
|
2
|
+
s3 = Aws::S3::Resource.new(region: aws_region)
|
3
|
+
begin
|
4
|
+
s3.create_bucket(bucket: artifact_bucket)
|
5
|
+
rescue => exception
|
6
|
+
raise exception unless exception.class == Aws::S3::Errors::BucketAlreadyOwnedByYou
|
7
|
+
end
|
8
|
+
s3
|
9
|
+
end
|
10
|
+
|
11
|
+
def set_aws_credentials(region, access_key_id, secret_access_key)
|
12
|
+
Aws.config.update(
|
13
|
+
region: region,
|
14
|
+
credentials: Aws::Credentials.new(
|
15
|
+
access_key_id, secret_access_key
|
16
|
+
)
|
17
|
+
)
|
18
|
+
end
|