rails_template_18f 0.1.0 → 0.4.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.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +19 -0
  3. data/Gemfile +2 -0
  4. data/Gemfile.lock +4 -1
  5. data/README.md +16 -19
  6. data/exe/rails_template_18f +60 -0
  7. data/lib/generators/rails_template18f/active_storage/active_storage_generator.rb +135 -0
  8. data/lib/generators/rails_template18f/active_storage/templates/app/jobs/file_scan_job.rb +33 -0
  9. data/lib/generators/rails_template18f/active_storage/templates/app/models/file_upload.rb +25 -0
  10. data/lib/generators/rails_template18f/active_storage/templates/doc/adr/clamav.md.tt +30 -0
  11. data/lib/generators/rails_template18f/active_storage/templates/spec/jobs/file_scan_job_spec.rb +35 -0
  12. data/lib/generators/rails_template18f/active_storage/templates/spec/models/file_upload_spec.rb +38 -0
  13. data/lib/generators/rails_template18f/circleci/circleci_generator.rb +26 -10
  14. data/lib/generators/rails_template18f/cloud_gov_config/cloud_gov_config_generator.rb +28 -0
  15. data/lib/generators/rails_template18f/cloud_gov_config/templates/app/models/cloud_gov_config.rb +15 -0
  16. data/lib/generators/rails_template18f/cloud_gov_config/templates/spec/models/cloud_gov_config_spec.rb +44 -0
  17. data/lib/generators/rails_template18f/dap/dap_generator.rb +72 -0
  18. data/lib/generators/rails_template18f/github_actions/github_actions_generator.rb +27 -11
  19. data/lib/generators/rails_template18f/i18n/i18n_generator.rb +107 -0
  20. data/{templates → lib/generators/rails_template18f/i18n/templates}/config/locales/en.yml.tt +3 -3
  21. data/{templates → lib/generators/rails_template18f/i18n/templates}/config/locales/es.yml +3 -3
  22. data/{templates → lib/generators/rails_template18f/i18n/templates}/config/locales/fr.yml +3 -6
  23. data/{templates → lib/generators/rails_template18f/i18n/templates}/config/locales/zh.yml +0 -0
  24. data/lib/generators/rails_template18f/i18n_js/i18n_js_generator.rb +60 -0
  25. data/lib/generators/rails_template18f/i18n_js/templates/lib/tasks/i18n.rake +9 -0
  26. data/lib/generators/rails_template18f/newrelic/newrelic_generator.rb +79 -0
  27. data/{templates/config/newrelic.yml → lib/generators/rails_template18f/newrelic/templates/config/newrelic.yml.tt} +7 -7
  28. data/lib/generators/rails_template18f/sidekiq/sidekiq_generator.rb +70 -0
  29. data/lib/generators/rails_template18f/sidekiq/templates/config/initializers/redis.rb +14 -0
  30. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/README.md.tt +0 -0
  31. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/bootstrap/import.sh +0 -0
  32. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/bootstrap/main.tf.tt +3 -3
  33. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/bootstrap/providers.tf +0 -0
  34. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/bootstrap/run.sh.tt +1 -1
  35. data/lib/generators/rails_template18f/terraform/templates/terraform/bootstrap/teardown_creds.sh.tt +5 -0
  36. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/bootstrap/variables.tf +0 -0
  37. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/create_space_deployer.sh +0 -0
  38. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/destroy_space_deployer.sh +0 -0
  39. data/lib/generators/rails_template18f/terraform/templates/terraform/production/main.tf.tt +82 -0
  40. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/production/providers.tf.tt +0 -0
  41. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/production/variables.tf +0 -0
  42. data/lib/generators/rails_template18f/terraform/templates/terraform/shared/clamav/main.tf.tt +50 -0
  43. data/{templates/terraform/shared/database → lib/generators/rails_template18f/terraform/templates/terraform/shared/clamav}/providers.tf +0 -0
  44. data/lib/generators/rails_template18f/terraform/templates/terraform/shared/clamav/variables.tf +47 -0
  45. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/shared/database/main.tf.tt +0 -0
  46. data/{templates/terraform/shared/domain → lib/generators/rails_template18f/terraform/templates/terraform/shared/database}/providers.tf +0 -0
  47. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/shared/database/variables.tf +0 -0
  48. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/shared/domain/main.tf.tt +1 -1
  49. data/{templates/terraform/shared/s3 → lib/generators/rails_template18f/terraform/templates/terraform/shared/domain}/providers.tf +0 -0
  50. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/shared/domain/variables.tf +0 -0
  51. data/lib/generators/rails_template18f/terraform/templates/terraform/shared/redis/main.tf.tt +23 -0
  52. data/lib/generators/rails_template18f/terraform/templates/terraform/shared/redis/providers.tf +16 -0
  53. data/lib/generators/rails_template18f/terraform/templates/terraform/shared/redis/variables.tf +42 -0
  54. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/shared/s3/main.tf +0 -0
  55. data/lib/generators/rails_template18f/terraform/templates/terraform/shared/s3/providers.tf +16 -0
  56. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/shared/s3/variables.tf +0 -0
  57. data/lib/generators/rails_template18f/terraform/templates/terraform/staging/main.tf.tt +62 -0
  58. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/staging/providers.tf.tt +0 -0
  59. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/staging/variables.tf +0 -0
  60. data/lib/generators/rails_template18f/terraform/terraform_generator.rb +84 -0
  61. data/lib/rails_template18f/app_updater.rb +19 -0
  62. data/lib/rails_template18f/generators/base.rb +53 -0
  63. data/lib/rails_template18f/generators/cloud_gov_options.rb +53 -0
  64. data/lib/rails_template18f/generators/pipeline_options.rb +18 -0
  65. data/lib/rails_template18f/generators.rb +11 -0
  66. data/lib/rails_template18f/version.rb +1 -1
  67. data/lib/rails_template_18f.rb +1 -4
  68. data/rails-template-18f.gemspec +1 -0
  69. data/template.rb +84 -148
  70. data/templates/README.md.tt +7 -44
  71. data/templates/config/deployment/staging.yml +1 -1
  72. data/templates/config/environments/ci.rb +0 -1
  73. data/templates/doc/compliance/apps/application.boundary.md.tt +4 -31
  74. data/templates/githooks/{pre-commit.tt → pre-commit} +0 -15
  75. data/templates/manifest.yml.tt +1 -2
  76. metadata +77 -34
  77. data/lib/rails_template18f/terraform_options.rb +0 -68
  78. data/templates/terraform/bootstrap/teardown_creds.sh.tt +0 -5
  79. data/templates/terraform/production/main.tf.tt +0 -50
  80. data/templates/terraform/staging/main.tf.tt +0 -30
