rails_template_18f 1.1.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +13 -0
  3. data/Gemfile.lock +57 -55
  4. data/README.md +102 -29
  5. data/exe/rails_template_18f +0 -21
  6. data/lib/generators/rails_template18f/active_storage/active_storage_generator.rb +2 -2
  7. data/lib/generators/rails_template18f/auditree/auditree_generator.rb +34 -3
  8. data/lib/generators/rails_template18f/auditree/templates/bin/auditree.tt +85 -11
  9. data/lib/generators/rails_template18f/auditree/templates/github/actions/auditree-cmd/action.yml.tt +17 -6
  10. data/lib/generators/rails_template18f/auditree/templates/github/workflows/auditree-validation.yml.tt +2 -6
  11. data/lib/generators/rails_template18f/circleci/templates/circleci/config.yml.tt +13 -7
  12. data/lib/generators/rails_template18f/cloud_gov_config/cloud_gov_config_generator.rb +1 -1
  13. data/lib/generators/rails_template18f/github_actions/github_actions_generator.rb +0 -1
  14. data/lib/generators/rails_template18f/github_actions/templates/github/dependabot.yml.tt +25 -0
  15. data/lib/generators/rails_template18f/github_actions/templates/github/workflows/assemble-ssp.yml.tt +12 -3
  16. data/lib/generators/rails_template18f/github_actions/templates/github/workflows/brakeman-analysis.yml +1 -1
  17. data/lib/generators/rails_template18f/github_actions/templates/github/workflows/deploy-production.yml.tt +8 -0
  18. data/lib/generators/rails_template18f/github_actions/templates/github/workflows/deploy-staging.yml.tt +8 -0
  19. data/lib/generators/rails_template18f/github_actions/templates/github/workflows/rspec.yml.tt +9 -1
  20. data/lib/generators/rails_template18f/github_actions/templates/github/workflows/{validate-ssp.yml.tt → validate-ssp.yml} +1 -1
  21. data/lib/generators/rails_template18f/i18n_js/i18n_js_generator.rb +12 -20
  22. data/lib/generators/rails_template18f/i18n_js/templates/app/javascript/i18n.js +11 -0
  23. data/lib/generators/rails_template18f/i18n_js/templates/config/i18n-js.yml +4 -0
  24. data/lib/generators/rails_template18f/i18n_js/templates/config/initializers/i18n_js.rb +5 -0
  25. data/lib/generators/rails_template18f/i18n_js/templates/lib/tasks/i18n.rake +8 -7
  26. data/lib/generators/rails_template18f/newrelic/newrelic_generator.rb +1 -1
  27. data/lib/generators/rails_template18f/oscal/oscal_generator.rb +14 -1
  28. data/lib/generators/rails_template18f/oscal/templates/bin/trestle.tt +4 -1
  29. data/lib/generators/rails_template18f/oscal/templates/github/actions/trestle-cmd/action.yml.tt +16 -0
  30. data/lib/generators/rails_template18f/public_egress/public_egress_generator.rb +136 -0
  31. data/lib/generators/rails_template18f/sidekiq/sidekiq_generator.rb +1 -1
  32. data/lib/generators/rails_template18f/terraform/templates/terraform/README.md.tt +2 -2
  33. data/lib/generators/rails_template18f/terraform/templates/terraform/bootstrap/main.tf.tt +1 -1
  34. data/lib/generators/rails_template18f/terraform/templates/terraform/bootstrap/run.sh.tt +2 -1
  35. data/lib/generators/rails_template18f/terraform/templates/terraform/bootstrap/teardown_creds.sh.tt +1 -1
  36. data/lib/generators/rails_template18f/terraform/templates/terraform/production/main.tf.tt +25 -5
  37. data/lib/generators/rails_template18f/terraform/templates/terraform/staging/main.tf.tt +22 -4
  38. data/lib/rails_template18f/generators/base.rb +7 -0
  39. data/lib/rails_template18f/generators/cloud_gov_options.rb +7 -27
  40. data/lib/rails_template18f/generators/cloud_gov_parsing.rb +41 -0
  41. data/lib/rails_template18f/generators.rb +1 -0
  42. data/lib/rails_template18f/version.rb +1 -1
  43. data/rails-template-18f.gemspec +3 -3
  44. data/railsrc +2 -0
  45. data/railsrc-hotwire +2 -0
  46. data/template.rb +19 -12
  47. data/templates/bin/ops/create_service_account.sh.tt +14 -2
  48. data/templates/bin/ops/destroy_service_account.sh.tt +0 -3
  49. data/templates/lib/tasks/scanning.rake +1 -1
  50. data/templates/manifest.yml.tt +1 -1
  51. metadata +19 -14
  52. data/lib/generators/rails_template18f/github_actions/templates/github/actions/trestle-cmd/action.yml +0 -20
  53. data/lib/rails_template18f/app_updater.rb +0 -19
  54. /data/lib/generators/rails_template18f/terraform/templates/terraform/production/{providers.tf.tt → providers.tf} +0 -0
  55. /data/lib/generators/rails_template18f/terraform/templates/terraform/staging/{providers.tf.tt → providers.tf} +0 -0
