rails_template_18f 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +3 -1
- data/README.md +4 -4
- data/lib/generators/rails_template18f/circleci/circleci_generator.rb +26 -10
- data/lib/generators/rails_template18f/dap/dap_generator.rb +72 -0
- data/lib/generators/rails_template18f/github_actions/github_actions_generator.rb +27 -11
- data/lib/generators/rails_template18f/newrelic/newrelic_generator.rb +79 -0
- data/{templates/config/newrelic.yml → lib/generators/rails_template18f/newrelic/templates/config/newrelic.yml.tt} +7 -7
- data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/README.md.tt +0 -0
- data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/bootstrap/import.sh +0 -0
- data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/bootstrap/main.tf.tt +3 -3
- data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/bootstrap/providers.tf +0 -0
- data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/bootstrap/run.sh.tt +1 -1
- data/lib/generators/rails_template18f/terraform/templates/terraform/bootstrap/teardown_creds.sh.tt +5 -0
- data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/bootstrap/variables.tf +0 -0
- data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/create_space_deployer.sh +0 -0
- data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/destroy_space_deployer.sh +0 -0
- data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/production/main.tf.tt +4 -4
- data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/production/providers.tf.tt +0 -0
- data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/production/variables.tf +0 -0
- data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/shared/database/main.tf.tt +0 -0
- data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/shared/database/providers.tf +0 -0
- data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/shared/database/variables.tf +0 -0
- data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/shared/domain/main.tf.tt +1 -1
- data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/shared/domain/providers.tf +0 -0
- data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/shared/domain/variables.tf +0 -0
- data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/shared/s3/main.tf +0 -0
- data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/shared/s3/providers.tf +0 -0
- data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/shared/s3/variables.tf +0 -0
- data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/staging/main.tf.tt +4 -4
- data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/staging/providers.tf.tt +0 -0
- data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/staging/variables.tf +0 -0
- data/lib/generators/rails_template18f/terraform/terraform_generator.rb +95 -0
- data/lib/rails_template18f/generators/base.rb +36 -0
- data/lib/rails_template18f/generators/cloud_gov_options.rb +57 -0
- data/lib/rails_template18f/generators/pipeline_options.rb +18 -0
- data/lib/rails_template18f/generators.rb +11 -0
- data/lib/rails_template18f/version.rb +1 -1
- data/lib/rails_template_18f.rb +1 -4
- data/template.rb +17 -61
- data/templates/README.md.tt +7 -44
- data/templates/doc/compliance/apps/application.boundary.md.tt +4 -24
- data/templates/githooks/{pre-commit.tt → pre-commit} +0 -15
- data/templates/manifest.yml.tt +1 -2
- metadata +35 -29
- data/lib/rails_template18f/terraform_options.rb +0 -68
- data/templates/terraform/bootstrap/teardown_creds.sh.tt +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f3b689fcfbc4d7ed1a476adc0b415ed0cbbfc24828937431820b5850db77e564
|
4
|
+
data.tar.gz: 5f95740853330bc904b23c67059a578b3f616cea6228c7c99a19d4eee5c26518
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c350c36aeddf44806c2ddbd36dbacd626f361890a9a648ec6e58e4dbeba5b60928ece499542bae318f7f7f644af52b55c7b9e9f6639291f7dd00c00229f5334
|
7
|
+
data.tar.gz: 75079b3718a90069ae1484b54b86dac37c89be836bd132afc8bd936fb0e1451aa85882a5fafa8a980f60094ce352fb933d7ae0179a557a9b6196d018d2a681c1
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rails_template_18f (0.
|
4
|
+
rails_template_18f (0.2.0)
|
5
5
|
activesupport (~> 7.0.0)
|
6
6
|
railties (~> 7.0.0)
|
7
7
|
|
@@ -32,6 +32,7 @@ GEM
|
|
32
32
|
rspec-rails (>= 2.2)
|
33
33
|
ast (2.4.2)
|
34
34
|
builder (3.2.4)
|
35
|
+
byebug (11.1.3)
|
35
36
|
colorize (0.8.1)
|
36
37
|
concurrent-ruby (1.1.9)
|
37
38
|
crass (1.0.6)
|
@@ -122,6 +123,7 @@ PLATFORMS
|
|
122
123
|
|
123
124
|
DEPENDENCIES
|
124
125
|
ammeter (~> 1.1)
|
126
|
+
byebug
|
125
127
|
colorize (~> 0.8)
|
126
128
|
rails_template_18f!
|
127
129
|
rake (~> 13.0)
|
data/README.md
CHANGED
@@ -97,10 +97,10 @@ ActionCable is included to enable the [Turbo Streams](https://turbo.hotwired.dev
|
|
97
97
|
1. Optionally create Github Actions workflows for testing and cloud.gov deploy
|
98
98
|
1. Optionally create terraform modules supporting staging & production cloud.gov spaces
|
99
99
|
1. Optionally create CircleCI workflows for testing and cloud.gov deploy
|
100
|
-
1. Optionally create [Architecture Decision Records](https://adr.github.io/) for above setup
|
101
100
|
1. Optionally create a New Relic config with FEDRAMP-specific host
|
102
101
|
1. Optionally configure DAP (Digital Analytics Program)
|
103
102
|
1. Optionally add base translation files and routes for Spanish, French, and Simplified Chinese (es.yml, fr.yml, and zh.yml)
|
103
|
+
1. Create [Architecture Decision Records](https://adr.github.io/) for above setup
|
104
104
|
1. Commit the resulting project with git (unless `--skip-git` is passed)
|
105
105
|
|
106
106
|
## Use for an existing Rails project
|
@@ -110,7 +110,7 @@ ActionCable is included to enable the [Turbo Streams](https://turbo.hotwired.dev
|
|
110
110
|
Add this line to your application's Gemfile:
|
111
111
|
|
112
112
|
```ruby
|
113
|
-
gem "
|
113
|
+
gem "rails_template_18f", group: :development
|
114
114
|
```
|
115
115
|
|
116
116
|
And then run:
|
@@ -119,7 +119,7 @@ And then run:
|
|
119
119
|
|
120
120
|
Or install it yourself as:
|
121
121
|
|
122
|
-
$ gem install
|
122
|
+
$ gem install rails_template_18f
|
123
123
|
|
124
124
|
### Usage
|
125
125
|
|
@@ -133,7 +133,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
133
133
|
|
134
134
|
## Contributing
|
135
135
|
|
136
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
136
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/18f/rails-template. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/18f/rails-template/blob/main/CODE_OF_CONDUCT.md).
|
137
137
|
|
138
138
|
## Code of Conduct
|
139
139
|
|
@@ -1,20 +1,18 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "rails/generators"
|
4
|
+
|
3
5
|
module RailsTemplate18f
|
4
6
|
module Generators
|
5
7
|
class CircleciGenerator < ::Rails::Generators::Base
|
6
|
-
include
|
7
|
-
include
|
8
|
+
include Base
|
9
|
+
include PipelineOptions
|
8
10
|
|
9
11
|
desc <<~DESC
|
10
12
|
Description:
|
11
13
|
Install CircleCI pipeline files
|
12
14
|
DESC
|
13
15
|
|
14
|
-
def self.source_root
|
15
|
-
@source_root ||= File.expand_path(File.join(File.dirname(__FILE__), "templates"))
|
16
|
-
end
|
17
|
-
|
18
16
|
def install_needed_gems
|
19
17
|
gem "rspec_junit_formatter", "~> 0.5", group: :test
|
20
18
|
end
|
@@ -27,10 +25,28 @@ module RailsTemplate18f
|
|
27
25
|
end
|
28
26
|
|
29
27
|
def update_readme
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
28
|
+
if file_content("README.md").match?(/^## CI\/CD$/)
|
29
|
+
insert_into_file "README.md", readme_cicd, after: "## CI/CD\n"
|
30
|
+
insert_into_file "README.md", readme_staging_deploy, after: "#### Staging\n"
|
31
|
+
insert_into_file "README.md", readme_prod_deploy, after: "#### Production\n"
|
32
|
+
insert_into_file "README.md", readme_credentials, after: "#### Credentials and other Secrets\n"
|
33
|
+
else
|
34
|
+
append_to_file "README.md", <<~EOM
|
35
|
+
## CI/CD
|
36
|
+
#{readme_cicd}
|
37
|
+
|
38
|
+
### Deployment
|
39
|
+
|
40
|
+
#### Staging
|
41
|
+
#{readme_staging_deploy}
|
42
|
+
|
43
|
+
#### Production
|
44
|
+
#{readme_prod_deploy}
|
45
|
+
|
46
|
+
#### Credentials and other Secrets
|
47
|
+
#{readme_credentials}
|
48
|
+
EOM
|
49
|
+
end
|
34
50
|
end
|
35
51
|
|
36
52
|
def update_boundary_diagram
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rails/generators"
|
4
|
+
|
5
|
+
module RailsTemplate18f
|
6
|
+
module Generators
|
7
|
+
class DapGenerator < ::Rails::Generators::Base
|
8
|
+
include Base
|
9
|
+
|
10
|
+
class_option :agency_code, default: "GSA", desc: "Agency code to track DAP metrics"
|
11
|
+
|
12
|
+
desc <<~DESC
|
13
|
+
Description:
|
14
|
+
Install JS snippet for Digital Analytics Program (DAP)
|
15
|
+
DESC
|
16
|
+
|
17
|
+
def update_content_security_policy
|
18
|
+
csp_file = "config/initializers/content_security_policy.rb"
|
19
|
+
gsub_file csp_file, /(policy.img_src .*)$/, '\1, "https://www.google-analytics.com"'
|
20
|
+
gsub_file csp_file, /(policy.script_src .*)$/, '\1, "https://dap.digitalgov.gov", "https://www.google-analytics.com"'
|
21
|
+
if file_content(csp_file).match?(/policy.connect_src/)
|
22
|
+
gsub_file csp_file, /(policy.connect_src .*)$/, '\1, "https://dap.digitalgov.gov", "https://www.google-analytics.com"'
|
23
|
+
else
|
24
|
+
gsub_file csp_file, /((#?)(\s+)policy.script_src .*)$/, "\\1\n\\2\\3policy.connect_src :self, \"https://dap.digitalgov.gov\", \"https://www.google-analytics.com\""
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def install_js_snippet
|
29
|
+
insert_into_file "app/views/layouts/application.html.erb", <<EODAP, before: /^\s+<\/head>/
|
30
|
+
|
31
|
+
<% if Rails.env.production? %>
|
32
|
+
<!-- We participate in the US government's analytics program. See the data at analytics.usa.gov. -->
|
33
|
+
<%= javascript_include_tag "https://dap.digitalgov.gov/Universal-Federated-Analytics-Min.js?agency=#{options[:agency_code]}", async: true, id:"_fed_an_ua_tag" %>
|
34
|
+
<% end %>
|
35
|
+
EODAP
|
36
|
+
end
|
37
|
+
|
38
|
+
def update_readme
|
39
|
+
insertion_regex = /^## Documentation$/
|
40
|
+
if file_content("README.md").match?(insertion_regex)
|
41
|
+
insert_into_file "README.md", readme, before: insertion_regex
|
42
|
+
else
|
43
|
+
append_to_file "README.md", readme
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def update_boundary_diagram
|
48
|
+
boundary_filename = "doc/compliance/apps/application.boundary.md"
|
49
|
+
insert_into_file boundary_filename, <<EOB, after: "Boundary(gsa_saas, \"GSA-authorized SaaS\") {\n"
|
50
|
+
System_Ext(dap, "DAP", "Analytics collection")
|
51
|
+
EOB
|
52
|
+
insert_into_file boundary_filename, <<~EOB, before: "@enduml"
|
53
|
+
Rel(browser, dap, "reports usage", "https (443)")
|
54
|
+
Rel(developer, dap, "View traffic statistics", "https GET (443)")
|
55
|
+
EOB
|
56
|
+
end
|
57
|
+
|
58
|
+
no_tasks do
|
59
|
+
def readme
|
60
|
+
<<~EOM
|
61
|
+
## Analytics
|
62
|
+
|
63
|
+
Digital Analytics Program (DAP) code has been included for the Production environment, associated with #{options[:agency_code]}.
|
64
|
+
|
65
|
+
If #{app_name.titleize} is for another agency, update the agency line in `app/views/layouts/application.html.erb`
|
66
|
+
|
67
|
+
EOM
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -1,10 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "rails/generators"
|
4
|
+
|
3
5
|
module RailsTemplate18f
|
4
6
|
module Generators
|
5
7
|
class GithubActionsGenerator < ::Rails::Generators::Base
|
6
|
-
include
|
7
|
-
include
|
8
|
+
include Base
|
9
|
+
include PipelineOptions
|
8
10
|
|
9
11
|
class_option :node_version, desc: "Node version to test against in actions"
|
10
12
|
|
@@ -13,10 +15,6 @@ module RailsTemplate18f
|
|
13
15
|
Install Github Actions workflow files
|
14
16
|
DESC
|
15
17
|
|
16
|
-
def self.source_root
|
17
|
-
@source_root ||= File.expand_path("templates", __dir__)
|
18
|
-
end
|
19
|
-
|
20
18
|
def install_actions
|
21
19
|
directory "github", ".github"
|
22
20
|
if !terraform?
|
@@ -26,10 +24,28 @@ module RailsTemplate18f
|
|
26
24
|
end
|
27
25
|
|
28
26
|
def update_readme
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
27
|
+
if file_content("README.md").match?(/^## CI\/CD$/)
|
28
|
+
insert_into_file "README.md", readme_cicd, after: "## CI/CD\n"
|
29
|
+
insert_into_file "README.md", readme_staging_deploy, after: "#### Staging\n"
|
30
|
+
insert_into_file "README.md", readme_prod_deploy, after: "#### Production\n"
|
31
|
+
insert_into_file "README.md", readme_credentials, after: "#### Credentials and other Secrets\n"
|
32
|
+
else
|
33
|
+
append_to_file "README.md", <<~EOM
|
34
|
+
## CI/CD
|
35
|
+
#{readme_cicd}
|
36
|
+
|
37
|
+
### Deployment
|
38
|
+
|
39
|
+
#### Staging
|
40
|
+
#{readme_staging_deploy}
|
41
|
+
|
42
|
+
#### Production
|
43
|
+
#{readme_prod_deploy}
|
44
|
+
|
45
|
+
#### Credentials and other Secrets
|
46
|
+
#{readme_credentials}
|
47
|
+
EOM
|
48
|
+
end
|
33
49
|
end
|
34
50
|
|
35
51
|
def update_boundary_diagram
|
@@ -48,7 +64,7 @@ EOB
|
|
48
64
|
readme_filename = "terraform/README.md"
|
49
65
|
insert_into_file readme_filename, " |- .force-action-apply\n", after: " |- secrets.auto.tfvars\n"
|
50
66
|
insert_into_file readme_filename, <<~EOM, after: /- `secrets.auto.tfvars`.*$/
|
51
|
-
- `.force-action-apply` is a file that can be updated to force GitHub Actions to run `terraform apply` during the deploy phase
|
67
|
+
\n- `.force-action-apply` is a file that can be updated to force GitHub Actions to run `terraform apply` during the deploy phase
|
52
68
|
EOM
|
53
69
|
end
|
54
70
|
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rails/generators"
|
4
|
+
|
5
|
+
module RailsTemplate18f
|
6
|
+
module Generators
|
7
|
+
class NewrelicGenerator < ::Rails::Generators::Base
|
8
|
+
include Base
|
9
|
+
|
10
|
+
desc <<~DESC
|
11
|
+
Description:
|
12
|
+
Install NewRelic config for FedRAMP collection
|
13
|
+
DESC
|
14
|
+
|
15
|
+
def update_content_security_policy
|
16
|
+
csp_file = "config/initializers/content_security_policy.rb"
|
17
|
+
gsub_file csp_file, /(policy.script_src .*)$/, '\1, "https://js-agent.newrelic.com", "https://*.nr-data.net"'
|
18
|
+
if file_content(csp_file).match?(/policy.connect_src/)
|
19
|
+
gsub_file csp_file, /(policy.connect_src .*)$/, '\1, "https://*.nr-data.net"'
|
20
|
+
else
|
21
|
+
gsub_file csp_file, /((#?)(\s+)policy.script_src .*)$/, "\\1\n\\2\\3policy.connect_src :self, \"https://*.nr-data.net\""
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def install_gem
|
26
|
+
gem "newrelic_rpm", "~> 8.4"
|
27
|
+
end
|
28
|
+
|
29
|
+
def install_config
|
30
|
+
template "config/newrelic.yml"
|
31
|
+
end
|
32
|
+
|
33
|
+
def update_cloud_gov_manifest
|
34
|
+
insert_into_file "manifest.yml", " NEW_RELIC_LOG: stdout\n", before: /^\s+processes:/
|
35
|
+
end
|
36
|
+
|
37
|
+
def update_readme
|
38
|
+
insertion_regex = /^## Documentation$/
|
39
|
+
if file_content("README.md").match?(insertion_regex)
|
40
|
+
insert_into_file "README.md", readme, before: insertion_regex
|
41
|
+
else
|
42
|
+
append_to_file "README.md", readme
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def update_boundary_diagram
|
47
|
+
boundary_filename = "doc/compliance/apps/application.boundary.md"
|
48
|
+
insert_into_file boundary_filename, <<EOB, after: "Boundary(gsa_saas, \"GSA-authorized SaaS\") {\n"
|
49
|
+
System_Ext(newrelic, "New Relic", "Monitoring SaaS")
|
50
|
+
EOB
|
51
|
+
insert_into_file boundary_filename, <<~EOB, before: "@enduml"
|
52
|
+
Rel(app, newrelic, "reports telemetry (ruby agent)", "tcp (443)")
|
53
|
+
Rel(browser, newrelic, "reports ux metrics (javascript agent)", "https (443)")
|
54
|
+
Rel(developer, newrelic, "Manage performance", "https (443)")
|
55
|
+
EOB
|
56
|
+
end
|
57
|
+
|
58
|
+
no_tasks do
|
59
|
+
def readme
|
60
|
+
<<~EOM
|
61
|
+
## Monitoring with New Relic
|
62
|
+
|
63
|
+
The [New Relic Ruby agent](https://docs.newrelic.com/docs/apm/agents/ruby-agent/getting-started/introduction-new-relic-ruby) has been installed for monitoring this application.
|
64
|
+
|
65
|
+
The config lives at `config/newrelic.yml`, and points to a [FEDRAMP version of the New Relic service as its host](https://docs.newrelic.com/docs/security/security-privacy/compliance/fedramp-compliant-endpoints/). To access the metrics dashboard, you will need to be connected to VPN.
|
66
|
+
|
67
|
+
### Getting started
|
68
|
+
|
69
|
+
To get started sending metrics via New Relic APM:
|
70
|
+
1. Add your New Relic license key to the Rails credentials with key `new_relic_key`.
|
71
|
+
1. Optionally, update `app_name` entries in `config/newrelic.yml` with what is registered for your application in New Relic
|
72
|
+
1. Comment out the `agent_enabled: false` line in `config/newrelic.yml`
|
73
|
+
1. Add the [Javascript snippet provided by New Relic](https://docs.newrelic.com/docs/browser/browser-monitoring/installation/install-browser-monitoring-agent) into `application.html.erb`. It is recommended to vary this based on environment (i.e. include one snippet for staging and another for production).
|
74
|
+
EOM
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -10,14 +10,14 @@
|
|
10
10
|
|
11
11
|
common: &default_settings
|
12
12
|
# Required license key associated with your New Relic account.
|
13
|
-
license_key:
|
13
|
+
license_key: <%%= Rails.application.credentials.new_relic_key %>
|
14
14
|
# FEDRAMP-specific New Relic host
|
15
15
|
# https://docs.newrelic.com/docs/security/security-privacy/compliance/fedramp-compliant-endpoints/
|
16
16
|
host: 'gov-collector.newrelic.com'
|
17
17
|
|
18
18
|
# Your application name. Renaming here affects where data displays in New
|
19
19
|
# Relic. For more details, see https://docs.newrelic.com/docs/apm/new-relic-apm/maintenance/renaming-applications
|
20
|
-
app_name:
|
20
|
+
app_name: <%= app_name.titleize %>
|
21
21
|
|
22
22
|
monitor_mode: true
|
23
23
|
|
@@ -30,8 +30,8 @@ common: &default_settings
|
|
30
30
|
|
31
31
|
# This line disables agent regardless of other settings.
|
32
32
|
# To enable the New Relic agent:
|
33
|
-
# 1)
|
34
|
-
# 2)
|
33
|
+
# 1) add the New Relic license keys to the appropriate encrypted credentials file(s)
|
34
|
+
# 2) Optionally, update app_name entries in this file with the application name you want to show in New Relic
|
35
35
|
# 3) Comment out the line below
|
36
36
|
agent_enabled: false
|
37
37
|
|
@@ -44,7 +44,7 @@ common: &default_settings
|
|
44
44
|
# If your application has other named environments, configure them here.
|
45
45
|
development:
|
46
46
|
<<: *default_settings
|
47
|
-
app_name:
|
47
|
+
app_name: <%= app_name.titleize %> (Development)
|
48
48
|
|
49
49
|
test:
|
50
50
|
<<: *default_settings
|
@@ -58,8 +58,8 @@ ci:
|
|
58
58
|
|
59
59
|
staging:
|
60
60
|
<<: *default_settings
|
61
|
-
app_name:
|
61
|
+
app_name: <%= app_name.titleize %> (Staging)
|
62
62
|
|
63
63
|
production:
|
64
64
|
<<: *default_settings
|
65
|
-
app_name:
|
65
|
+
app_name: <%= app_name.titleize %> (Production)
|
data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/README.md.tt
RENAMED
File without changes
|
File without changes
|
@@ -9,9 +9,9 @@ module "s3" {
|
|
9
9
|
cf_api_url = local.cf_api_url
|
10
10
|
cf_user = var.cf_user
|
11
11
|
cf_password = var.cf_password
|
12
|
-
cf_org_name = "<%=
|
13
|
-
cf_space_name = "<%=
|
14
|
-
s3_service_name = local.s3_service_name<% if
|
12
|
+
cf_org_name = "<%= cloud_gov_organization %>"
|
13
|
+
cf_space_name = "<%= cloud_gov_production_space %>"
|
14
|
+
s3_service_name = local.s3_service_name<% if cloud_gov_organization == "sandbox-gsa" %>
|
15
15
|
s3_plan_name = "basic-sandbox"<% end %>
|
16
16
|
}
|
17
17
|
|
File without changes
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env bash
|
2
2
|
|
3
3
|
if [[ ! -f "secrets.auto.tfvars" ]]; then
|
4
|
-
../create_space_deployer.sh <%=
|
4
|
+
../create_space_deployer.sh <%= cloud_gov_production_space %> config-bootstrap-deployer > secrets.auto.tfvars
|
5
5
|
fi
|
6
6
|
|
7
7
|
if [[ $# -gt 0 ]]; then
|
File without changes
|
File without changes
|
File without changes
|
@@ -1,6 +1,6 @@
|
|
1
1
|
locals {
|
2
|
-
cf_org_name = "<%=
|
3
|
-
cf_space_name = "<%=
|
2
|
+
cf_org_name = "<%= cloud_gov_organization %>"
|
3
|
+
cf_space_name = "<%= cloud_gov_production_space %>"
|
4
4
|
env = "production"
|
5
5
|
recursive_delete = false
|
6
6
|
}
|
@@ -17,7 +17,7 @@ module "database" {
|
|
17
17
|
rds_plan_name = "TKTK-production-rds-plan"
|
18
18
|
}
|
19
19
|
|
20
|
-
<% if
|
20
|
+
<% if has_active_storage? %>
|
21
21
|
module "s3" {
|
22
22
|
source = "../shared/s3"
|
23
23
|
|
@@ -34,7 +34,7 @@ module "s3" {
|
|
34
34
|
# It can be re-enabled after:
|
35
35
|
# 1) the app has first been deployed
|
36
36
|
# 2) the route has been manually created by an OrgManager:
|
37
|
-
# `cf create-domain <%=
|
37
|
+
# `cf create-domain <%= cloud_gov_organization %> TKTK-production-domain-name`
|
38
38
|
###########################################################################
|
39
39
|
# module "domain" {
|
40
40
|
# source = "../shared/domain"
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -19,7 +19,7 @@ data "cloudfoundry_app" "app" {
|
|
19
19
|
###########################################################################
|
20
20
|
# Route must be manually created by an OrgManager before terraform is run:
|
21
21
|
#
|
22
|
-
# cf create-domain <%=
|
22
|
+
# cf create-domain <%= cloud_gov_organization %> TKTK-production-domain-name
|
23
23
|
###########################################################################
|
24
24
|
data "cloudfoundry_domain" "origin_url" {
|
25
25
|
name = var.domain_name
|
File without changes
|
File without changes
|
data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/shared/s3/main.tf
RENAMED
File without changes
|
File without changes
|
File without changes
|
data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/staging/main.tf.tt
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
locals {
|
2
|
-
cf_org_name = "<%=
|
3
|
-
cf_space_name = "<%=
|
2
|
+
cf_org_name = "<%= cloud_gov_organization %>"
|
3
|
+
cf_space_name = "<%= cloud_gov_staging_space %>"
|
4
4
|
env = "staging"
|
5
5
|
recursive_delete = true
|
6
6
|
}
|
@@ -17,7 +17,7 @@ module "database" {
|
|
17
17
|
rds_plan_name = "micro-psql"
|
18
18
|
}
|
19
19
|
|
20
|
-
<% if
|
20
|
+
<% if has_active_storage? %>
|
21
21
|
module "s3" {
|
22
22
|
source = "../shared/s3"
|
23
23
|
|
@@ -27,4 +27,4 @@ module "s3" {
|
|
27
27
|
cf_space_name = local.cf_space_name
|
28
28
|
s3_service_name = "<%= app_name %>-s3-${local.env}"
|
29
29
|
}
|
30
|
-
<% end %>
|
30
|
+
<% end %>
|
File without changes
|
File without changes
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rails/generators"
|
4
|
+
|
5
|
+
module RailsTemplate18f
|
6
|
+
module Generators
|
7
|
+
class TerraformGenerator < ::Rails::Generators::Base
|
8
|
+
include Base
|
9
|
+
include CloudGovOptions
|
10
|
+
|
11
|
+
desc <<~DESC
|
12
|
+
Description:
|
13
|
+
Install terraform files for cloud.gov database and s3 services
|
14
|
+
DESC
|
15
|
+
|
16
|
+
def install
|
17
|
+
directory "terraform", mode: :preserve
|
18
|
+
chmod "terraform/bootstrap/run.sh", 0o755
|
19
|
+
chmod "terraform/bootstrap/teardown_creds.sh", 0o755
|
20
|
+
end
|
21
|
+
|
22
|
+
def ignore_files
|
23
|
+
unless skip_git?
|
24
|
+
append_to_file ".gitignore", <<~EOM
|
25
|
+
|
26
|
+
# Terraform
|
27
|
+
.terraform.lock.hcl
|
28
|
+
**/.terraform/*
|
29
|
+
secrets.auto.tfvars
|
30
|
+
terraform.tfstate
|
31
|
+
terraform.tfstate.backup
|
32
|
+
EOM
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def update_readme
|
37
|
+
gsub_file "README.md", /^(### Automatic linting)/, '\1 and terraform formatting'
|
38
|
+
gsub_file "README.md", /(ruby linting) (on every)/, '\1 and terraform formatting \2'
|
39
|
+
gsub_file "README.md", /^Before the first deploy only.*$/, "Follow the instructions in `terraform/README.md` to create the supporting services."
|
40
|
+
end
|
41
|
+
|
42
|
+
def install_githook
|
43
|
+
githook_file = ".githooks/pre-commit"
|
44
|
+
if File.exist?(File.expand_path(githook_file, destination_root))
|
45
|
+
append_to_file githook_file, "\n#{githook_content}"
|
46
|
+
else
|
47
|
+
create_file githook_file, <<~EOM
|
48
|
+
#! /usr/bin/env bash
|
49
|
+
#
|
50
|
+
# This hook runs on `git commit` and will prevent you from committing without
|
51
|
+
# approval from the linter and tests.
|
52
|
+
#
|
53
|
+
# To run, this file must be symlinked to:
|
54
|
+
# .git/hooks/pre-commit
|
55
|
+
#
|
56
|
+
# To bypass this hook, run:
|
57
|
+
# $ git commit --no-verify
|
58
|
+
# $ git commit -n
|
59
|
+
|
60
|
+
#{githook_content}
|
61
|
+
EOM
|
62
|
+
chmod githook_file, 0o755
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
no_tasks do
|
67
|
+
def githook_content
|
68
|
+
<<~EOM
|
69
|
+
echo "Running Terraform formatter"
|
70
|
+
files=$(git diff --cached --name-only terraform)
|
71
|
+
for f in $files
|
72
|
+
do
|
73
|
+
# Format any *.tf files that were cached/staged
|
74
|
+
if [ -e "$f" ] && [[ $f == *.tf ]]; then
|
75
|
+
terraform fmt "$f"
|
76
|
+
git add "$f"
|
77
|
+
fi
|
78
|
+
done
|
79
|
+
EOM
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
def terraform_dir_exists?
|
86
|
+
# prevents cloud_gov_* helpers from trying to read non-existant .tf files
|
87
|
+
false
|
88
|
+
end
|
89
|
+
|
90
|
+
def has_active_storage?
|
91
|
+
defined?(::ActiveStorage)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|