data/template.rb CHANGED
@@ -10,6 +10,10 @@ def skip_git?
10
10
  !!options[:skip_git]
11
11
  end
12
12
 
13
+ def skip_active_job?
14
+ !!options[:skip_active_job]
15
+ end
16
+
13
17
  def webpack?
14
18
  adjusted_javascript_option == "webpack"
15
19
  end
@@ -48,25 +52,24 @@ unless Gem::Dependency.new("rails", "~> 7.0.0").match?("rails", Rails.gem_versio
48
52
  end
49
53
 
50
54
  # ask setup questions
51
- @terraform = yes?("Create terraform files for cloud.gov services? (y/n)")
55
+ terraform = yes?("Create terraform files for cloud.gov services? (y/n)")
52
56
  @cloud_gov_organization = ask("What is your cloud.gov organization name? (Leave blank to fill in later)")
53
57
  default_staging_space = "staging"
54
- @cloud_gov_staging_space = ask("What is your cloud.gov staging space name? (Default: #{default_staging_space})")
58
+ cloud_gov_staging_space = ask("What is your cloud.gov staging space name? (Default: #{default_staging_space})")
55
59
  default_prod_space = "prod"
56
- @cloud_gov_production_space = ask("What is your cloud.gov production space name? (Default: #{default_prod_space})")
60
+ cloud_gov_production_space = ask("What is your cloud.gov production space name? (Default: #{default_prod_space})")
57
61
  @cloud_gov_organization = "TKTK-cloud.gov-org-name" if @cloud_gov_organization.blank?
58
- @cloud_gov_staging_space = default_staging_space if @cloud_gov_staging_space.blank?
59
- @cloud_gov_production_space = default_prod_space if @cloud_gov_production_space.blank?
62
+ cloud_gov_staging_space = default_staging_space if cloud_gov_staging_space.blank?
63
+ cloud_gov_production_space = default_prod_space if cloud_gov_production_space.blank?
60
64
 
61
65
  @github_actions = yes?("Create Github Actions? (y/n)")
62
66
  @circleci_pipeline = yes?("Create CircleCI config? (y/n)")
63
- @adrs = yes?("Create initial Architecture Decision Records? (y/n)")
64
- @newrelic = yes?("Create FEDRAMP New Relic config files? (y/n)")
65
- @dap = yes?("If this will be a public site, should we include Digital Analytics Program code? (y/n)")
66
- @supported_languages = [:en]
67
- @supported_languages.push(:es) if yes?("Add Spanish to supported locales, with starter es.yml? (y/n)")
68
- @supported_languages.push(:fr) if yes?("Add French to supported locales, with starter fr.yml? (y/n)")
69
- @supported_languages.push(:zh) if yes?("Add Simplified Chinese to supported locales, with starter zh.yml? (y/n)")
67
+ newrelic = yes?("Create FEDRAMP New Relic config files? (y/n)")
68
+ dap = yes?("If this will be a public site, should we include Digital Analytics Program code? (y/n)")
69
+ supported_languages = []
70
+ supported_languages.push(:es) if yes?("Add Spanish to supported locales, with starter es.yml? (y/n)")
71
+ supported_languages.push(:fr) if yes?("Add French to supported locales, with starter fr.yml? (y/n)")
72
+ supported_languages.push(:zh) if yes?("Add Simplified Chinese to supported locales, with starter zh.yml? (y/n)")
70
73
 
71
74
  running_node_version = `node --version`.gsub(/^v/, "").strip
72
75
  @node_version = ask("What version of NodeJS are you using? (Default: #{running_node_version})")
@@ -151,34 +154,16 @@ else
151
154
  "policy.style_src :self"
152
155
  end
153
156
 
154
- script_policy = [":self"]
155
- connect_policy = [":self"]
156
- image_policy = [":self", ":data"]
157
-
158
- if @newrelic
159
- script_policy << '"https://js-agent.newrelic.com"'
160
- script_policy << '"https://*.nr-data.net"'
161
- connect_policy << '"https://*.nr-data.net"'
162
- end
163
-
164
- if @dap
165
- image_policy << '"https://www.google-analytics.com"'
166
- script_policy << '"https://dap.digitalgov.gov"'
167
- script_policy << '"https://www.google-analytics.com"'
168
- connect_policy << '"https://dap.digitalgov.gov"'
169
- connect_policy << '"https://www.google-analytics.com"'
170
- end
171
-
172
157
  gsub_file csp_initializer, /^# config.*\|policy\|$.+^# end$/m, <<EOM
173
158
  config.content_security_policy do |policy|
174
159
  policy.default_src :self
175
160
  policy.font_src :self
176
161
  policy.form_action :self
177
162
  policy.frame_ancestors :none
178
- policy.img_src #{image_policy.join(", ")}
163
+ policy.img_src :self, :data
179
164
  policy.object_src :none
180
- policy.script_src #{script_policy.join(", ")}
181
- policy.connect_src #{connect_policy.join(", ")}
165
+ policy.script_src :self
166
+ policy.connect_src :self
182
167
  #{style_policy}
183
168
  end
184
169
  EOM
@@ -187,32 +172,13 @@ uncomment_lines csp_initializer, "Rails.application"
187
172
  uncomment_lines csp_initializer, /end$/
188
173
  uncomment_lines csp_initializer, "content_security_policy_nonce"
189
174
 
190
- if @newrelic
191
- gem "newrelic_rpm", "~> 8.4"
192
- copy_file "config/newrelic.yml"
193
-
194
- register_announcement("New Relic", <<~EOM)
195
- A New Relic config file has been written to `config/newrelic.yml`
196
-
197
- To get started sending metrics via New Relic APM:
198
- 1. Replace `<APPNAME>` with what is registered for your application in New Relic
199
- 2. Add your New Relic license key to the Rails credentials with key `new_relic_key`.
200
- 3. Comment out the `agent_enabled: false` line
201
-
202
- To enable browser monitoring:
203
- 4. Embed the Javascript snippet provided by New Relic into `application.html.erb`.
204
- It is recommended to vary this based on environment (i.e. include one snippet
205
- for staging and another for production).
206
- EOM
207
- end
208
-
175
+ # install development & testing gems
209
176
  gem_group :development, :test do
210
177
  gem "rspec-rails", "~> 5.1"
211
178
  gem "dotenv-rails", "~> 2.7"
212
179
  gem "brakeman", "~> 5.2"
213
180
  gem "bundler-audit", "~> 0.9"
214
181
  gem "standard", "~> 1.7"
215
- gem "i18n-tasks", "~> 0.9"
216
182
  end
217
183
  if ENV["RT_DEV"] == "true"
218
184
  gem "rails_template_18f", group: :development, path: ENV["PWD"]
@@ -222,11 +188,10 @@ end
222
188
 
223
189
  copy_file "lib/tasks/scanning.rake"
224
190
  copy_file "env", ".env"
191
+ copy_file "githooks/pre-commit", ".githooks/pre-commit", mode: :preserve
225
192
 
226
193
  unless skip_git?
227
194
  rails_command "credentials:diff --enroll"
228
- template "githooks/pre-commit", ".githooks/pre-commit"
229
- chmod ".githooks/pre-commit", 0o755
230
195
  append_to_file ".gitignore", <<~EOM
231
196
 
232
197
  # Ignore local dotenv overrides
@@ -241,27 +206,7 @@ unless skip_git?
241
206
  EOM
242
207
  end
243
208
 
244
- # Setup translations
245
- @supported_languages.each do |language|
246
- template "config/locales/#{language}.yml", force: true
247
- end
248
- application "config.i18n.available_locales = #{@supported_languages}"
249
- application "config.i18n.fallbacks = [:en]"
250
- after_bundle do
251
- # Recommended by i18n-tasks
252
- run "cp $(i18n-tasks gem-path)/templates/config/i18n-tasks.yml config/"
253
- end
254
- insert_into_file "app/helpers/application_helper.rb", <<'EOH', before: /^end$/
255
- def format_active_locale(locale_string)
256
- link_classes = "usa-nav__link"
257
- if locale_string.to_sym == I18n.locale
258
- link_classes = "#{link_classes} usa-current"
259
- end
260
- link_to t("shared.languages.#{locale_string}"), root_path(locale: locale_string), class: link_classes
261
- end
262
- EOH
263
-
264
- # setup USWDS
209
+ # setup USWDS and asset pipeline
265
210
  copy_file "browserslistrc", ".browserslistrc" if webpack?
266
211
  uncomment_lines "Gemfile", "sassc-rails" # use sassc-rails for asset minification in prod
267
212
  after_bundle do
@@ -313,7 +258,7 @@ after_bundle do
313
258
  @import "uswds-settings.scss";
314
259
  @import "../../../node_modules/uswds/dist/scss/uswds.scss";
315
260
  EOCSS
316
- gsub_file "app/views/layouts/application.html.erb", "<html>", "<html lang=\"en\">"
261
+ gsub_file "app/views/layouts/application.html.erb", "<html>", '<html lang="<%= I18n.locale %>">'
317
262
  gsub_file "app/views/layouts/application.html.erb", /^\s+<%= yield %>/, <<-EOHTML
318
263
  <%= render "application/usa_banner" %>
319
264
  <%= render "application/header" %>
@@ -328,32 +273,14 @@ end
328
273
  directory "app/views/application"
329
274
 
330
275
  after_bundle do
276
+ # install and configure RSpec
331
277
  generate "rspec:install"
332
278
  gsub_file "spec/spec_helper.rb", /^=(begin|end)$/, ""
333
279
 
334
- # Setup the PagesController, locale routes, and home (root) route
280
+ # Setup the PagesController and home (root) route
335
281
  generate :controller, "pages", "home", "--skip-routes", "--no-helper", "--no-assets"
282
+ route "root 'pages#home'"
336
283
 
337
- if @supported_languages.count > 1
338
- locale_switching = <<~EOM
339
- around_action :switch_locale
340
-
341
- def switch_locale(&action)
342
- locale = params[:locale] || I18n.default_locale
343
- I18n.with_locale(locale, &action)
344
- end
345
- EOM
346
- insert_into_file "app/controllers/application_controller.rb", locale_switching, before: /^end/
347
-
348
- route <<-'EOM'
349
- scope "(:locale)", locale: /#{I18n.available_locales.join('|')}/ do
350
- # Your application routes here
351
- root 'pages#home'
352
- end
353
- EOM
354
- else
355
- route "root 'pages#home'"
356
- end
357
284
  gsub_file "spec/requests/pages_spec.rb", "/pages/home", "/"
358
285
  gsub_file "spec/views/pages/home.html.erb_spec.rb", " pending \"add some examples to (or delete) \#{__FILE__}\"", <<-EOM
359
286
  it "displays the gov banner" do
@@ -362,34 +289,48 @@ after_bundle do
362
289
  end
363
290
  EOM
364
291
 
365
- if run_db_setup
366
- rails_command "db:create"
367
- rails_command "db:migrate"
292
+ # Setup translations
293
+ generate "rails_template18f:i18n", "--languages=#{supported_languages.join(",")}", "--force"
294
+ end
295
+
296
+ # install ADRs and compliance documentation
297
+ directory "doc"
298
+ register_announcement("Documentation", <<~EOM)
299
+ * Include a short description of your application in doc/compliance/apps/application.boundary.md
300
+ * Remember to keep your Logical Data Model up to date in doc/compliance/apps/data.logical.md
301
+ EOM
302
+
303
+ if newrelic
304
+ after_bundle do
305
+ generate "rails_template18f:newrelic"
306
+ end
307
+ register_announcement("New Relic", <<~EOM)
308
+ A New Relic config file has been written to `config/newrelic.yml`
309
+
310
+ See instructions in README to get started sending data to New Relic
311
+ EOM
312
+ end
313
+
314
+ if dap
315
+ after_bundle do
316
+ generate "rails_template18f:dap"
368
317
  end
318
+ register_announcement("Digital Analytics Program", "Update the DAP agency code in app/views/layouts/application.html.erb")
369
319
  end
370
320
 
371
321
  # infrastructure & deploy
372
322
  template "manifest.yml"
373
323
  copy_file "lib/tasks/cf.rake"
374
324
  directory "config/deployment"
375
- after_bundle do
376
- run "cp .gitignore .cfignore" unless skip_git?
377
- end
378
325
 
379
- if @terraform
380
- directory "terraform", mode: :preserve
381
- chmod "terraform/bootstrap/run.sh", 0o755
382
- chmod "terraform/bootstrap/teardown_creds.sh", 0o755
383
- unless skip_git?
384
- append_to_file ".gitignore", <<~EOM
385
-
386
- # Terraform
387
- .terraform.lock.hcl
388
- **/.terraform/*
389
- secrets.auto.tfvars
390
- terraform.tfstate
391
- terraform.tfstate.backup
392
- EOM
326
+ if terraform
327
+ after_bundle do
328
+ generator_arguments = [
329
+ "--cg-org=#{@cloud_gov_organization}",
330
+ "--cg-staging=#{cloud_gov_staging_space}",
331
+ "--cg-prod=#{cloud_gov_production_space}"
332
+ ]
333
+ generate "rails_template18f:terraform", *generator_arguments
393
334
  end
394
335
  if cloud_gov_org_tktk?
395
336
  register_announcement("Terraform", <<~EOM)
@@ -402,13 +343,25 @@ if @terraform
402
343
  register_announcement("Terraform", "Run the bootstrap script and update the appropriate CI/CD environment variables defined in the Deployment section of the README")
403
344
  end
404
345
 
346
+ if !skip_active_job?
347
+ after_bundle do
348
+ generate "rails_template18f:sidekiq"
349
+ end
350
+ end
351
+
352
+ if !skip_active_storage?
353
+ after_bundle do
354
+ generate "rails_template18f:active_storage"
355
+ end
356
+ end
357
+
405
358
  if @github_actions
406
359
  after_bundle do
407
360
  generator_arguments = [
408
- (@terraform ? "--terraform" : "--no-terraform"),
361
+ (terraform ? "--terraform" : "--no-terraform"),
409
362
  "--cg-org=#{@cloud_gov_organization}",
410
- "--cg-staging=#{@cloud_gov_staging_space}",
411
- "--cg-prod=#{@cloud_gov_production_space}"
363
+ "--cg-staging=#{cloud_gov_staging_space}",
364
+ "--cg-prod=#{cloud_gov_production_space}"
412
365
  ]
413
366
  generate "rails_template18f:github_actions", *generator_arguments
414
367
  end
@@ -425,10 +378,10 @@ end
425
378
  if @circleci_pipeline
426
379
  after_bundle do
427
380
  generator_arguments = [
428
- (@terraform ? "--terraform" : "--no-terraform"),
381
+ (terraform ? "--terraform" : "--no-terraform"),
429
382
  "--cg-org=#{@cloud_gov_organization}",
430
- "--cg-staging=#{@cloud_gov_staging_space}",
431
- "--cg-prod=#{@cloud_gov_production_space}"
383
+ "--cg-staging=#{cloud_gov_staging_space}",
384
+ "--cg-prod=#{cloud_gov_production_space}"
432
385
  ]
433
386
  generate "rails_template18f:circleci", *generator_arguments
434
387
  end
@@ -437,29 +390,6 @@ if @circleci_pipeline
437
390
  EOM
438
391
  end
439
392
 
440
- if @adrs
441
- directory "doc"
442
- else
443
- directory "doc/compliance"
444
- end
445
- register_announcement("Documentation", <<~EOM)
446
- * Include a short description of your application in doc/compliance/apps/application.boundary.md
447
- * Remember to keep your Logical Data Model up to date in doc/compliance/apps/data.logical.md
448
- EOM
449
-
450
- if @dap
451
- after_bundle do
452
- insert_into_file "app/views/layouts/application.html.erb", <<-EODAP, before: /^\s+<\/head>/
453
-
454
- <% if Rails.env.production? %>
455
- <!-- We participate in the US government's analytics program. See the data at analytics.usa.gov. -->
456
- <%= javascript_include_tag "https://dap.digitalgov.gov/Universal-Federated-Analytics-Min.js?agency=GSA", async: true, id:"_fed_an_ua_tag" %>
457
- <% end %>
458
- EODAP
459
- end
460
- register_announcement("Digital Analytics Program", "Update the DAP agency code in app/views/layouts/application.html.erb")
461
- end
462
-
463
393
  # setup production credentials file
464
394
  require "rails/generators"
465
395
  require "rails/generators/rails/encryption_key_file/encryption_key_file_generator"
@@ -488,6 +418,11 @@ EOM
488
418
 
489
419
  # ensure this is the very last step
490
420
  after_bundle do
421
+ if run_db_setup
422
+ rails_command "db:create"
423
+ rails_command "db:migrate"
424
+ end
425
+
491
426
  # x86_64-linux is required to install gems on any linux system such as cloud.gov or CI pipelines
492
427
  run "bundle lock --add-platform x86_64-linux"
493
428
 
@@ -497,10 +432,11 @@ after_bundle do
497
432
  run "bundle exec standardrb --fix"
498
433
 
499
434
  unless skip_git?
435
+ run "cp .gitignore .cfignore"
500
436
  git add: "."
501
437
  git commit: "-a -m 'Initial commit'"
502
438
  end
503
439
 
504
- # Post-install announcement
440
+ # Post-install announcements
505
441
  print_announcements
506
442
  end
@@ -53,10 +53,9 @@ TBD
53
53
 
54
54
  The system's Content-Security-Policy header prevents `<script>` and `<style>` tags from working without further
55
55
  configuration. Use `<%%= javascript_tag nonce: true %>` for inline javascript.
56
- <% if @adrs %>
56
+
57
57
  See the [CSP compliant script tag helpers](./doc/adr/0004-rails-csp-compliant-script-tag-helpers.md) ADR for
58
58
  more information on setting these up successfully.
59
- <% end %>
60
59
 
61
60
  ## Internationalization
62
61
 
@@ -101,10 +100,9 @@ Run everything: `bundle exec rake`
101
100
 
102
101
  When new pages are added to the application, ensure they are added to `./.pa11yci` so that they can be scanned.
103
102
 
104
- ### Automatic linting <% if @terraform %>and terraform formatting<% end %>
103
+ ### Automatic linting
105
104
 
106
- To enable automatic ruby linting<% if @terraform %> and terraform formatting<% end %> on every `git commit`
107
- follow the instructions at the top of `.githooks/pre-commit`
105
+ To enable automatic ruby linting on every `git commit` follow the instructions at the top of `.githooks/pre-commit`
108
106
 
109
107
  ## CI/CD
110
108
 
@@ -114,24 +112,16 @@ Each environment has dependencies on a PostgreSQL RDS instance managed by cloud.
114
112
  See [cloud.gov docs](https://cloud.gov/docs/services/relational-database/) for information on RDS.
115
113
 
116
114
  #### Staging
117
-
118
115
  <% if !@github_actions && !@circleci_pipeline %>
119
- <% if @terraform %>
120
- Follow the instructions in `terraform/README.md` to create the supporting services.
121
- <% else %>
122
116
  Before the first deploy only, create DB service with `cf create-service aws-rds micro-psql <%= app_name %>-rds-staging`
123
- <% end %>
117
+
124
118
  `cf push --strategy rolling --vars-file config/deployment/staging.yml --var rails_master_key=$(cat config/master.key)`
125
119
  <% end %>
126
120
 
127
121
  #### Production
128
-
129
122
  <% if !@github_actions && !@circleci_pipeline %>
130
- <% if @terraform %>
131
- Follow the instructions in `terraform/README.md` to create the supporting services.
132
- <% else %>
133
123
  Before the first deploy only, create DB service with `cf create-service aws-rds <<SERVICE_PLAN_NAME>> <%= app_name %>-rds-production`
134
- <% end %>
124
+
135
125
  `cf push --strategy rolling --vars-file config/deployment/production.yml --var rails_master_key=$(cat config/credentials/production.key)`
136
126
  <% end %>
137
127
 
@@ -150,34 +140,8 @@ Otherwise, they are set as a `((variable))` within `manifest.yml` and the variab
150
140
 
151
141
  Configuration that changes from staging to production, but is public, should be added to `config/deployment/staging.yml` and `config/deployment/production.yml`
152
142
 
153
- <% if @newrelic %>
154
- ## Monitoring with New Relic
155
-
156
- 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.
157
-
158
- 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.
159
-
160
- ### Getting started
161
-
162
- To get started sending metrics via New Relic APM:
163
- 1. Replace `<APPNAME>` in `config/newrelic.yml` with what is registered for your application in New Relic
164
- 1. Add your New Relic license key to the Rails credentials with key `new_relic_key`.
165
- 1. Comment out the `agent_enabled: false` line in `config/newrelic.yml`
166
- 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).
167
- <% end %>
168
-
169
- <% if @dap %>
170
- ## Analytics
171
-
172
- Digital Analytics Program (DAP) code has been included for the Production environment, associated with GSA.
173
-
174
- If <%= app_name.titleize %> is for another agency, update the agency line in `app/views/layouts/application.html.erb`
175
- <% end %>
176
-
177
143
  ## Documentation
178
144
 
179
- <% if @adrs %>
180
-
181
145
  Architectural Decision Records (ADR) are stored in `doc/adr`
182
146
  To create a new ADR, first install [ADR-tools](https://github.com/npryce/adr-tools) if you don't
183
147
  already have it installed.
@@ -187,7 +151,6 @@ Then create the ADR:
187
151
  * `adr new Title Of Architectural Decision`
188
152
 
189
153
  This will create a new, numbered ADR in the `doc/adr` directory.
190
- <% end %>
191
154
 
192
155
  Compliance diagrams are stored in `doc/compliance`. See the README there for more information on
193
156
  generating diagram updates.
@@ -197,8 +160,8 @@ generating diagram updates.
197
160
  *This will continue to evolve as the project moves forward.*
198
161
 
199
162
  * Pull down the most recent main before checking out a branch
200
- * Write your code<% if @adrs %>
201
- * If a big architectural decision was made, add an ADR<% end %>
163
+ * Write your code
164
+ * If a big architectural decision was made, add an ADR
202
165
  * Submit a PR
203
166
  * If you added functionality, please add tests.
204
167
  * All tests must pass!
@@ -1,3 +1,3 @@
1
1
  env: staging
2
2
  web_instances: 1
3
- web_memory: 512M
3
+ web_memory: 256M
@@ -1,7 +1,6 @@
1
1
  require_relative "./production"
2
2
 
3
3
  Rails.application.configure do
4
- config.assets.compile = true
5
4
  config.public_file_server.enabled = true
6
5
 
7
6
  logger = ActiveSupport::Logger.new($stdout)
@@ -11,6 +11,7 @@ LAYOUT_WITH_LEGEND()
11
11
  title application boundary view
12
12
 
13
13
  Person_Ext(public, "Public", "A member of the public")
14
+ Person(developer, "Developer", "Application developers")
14
15
 
15
16
  Boundary(device, "Computing Device", "Windows, OS X, Linux, iOS, Android"){
16
17
  System_Ext(browser, "Web Browser", "any modern version")
@@ -29,49 +30,21 @@ Boundary(aws, "AWS GovCloud") {
29
30
  System_Boundary(inventory, "Application") {
30
31
  Container(app, "<&layers> <%= app_name.titleize %>", "Ruby <%= @ruby_version %>, Rails <%= Rails.version %>", "TKTK Application Description")
31
32
  ContainerDb(app_db, "Application DB", "AWS RDS (PostgreSQL)", "Primary data storage")
32
- <% if !skip_active_storage? %>
33
- ContainerDb(app_s3, "File Storage", "AWS S3", "User-uploaded file storage")
34
- <% end %>
35
33
  }
36
34
  }
37
35
  }
38
36
  }
39
37
 
40
-
41
38
  Boundary(gsa_saas, "GSA-authorized SaaS") {
42
- <% if @dap %>
43
- System_Ext(dap, "DAP", "Analytics collection")
44
- <% end %>
45
- <% if @newrelic %>
46
- System_Ext(newrelic, "New Relic", "Monitoring SaaS")
47
- <% end %>
48
39
  }
49
- <% if @dap %>
50
- Rel(browser, dap, "reports usage", "https (443)")
51
- <% end %>
52
- <% if @newrelic %>
53
- Rel(app, newrelic, "reports telemetry (ruby agent)", "tcp (443)")
54
- Rel(browser, newrelic, "reports ux metrics (javascript agent)", "https (443)")
55
- <% end %>
40
+
41
+ Boundary(cicd, "CI/CD Pipeline") {
42
+ }
56
43
 
57
44
  Rel(browser, aws_alb, "request info, submit requests", "https GET/POST (443)")
58
45
  Rel(aws_alb, cloudgov_router, "proxies requests", "https GET/POST (443)")
59
46
  Rel(cloudgov_router, app, "proxies requests", "https GET/POST (443)")
60
47
  Rel(app, app_db, "reads/writes primary data", "psql (5432)")
61
- <% if !skip_active_storage? %>
62
- Rel(app, app_s3, "reads/writes file data", "https (443)")
63
- <% end %>
64
-
65
- Person(developer, "Developer", "Application developers")
66
- Boundary(cicd, "CI/CD Pipeline") {
67
- }
68
-
69
- <% if @dap %>
70
- Rel(developer, dap, "View traffic statistics", "https GET (443)")
71
- <% end %>
72
- <% if @newrelic %>
73
- Rel(developer, newrelic, "Manage performance", "https (443)")
74
- <% end %>
75
48
  @enduml
76
49
  ```
77
50
 
@@ -18,18 +18,3 @@ if [ $linter_status -ne 0 ]; then
18
18
  echo "Fix above before committing. Run 'git commit -n' to bypass linter."
19
19
  exit 1
20
20
  fi
21
-
22
- <% if @terraform %>
23
- echo "Running Terraform formatter"
24
- # imitates https://github.com/HHS/Head-Start-TTADP/blob/3b72ff05d94fab4cda877c63d8cd6970f0eeffc7/.githooks/pre-commit
25
-
26
- files=$(git diff --cached --name-only terraform)
27
- for f in $files
28
- do
29
- # Format any *.tf files that were cached/staged
30
- if [ -e "$f" ] && [[ $f == *.tf ]]; then
31
- terraform fmt "$f"
32
- git add "$f"
33
- fi
34
- done
35
- <% end %>
@@ -8,8 +8,7 @@ applications:
8
8
  RAILS_MASTER_KEY: ((rails_master_key))
9
9
  RAILS_ENV: ((env))
10
10
  RAILS_LOG_TO_STDOUT: true
11
- RAILS_SERVE_STATIC_FILES: true<% if @newrelic %>
12
- NEW_RELIC_LOG: stdout<% end %>
11
+ RAILS_SERVE_STATIC_FILES: true
13
12
  processes:
14
13
  - type: web
15
14
  instances: ((web_instances))