@@ -1,13 +1,30 @@
1
1
  #! /usr/bin/env bash
2
+
3
+ image="ghcr.io/gsa-tts/auditree"
4
+ tag="<%= docker_auditree_tag %>"
5
+ cwd=`pwd`
6
+ cdef="doc/compliance/oscal/component-definitions/devtools_cloud_gov/component-definition.json"
7
+ config="config/auditree.template.json"
8
+ email="<%= git_email %>"
9
+
2
10
  usage="
3
- $0: Run auditree docker image.
11
+ $0: Run auditree docker image: $image.
4
12
 
5
13
  Usage:
6
14
  $0 -h
7
- $0
8
- $0 init > path/to/auditree.template.json
9
- $0 fetch
10
- $0 check > path/to/assessment-results/auditree/assessment-results.json
15
+ $0 [-a AUDITREE_CONFIG_TEMPLATE] [-c CDEF] [-v EXTRA_VOLUME] [-e GIT_EMAIL] [-t TAG] CMD
16
+ $0 [-a AUDITREE_CONFIG_TEMPLATE] init
17
+ $0 [-o] check
18
+
19
+ Options:
20
+ -h: show help and exit
21
+ -a: Auditree config. Given relative to \"$cwd\" Defaults to \"$config\". Location to write for init CMD
22
+ -c: component definition. Given relative to \"$cwd\" Defaults to \"$cdef\"
23
+ -v: volume to mount. Given as a docker -v argument except that the first part is relative to \"$cwd\"
24
+ -e: Git email. Defaults to \"$email\"
25
+ -t: Auditree docker tag. Defaults to \"$tag\"
26
+ -o: Write assessment results to \"$cwd/tmp/auditree/auditree.json\". Only applicable for \"check\"
27
+ CMD: The command to run. Defaults to \"bash\"
11
28
 
12
29
  Notes:
13
30
  The following environment variables will be passed through to the docker image:
@@ -16,14 +33,71 @@ The following environment variables will be passed through to the docker image:
16
33
  * CF_PASSWORD - the cloud.gov password to fetch evidence from cloud.gov, only needed when running fetch script
17
34
  "
18
35
 
19
- if [ "$1" = "-h" ]; then
20
- echo "$usage"
21
- exit 0
22
- fi
36
+ ar_output=""
37
+ args_to_shift=0
38
+ declare -a volume_args
39
+
40
+ while getopts "ha:c:v:e:t:o" opt; do
41
+ case "$opt" in
42
+ a)
43
+ config=${OPTARG}
44
+ args_to_shift=$((args_to_shift + 2))
45
+ ;;
46
+ c)
47
+ cdef=${OPTARG}
48
+ args_to_shift=$((args_to_shift + 2))
49
+ ;;
50
+ v)
51
+ volume_args+=("-v" "$cwd/${OPTARG}")
52
+ args_to_shift=$((args_to_shift + 2))
53
+ ;;
54
+ e)
55
+ email=${OPTARG}
56
+ args_to_shift=$((args_to_shift + 2))
57
+ ;;
58
+ t)
59
+ tag=${OPTARG}
60
+ args_to_shift=$((args_to_shift + 2))
61
+ ;;
62
+ o)
63
+ ar_output="$cwd/tmp/auditree"
64
+ args_to_shift=$((args_to_shift + 1))
65
+ ;;
66
+ h)
67
+ echo "$usage"
68
+ exit 0
69
+ ;;
70
+ esac
71
+ done
72
+
73
+ shift $args_to_shift
23
74
 
24
75
  command="bash"
25
76
  if [ "$1" != "" ]; then
26
- command=$1
77
+ command="$1"
78
+ shift 1
27
79
  fi
28
80
 
29
- docker run -e GITHUB_TOKEN -e CF_USERNAME -e CF_PASSWORD -e GIT_EMAIL="<%= git_email %>" -it --rm ghcr.io/gsa-tts/auditree:<%= docker_auditree_tag %> $command
81
+ if [ "$command" = "init" ]; then
82
+ docker run --rm $image:$tag init > "$config"
83
+ exit 0
84
+ fi
85
+
86
+ volume_args+=("-v" "$cwd/$config":/app/auditree.template.json:ro)
87
+ volume_args+=("-v" "$cwd/$cdef":/app/cdef.json:ro)
88
+ if [ "$ar_output" != "" ]; then
89
+ mkdir -p "$ar_output"
90
+ chmod a+w "$ar_output"
91
+ volume_args+=("-v" "$ar_output":/tmp/auditree:rw)
92
+ if [ "$command" = "check" ]; then
93
+ command="check /tmp/auditree"
94
+ fi
95
+ fi
96
+
97
+ if [ "$command" = "bash" ]; then
98
+ docker run -e GITHUB_TOKEN -e CF_USERNAME -e CF_PASSWORD -e GIT_EMAIL="$email" \
99
+ "${volume_args[@]}" -it --rm $image:$tag $command "$@"
100
+ else
101
+ docker run -e GITHUB_TOKEN -e CF_USERNAME -e CF_PASSWORD -e GIT_EMAIL="$email" \
102
+ "${volume_args[@]}" --rm $image:$tag $command "$@"
103
+ fi
@@ -2,7 +2,7 @@ name: "Run an auditree-devtools command"
2
2
  description: "Sets up workspace for running a single command in auditree-devtools"
3
3
  inputs:
4
4
  tag:
5
- description: auditree-devtools tag to use. Defaults to <%= docker_auditree_tag %>
5
+ description: auditree-devtools tag to use.
6
6
  required: false
7
7
  default: <%= docker_auditree_tag %>
8
8
  cmd:
@@ -10,7 +10,8 @@ inputs:
10
10
  required: true
11
11
  email:
12
12
  description: Git user email to attribute to evidence updates
13
- required: true
13
+ required: false
14
+ default: "<%= git_email %>"
14
15
  config_template:
15
16
  description: Auditree config file template
16
17
  required: false
@@ -19,13 +20,23 @@ inputs:
19
20
  description: OSCAL Component Definition being used as baseline for assessment results
20
21
  required: false
21
22
  default: doc/compliance/oscal/component-definitions/devtools_cloud_gov/component-definition.json
23
+ volume:
24
+ description: Freeform volume string to mount another file in the auditree image
25
+ required: false
26
+ default: ""
22
27
  runs:
23
28
  using: "composite"
24
29
  steps:
25
30
  - name: Run cmd
26
31
  shell: bash
32
+ if: ${{ inputs.volume == '' }}
33
+ run:
34
+ bin/auditree -t ${{ inputs.tag }} -a ${{ inputs.config_template }} -c ${{ inputs.cdef }}
35
+ -e "${{ inputs.email }}" ${{ inputs.cmd }}
36
+
37
+ - name: Run cmd with volume
38
+ shell: bash
39
+ if: ${{ inputs.volume != '' }}
27
40
  run:
28
- docker run -v $GITHUB_WORKSPACE/${{inputs.config_template}}:/app/auditree.template.json:ro
29
- -v $GITHUB_WORKSPACE/${{inputs.cdef}}:/app/cdef.json:ro
30
- -e GITHUB_TOKEN -e CF_USERNAME -e CF_PASSWORD -e GIT_EMAIL="${{inputs.email}}"
31
- ghcr.io/gsa-tts/auditree:${{ inputs.tag }} ${{ inputs.cmd }}
41
+ bin/auditree -t ${{ inputs.tag }} -a ${{ inputs.config_template }} -c ${{ inputs.cdef }}
42
+ -e "${{ inputs.email }}" -v ${{ inputs.volume }} ${{ inputs.cmd }}
@@ -23,20 +23,16 @@ jobs:
23
23
  GITHUB_TOKEN: ${{ secrets.AUDITREE_GITHUB_TOKEN }}
24
24
  with:
25
25
  cmd: fetch
26
- email: "<%= git_email %>"
27
26
 
28
27
  - name: Check evidence
29
28
  uses: ./.github/actions/auditree-cmd
30
29
  env:
31
- CF_USERNAME: ${{ secrets.CF_USERNAME }}
32
- CF_PASSWORD: ${{ secrets.CF_PASSWORD }}
33
30
  GITHUB_TOKEN: ${{ secrets.AUDITREE_GITHUB_TOKEN }}
34
31
  with:
35
- cmd: check > doc/compliance/oscal/assessment-results/auditree/assessment-results.json
36
- email: "<%= git_email %>"
32
+ cmd: -o check
37
33
 
38
34
  - name: Save results
39
35
  uses: actions/upload-artifact@v4
40
36
  with:
41
37
  name: auditree_assessment_results
42
- path: doc/compliance/oscal/assessment-results/auditree
38
+ path: tmp/auditree/auditree.json
@@ -20,19 +20,16 @@ commands:
20
20
  description: Set up environment for running docker-trestle commands
21
21
  parameters:
22
22
  tag:
23
- description: docker-trestle tag to use. Defaults to latest
23
+ description: docker-trestle tag to use.
24
24
  type: string
25
25
  default: latest
26
26
  cmd:
27
27
  description: Command to run within docker-trestle
28
28
  type: string
29
29
  steps:
30
- - run:
31
- name: Fix directory permissions
32
- command: chmod -R a+w doc/compliance/oscal || true
33
30
  - run:
34
31
  name: Run trestle command
35
- command: docker run -v $(pwd)/doc/compliance/oscal:/app/docs:rw ghcr.io/gsa-tts/trestle:<< parameters.tag >> << parameters.cmd >><% end %>
32
+ command: docker run -u "$(id -u):$(id -g)" -v $(pwd)/doc/compliance/oscal:/app/docs:rw ghcr.io/gsa-tts/trestle:<< parameters.tag >> << parameters.cmd >><% end %>
36
33
  cg-deploy:
37
34
  description: "Login to cloud foundry space with service account credentials
38
35
  and push application using deployment configuration file."
@@ -74,6 +71,11 @@ commands:
74
71
  -p ${<< parameters.cloudgov_password >>} \
75
72
  -o << parameters.cloudgov_org >> \
76
73
  -s << parameters.cloudgov_space >>
74
+ - run:
75
+ name: Set restricted egress
76
+ command: |
77
+ cf bind-security-group trusted_local_networks_egress << parameters.cloudgov_org >> \
78
+ --space << parameters.cloudgov_space >>
77
79
  - run:
78
80
  name: Push application with deployment vars
79
81
  command: |
@@ -141,7 +143,7 @@ jobs:
141
143
  steps:
142
144
  - checkout
143
145
  - trestle-cmd:
144
- cmd: trestle validate -f system-security-plans/<%= app_name %>/system-security-plan.json
146
+ cmd: validate-ssp-json
145
147
  - trestle-cmd:
146
148
  cmd: assemble-ssp-json 2> /dev/null | grep "^No changes to assembled ssp"
147
149
  assemble_ssp:
@@ -151,8 +153,12 @@ jobs:
151
153
  - checkout
152
154
  - trestle-cmd:
153
155
  cmd: trestle assemble -n <%= app_name %> system-security-plan
156
+ - trestle-cmd:
157
+ cmd: render-ssp
154
158
  - store_artifacts:
155
159
  path: doc/compliance/oscal/dist/system-security-plans/<%= app_name %>.json
160
+ - store_artifacts:
161
+ path: doc/compliance/oscal/ssp-render/<%= app_name %>_ssp.md
156
162
  <% end %>
157
163
  static_security_scans:
158
164
  docker:
@@ -161,7 +167,7 @@ jobs:
161
167
  - setup-project
162
168
  - run:
163
169
  name: Run Brakeman scan
164
- command: bundle exec brakeman
170
+ command: bin/brakeman --no-pager --ensure-ignore-notes
165
171
  - run:
166
172
  name: Bundle audit
167
173
  command: bundle exec rake bundler:audit
@@ -15,7 +15,7 @@ module RailsTemplate18f
15
15
  def install_climate_control
16
16
  return if gem_installed?("climate_control")
17
17
  gem_group :test do
18
- gem "climate_control", "~> 1.0"
18
+ gem "climate_control", "~> 1.2"
19
19
  end
20
20
  bundle_install
21
21
  end
@@ -24,7 +24,6 @@ module RailsTemplate18f
24
24
  if !oscal_dir_exists?
25
25
  remove_file ".github/workflows/validate-ssp.yml"
26
26
  remove_file ".github/workflows/assemble-ssp.yml"
27
- remove_dir ".github/actions/trestle-cmd"
28
27
  end
29
28
  end
30
29
 
@@ -0,0 +1,25 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: bundler
4
+ directory: "/"
5
+ schedule:
6
+ interval: daily
7
+ open-pull-requests-limit: 10
8
+ - package-ecosystem: npm
9
+ directory: "/"
10
+ schedule:
11
+ interval: daily
12
+ open-pull-requests-limit: 10
13
+ - package-ecosystem: github-actions
14
+ directory: "/"
15
+ schedule:
16
+ interval: daily
17
+ open-pull-requests-limit: 10<% if terraform? %>
18
+ - package-ecosystem: terraform
19
+ directories:
20
+ - "/terraform/production"
21
+ - "/terraform/staging"
22
+ schedule:
23
+ interval: weekly
24
+ open-pull-requests-limit: 10
25
+ <% end %>
@@ -4,8 +4,6 @@ on:
4
4
  workflow_dispatch:
5
5
  push:
6
6
  branches: [ main ]
7
- paths:
8
- - "doc/compliance/oscal/**"
9
7
 
10
8
  jobs:
11
9
  assemble_ssp:
@@ -19,8 +17,19 @@ jobs:
19
17
  with:
20
18
  cmd: trestle assemble -n <%= app_name %> system-security-plan
21
19
 
20
+ - name: Render final SSPP
21
+ uses: ./.github/actions/trestle-cmd
22
+ with:
23
+ cmd: render-ssp
24
+
25
+ - name: Transform SSPP to PDF
26
+ run: docker run --rm -u "$(id -u):$(id -g)" -v "$GITHUB_WORKSPACE/doc/compliance/oscal/ssp-render:/data" pandoc/latex <%= app_name %>_ssp.md -o <%= app_name %>_ssp.pdf
27
+
22
28
  - name: Save artifact
23
29
  uses: actions/upload-artifact@v4
24
30
  with:
25
31
  name: <%= app_name %>_SSPP
26
- path: doc/compliance/oscal/dist/system-security-plans/<%= app_name %>.json
32
+ path: |
33
+ doc/compliance/oscal/dist/system-security-plans/<%= app_name %>.json
34
+ doc/compliance/oscal/ssp-render/<%= app_name %>_ssp.md
35
+ doc/compliance/oscal/ssp-render/<%= app_name %>_ssp.pdf
@@ -39,7 +39,7 @@ jobs:
39
39
  - name: Scan
40
40
  continue-on-error: true
41
41
  run: |
42
- bundle exec brakeman -f sarif -o output.sarif.json .
42
+ bin/brakeman --no-pager --ensure-ignore-notes -f sarif -o output.sarif.json
43
43
 
44
44
  # Upload the SARIF file generated in the previous step
45
45
  - name: Upload SARIF
@@ -32,6 +32,14 @@ jobs:
32
32
  access_key=${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
33
33
  secret_key=${{ secrets.TERRAFORM_STATE_SECRET_ACCESS_KEY }}
34
34
  <% end %>
35
+ - name: Set restricted egress
36
+ uses: cloud-gov/cg-cli-tools@main
37
+ with:
38
+ cf_username: ${{ secrets.CF_USERNAME }}
39
+ cf_password: ${{ secrets.CF_PASSWORD }}
40
+ cf_org: <%= cloud_gov_organization %>
41
+ cf_space: <%= cloud_gov_production_space %>
42
+ cf_command: bind-security-group trusted_local_networks_egress $INPUT_CF_ORG --space $INPUT_CF_SPACE
35
43
  - name: Deploy app
36
44
  uses: cloud-gov/cg-cli-tools@main
37
45
  with:
@@ -32,6 +32,14 @@ jobs:
32
32
  access_key=${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
33
33
  secret_key=${{ secrets.TERRAFORM_STATE_SECRET_ACCESS_KEY }}
34
34
  <% end %>
35
+ - name: Set restricted egress
36
+ uses: cloud-gov/cg-cli-tools@main
37
+ with:
38
+ cf_username: ${{ secrets.CF_USERNAME }}
39
+ cf_password: ${{ secrets.CF_PASSWORD }}
40
+ cf_org: <%= cloud_gov_organization %>
41
+ cf_space: <%= cloud_gov_staging_space %>
42
+ cf_command: bind-security-group trusted_local_networks_egress $INPUT_CF_ORG --space $INPUT_CF_SPACE
35
43
  - name: Deploy app
36
44
  uses: cloud-gov/cg-cli-tools@main
37
45
  with:
@@ -30,5 +30,13 @@ jobs:
30
30
 
31
31
  - name: Run rspec
32
32
  env:
33
- DATABASE_URL: ${{ steps.setup.outputs.database_url }}
33
+ DATABASE_URL: ${{ steps.setup.outputs.database_url }}<% if oscal_dir_exists? %>
34
+ rspec_oscal_output: tmp<% end %>
34
35
  run: bundle exec rspec
36
+ <% if oscal_dir_exists? %>
37
+ - name: Save assessment results
38
+ uses: actions/upload-artifact@v4
39
+ with:
40
+ name: <%= app_name %>_assessment
41
+ path: tmp/oscal
42
+ <% end %>
@@ -16,7 +16,7 @@ jobs:
16
16
  - name: Validate SSP
17
17
  uses: ./.github/actions/trestle-cmd
18
18
  with:
19
- cmd: trestle validate -f system-security-plans/<%= app_name %>/system-security-plan.json
19
+ cmd: validate-ssp-json
20
20
 
21
21
  check_ssp:
22
22
  name: Check assembly is current
@@ -12,37 +12,29 @@ module RailsTemplate18f
12
12
  Install and configure i18n-js gem to provide translations to JS code.
13
13
 
14
14
  By default, will only export translations with keys that match `*.js.*`
15
+
16
+ To use, add the following to your js code:
17
+
18
+ 1. `import { i18n } from './i18n';`
19
+ 2. `i18n.t('path.to.translation.key')`
15
20
  DESC
16
21
 
17
- def install_gem_and_tasks
18
- return if gem_installed?("i18n-js")
19
- gem "i18n-js", "~> 3.9"
22
+ def install_gems
23
+ gem "i18n-js", "~> 4.2" unless gem_installed?("i18n-js")
24
+ gem "listen", "~> 3.9", group: :development unless gem_installed?("listen")
20
25
  bundle_install do
21
26
  run "yarn add i18n-js"
22
- generate "i18n:js:config"
23
27
  end
24
28
  end
25
29
 
26
30
  def configure_translation_yaml
27
- append_to_file "config/i18n-js.yml", <<~EOYAML
28
- # remove `only` to include all translations
29
- translations:
30
- - file: "app/assets/builds/translations.js"
31
- only: "*.js.*"
32
- EOYAML
31
+ copy_file "config/i18n-js.yml"
33
32
  end
34
33
 
35
34
  def configure_asset_pipeline
36
35
  copy_file "lib/tasks/i18n.rake"
37
- environment "config.middleware.use I18n::JS::Middleware", env: :development
38
- insert_into_file "app/views/layouts/application.html.erb", indent(<<~EOHTML, 4), after: /<%= stylesheet_link_tag "application".*$\n/
39
- <%= javascript_include_tag "i18n", "data-turbo-track": "reload" %>
40
- <%= javascript_include_tag "translations", "data-turbo-track": "reload" %>
41
- EOHTML
42
- append_to_file "app/assets/config/manifest.js", <<~EOJS
43
- //= link i18n.js
44
- //= link translations.js
45
- EOJS
36
+ copy_file "config/initializers/i18n_js.rb"
37
+ copy_file "app/javascript/i18n.js"
46
38
  end
47
39
 
48
40
  def ignore_generated_file
@@ -50,7 +42,7 @@ module RailsTemplate18f
50
42
  append_to_file ".gitignore", <<~EOM
51
43
 
52
44
  # Generated by i18n-js
53
- /public/javascripts/i18n.js
45
+ /app/javascript/generated
54
46
  EOM
55
47
  end
56
48
  end
@@ -0,0 +1,11 @@
1
+ import { I18n } from 'i18n-js';
2
+ import translations from './generated/translations.json';
3
+
4
+ const userLocale = document.documentElement.lang;
5
+
6
+ export const i18n = new I18n();
7
+
8
+ i18n.store(translations);
9
+ i18n.defaultLocale = "en";
10
+ i18n.enableFallback = true;
11
+ i18n.locale = userLocale;
@@ -0,0 +1,4 @@
1
+ translations:
2
+ - file: "app/javascript/generated/translations.json"
3
+ patterns:
4
+ - "*.js.*"
@@ -0,0 +1,5 @@
1
+ Rails.application.config.after_initialize do
2
+ require "i18n-js/listen"
3
+ # This will only run in development
4
+ I18nJS.listen config_file: Rails.root.join("config/i18n-js.yml")
5
+ end
@@ -1,9 +1,10 @@
1
1
  # export translations as part of asset precompile
2
-
3
- Rake::Task["assets:precompile"].enhance(["i18n:js:export"])
4
-
5
- if Rake::Task.task_defined?("test:prepare")
6
- Rake::Task["test:prepare"].enhance(["i18n:js:export"])
7
- elsif Rake::Task.task_defined?("db:test:prepare")
8
- Rake::Task["db:test:prepare"].enhance(["i18n:js:export"])
2
+ namespace "i18n:js" do
3
+ desc "Call the i18n-js export method"
4
+ task :export do
5
+ require "i18n-js"
6
+ I18nJS.call(config_file: "config/i18n-js.yml")
7
+ end
9
8
  end
9
+
10
+ Rake::Task["javascript:build"].enhance(["i18n:js:export"])
@@ -24,7 +24,7 @@ module RailsTemplate18f
24
24
 
25
25
  def install_gem
26
26
  return if gem_installed?("newrelic_rpm")
27
- gem "newrelic_rpm", "~> 9.10"
27
+ gem "newrelic_rpm", "~> 9.12"
28
28
  bundle_install
29
29
  end
30
30
 
@@ -10,6 +10,7 @@ module RailsTemplate18f
10
10
  class_option :oscal_repo, desc: "GitHub Repo to store compliance documents within. Leave blank to check docs into the app repo"
11
11
  class_option :tag, desc: "Which docker-trestle tag to use. Defaults to `latest`"
12
12
  class_option :branch, desc: "Name of the branch to switch to when using a submodule. Defaults to `main`"
13
+ class_option :ci, desc: "Name of CI to generate files for. Defaults to system already in use"
13
14
 
14
15
  desc <<~DESC
15
16
  Description:
@@ -42,6 +43,12 @@ module RailsTemplate18f
42
43
  template "doc/compliance/oscal/trestle-config.yaml"
43
44
  end
44
45
 
46
+ def copy_github_actions
47
+ if use_github_actions?
48
+ directory "github", ".github"
49
+ end
50
+ end
51
+
45
52
  def update_readme
46
53
  if file_content("README.md").match?("## Documentation")
47
54
  insert_into_file "README.md", readme_contents, after: "## Documentation\n"
@@ -66,6 +73,8 @@ module RailsTemplate18f
66
73
  # Trestle working files
67
74
  doc/compliance/oscal/.trestle/_trash
68
75
  doc/compliance/oscal/.trestle/cache
76
+ # Trestle renders
77
+ doc/compliance/oscal/ssp-render/#{app_name}_ssp.*
69
78
  EOM
70
79
  end
71
80
  end
@@ -76,7 +85,11 @@ module RailsTemplate18f
76
85
  end
77
86
 
78
87
  def docker_trestle_tag
79
- options[:tag].present? ? options[:tag] : "latest"
88
+ options[:tag].present? ? options[:tag] : "20240912"
89
+ end
90
+
91
+ def use_github_actions?
92
+ options[:ci] == "github" || file_exists?(".github/workflows")
80
93
  end
81
94
 
82
95
  def readme_contents
@@ -1,10 +1,13 @@
1
1
  #! /usr/bin/env bash
2
2
 
3
+ trestle_tag="<%= docker_trestle_tag %>"
4
+
3
5
  command="bash"
4
6
  if [ "$1" != "" ]; then
5
7
  command=$1
8
+ shift 1
6
9
  fi
7
10
 
8
11
  oscal_location="$(dirname "$(realpath "$0")")/../doc/compliance/oscal"
9
12
 
10
- docker run -it --rm -v $oscal_location:/app/docs:rw ghcr.io/gsa-tts/trestle:<%= docker_trestle_tag %> $command
13
+ docker run -it --rm -v $oscal_location:/app/docs:rw ghcr.io/gsa-tts/trestle:$trestle_tag $command "$@"
@@ -0,0 +1,16 @@
1
+ name: "Run a docker-trestle command"
2
+ description: "Sets up workspace for running a single command in docker-trestle"
3
+ inputs:
4
+ tag:
5
+ description: docker-trestle tag to use.
6
+ required: false
7
+ default: <%= docker_trestle_tag %>
8
+ cmd:
9
+ description: Command to run within docker-trestle
10
+ required: true
11
+ runs:
12
+ using: "composite"
13
+ steps:
14
+ - name: Run cmd
15
+ shell: bash
16
+ run: docker run -u "$(id -u):$(id -g)" -v $GITHUB_WORKSPACE/doc/compliance/oscal:/app/docs:rw ghcr.io/gsa-tts/trestle:${{ inputs.tag }} ${{ inputs.cmd }}