rails_template_18f 0.8.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +13 -0
  3. data/Gemfile.lock +58 -28
  4. data/README.md +5 -5
  5. data/Rakefile +12 -0
  6. data/SECURITY.md +18 -0
  7. data/lib/generators/rails_template18f/active_storage/active_storage_generator.rb +2 -9
  8. data/lib/generators/rails_template18f/active_storage/templates/oscal/component-definitions/active_storage/component-definition.json +69 -0
  9. data/lib/generators/rails_template18f/auditree/auditree_generator.rb +84 -0
  10. data/lib/generators/rails_template18f/auditree/templates/bin/auditree.tt +29 -0
  11. data/lib/generators/rails_template18f/auditree/templates/github/actions/auditree-cmd/action.yml.tt +31 -0
  12. data/lib/generators/rails_template18f/auditree/templates/github/workflows/auditree-validation.yml.tt +42 -0
  13. data/lib/generators/rails_template18f/circleci/circleci_generator.rb +3 -3
  14. data/lib/generators/rails_template18f/circleci/templates/bin/ci-server-start +1 -1
  15. data/lib/generators/rails_template18f/circleci/templates/circleci/config.yml.tt +59 -16
  16. data/lib/generators/rails_template18f/circleci/templates/docker-compose.ci.yml +1 -0
  17. data/lib/generators/rails_template18f/circleci/templates/oscal/component-definitions/circleci/component-definition.json.tt +310 -0
  18. data/lib/generators/rails_template18f/github_actions/github_actions_generator.rb +7 -12
  19. data/lib/generators/rails_template18f/github_actions/templates/github/actions/setup-languages/action.yml.tt +1 -1
  20. data/lib/generators/rails_template18f/github_actions/templates/github/actions/setup-project/action.yml.tt +1 -0
  21. data/lib/generators/rails_template18f/github_actions/templates/github/actions/trestle-cmd/action.yml +20 -0
  22. data/lib/generators/rails_template18f/github_actions/templates/github/workflows/assemble-ssp.yml.tt +26 -0
  23. data/lib/generators/rails_template18f/github_actions/templates/github/workflows/brakeman-analysis.yml +6 -2
  24. data/lib/generators/rails_template18f/github_actions/templates/github/workflows/dependency-scans.yml +4 -4
  25. data/lib/generators/rails_template18f/github_actions/templates/github/workflows/deploy-production.yml.tt +14 -25
  26. data/lib/generators/rails_template18f/github_actions/templates/github/workflows/deploy-staging.yml.tt +14 -25
  27. data/lib/generators/rails_template18f/github_actions/templates/github/workflows/owasp-daily-scan.yml.tt +8 -3
  28. data/lib/generators/rails_template18f/github_actions/templates/github/workflows/owasp-scan.yml.tt +4 -3
  29. data/lib/generators/rails_template18f/github_actions/templates/github/workflows/pa11y.yml.tt +6 -2
  30. data/lib/generators/rails_template18f/github_actions/templates/github/workflows/rspec.yml.tt +1 -1
  31. data/lib/generators/rails_template18f/github_actions/templates/github/workflows/terraform-production.yml +20 -58
  32. data/lib/generators/rails_template18f/github_actions/templates/github/workflows/terraform-staging.yml +20 -58
  33. data/lib/generators/rails_template18f/github_actions/templates/github/workflows/validate-ssp.yml.tt +46 -0
  34. data/lib/generators/rails_template18f/github_actions/templates/oscal/component-definitions/github_actions/component-definition.json.tt +310 -0
  35. data/lib/generators/rails_template18f/i18n/i18n_generator.rb +7 -6
  36. data/lib/generators/rails_template18f/i18n/templates/config/locales/en.yml.tt +1 -0
  37. data/lib/generators/rails_template18f/i18n/templates/config/locales/es.yml +2 -0
  38. data/lib/generators/rails_template18f/i18n/templates/config/locales/fr.yml +2 -0
  39. data/lib/generators/rails_template18f/i18n/templates/config/locales/zh.yml +2 -0
  40. data/lib/generators/rails_template18f/newrelic/newrelic_generator.rb +2 -37
  41. data/lib/generators/rails_template18f/newrelic/templates/oscal/component-definitions/newrelic/component-definition.json.tt +113 -0
  42. data/lib/generators/rails_template18f/oscal/oscal_generator.rb +55 -17
  43. data/lib/generators/rails_template18f/oscal/templates/bin/trestle.tt +10 -0
  44. data/lib/generators/rails_template18f/oscal/templates/doc/compliance/oscal/trestle-config.yaml.tt +6 -0
  45. data/lib/generators/rails_template18f/sidekiq/sidekiq_generator.rb +2 -2
  46. data/lib/generators/rails_template18f/terraform/templates/terraform/README.md.tt +1 -1
  47. data/lib/generators/rails_template18f/terraform/templates/terraform/production/main.tf.tt +4 -4
  48. data/lib/generators/rails_template18f/terraform/templates/terraform/production/providers.tf.tt +0 -1
  49. data/lib/generators/rails_template18f/terraform/templates/terraform/staging/main.tf.tt +4 -4
  50. data/lib/generators/rails_template18f/terraform/templates/terraform/staging/providers.tf.tt +0 -1
  51. data/lib/rails_template18f/generators/base.rb +9 -24
  52. data/lib/rails_template18f/generators/pipeline_options.rb +0 -172
  53. data/lib/rails_template18f/version.rb +1 -1
  54. data/rails-template-18f.gemspec +6 -6
  55. data/railsrc +1 -0
  56. data/railsrc-hotwire +1 -0
  57. data/template.rb +56 -44
  58. data/templates/Brewfile +2 -2
  59. data/templates/README.md.tt +3 -4
  60. data/templates/app/assets/stylesheets/uswds-components.scss +6 -0
  61. data/templates/app/assets/stylesheets/uswds-overrides/_index.scss +2 -0
  62. data/templates/app/assets/stylesheets/uswds-overrides/_override-usa-banner.scss +13 -0
  63. data/templates/app/assets/stylesheets/uswds-overrides/_override-usa-language-selector.scss +38 -0
  64. data/templates/app/views/application/_header.html.erb +6 -5
  65. data/templates/app/views/application/_language_selector.html.erb +35 -0
  66. data/templates/app/views/application/_usa_banner.html.erb +21 -16
  67. data/templates/bin/owasp-scan +3 -3
  68. data/templates/bin/pa11y-scan +1 -1
  69. data/templates/config/environments/ci.rb +1 -0
  70. data/templates/manifest.yml.tt +0 -1
  71. data/templates/pa11y.js +12 -0
  72. data/templates/pa11yci.js +8 -0
  73. metadata +35 -16
  74. data/templates/pa11yci +0 -9
  75. /data/lib/generators/rails_template18f/circleci/templates/{Dockerfile.tt → Dockerfile.ci.tt} +0 -0
@@ -7,47 +7,36 @@ on:
7
7
  - 'doc/**'
8
8
  - 'README.md'
9
9
 
10
+ permissions:
11
+ contents: read
12
+ pull-requests: write
13
+
10
14
  jobs:
11
15
  deploy:
12
16
  name: Deploy to production
13
17
  runs-on: ubuntu-latest
14
18
  environment: production
19
+ env:
20
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
15
21
  steps:
16
- - uses: actions/checkout@v2
17
- with:
18
- fetch-depth: 2
22
+ - uses: actions/checkout@v4
19
23
  <% if terraform? %>
20
- - name: Check for changes to Terraform
21
- id: changed-terraform-files
22
- uses: tj-actions/changed-files@v1.1.2
23
- with:
24
- files: |
25
- terraform/shared
26
- terraform/production
27
- - name: Terraform init
28
- if: steps.changed-terraform-files.outputs.any_changed == 'true'
29
- working-directory: terraform/production
30
- env:
31
- AWS_ACCESS_KEY_ID: ${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
32
- AWS_SECRET_ACCESS_KEY: ${{ secrets.TERRAFORM_STATE_SECRET_ACCESS_KEY }}
33
- run: terraform init
34
24
  - name: Terraform apply
35
- if: steps.changed-terraform-files.outputs.any_changed == 'true'
36
- working-directory: terraform/production
25
+ uses: dflook/terraform-apply@v1
37
26
  env:
38
- AWS_ACCESS_KEY_ID: ${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
39
- AWS_SECRET_ACCESS_KEY: ${{ secrets.TERRAFORM_STATE_SECRET_ACCESS_KEY }}
40
27
  TF_VAR_cf_user: ${{ secrets.CF_USERNAME }}
41
28
  TF_VAR_cf_password: ${{ secrets.CF_PASSWORD }}
42
- run: terraform apply -auto-approve -input=false
29
+ with:
30
+ path: terraform/production
31
+ backend_config: >
32
+ access_key=${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
33
+ secret_key=${{ secrets.TERRAFORM_STATE_SECRET_ACCESS_KEY }}
43
34
  <% end %>
44
35
  - name: Deploy app
45
36
  uses: cloud-gov/cg-cli-tools@main
46
- env:
47
- RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
48
37
  with:
49
38
  cf_username: ${{ secrets.CF_USERNAME }}
50
39
  cf_password: ${{ secrets.CF_PASSWORD }}
51
40
  cf_org: <%= cloud_gov_organization %>
52
41
  cf_space: <%= cloud_gov_production_space %>
53
- cf_command: push -vars-file config/deployment/production.yml --var rails_master_key=${{ env.RAILS_MASTER_KEY }} --strategy rolling
42
+ cf_command: push --vars-file config/deployment/production.yml --var rails_master_key="${{ secrets.RAILS_MASTER_KEY }}" --strategy rolling
@@ -7,47 +7,36 @@ on:
7
7
  - 'doc/**'
8
8
  - 'README.md'
9
9
 
10
+ permissions:
11
+ contents: read
12
+ pull-requests: write
13
+
10
14
  jobs:
11
15
  deploy:
12
16
  name: Deploy to staging
13
17
  runs-on: ubuntu-latest
14
18
  environment: staging
19
+ env:
20
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
15
21
  steps:
16
- - uses: actions/checkout@v2
17
- with:
18
- fetch-depth: 2
22
+ - uses: actions/checkout@v4
19
23
  <% if terraform? %>
20
- - name: Check for changes to Terraform
21
- id: changed-terraform-files
22
- uses: tj-actions/changed-files@v1.1.2
23
- with:
24
- files: |
25
- terraform/shared
26
- terraform/staging
27
- - name: Terraform init
28
- if: steps.changed-terraform-files.outputs.any_changed == 'true'
29
- working-directory: terraform/staging
30
- env:
31
- AWS_ACCESS_KEY_ID: ${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
32
- AWS_SECRET_ACCESS_KEY: ${{ secrets.TERRAFORM_STATE_SECRET_ACCESS_KEY }}
33
- run: terraform init
34
24
  - name: Terraform apply
35
- if: steps.changed-terraform-files.outputs.any_changed == 'true'
36
- working-directory: terraform/staging
25
+ uses: dflook/terraform-apply@v1
37
26
  env:
38
- AWS_ACCESS_KEY_ID: ${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
39
- AWS_SECRET_ACCESS_KEY: ${{ secrets.TERRAFORM_STATE_SECRET_ACCESS_KEY }}
40
27
  TF_VAR_cf_user: ${{ secrets.CF_USERNAME }}
41
28
  TF_VAR_cf_password: ${{ secrets.CF_PASSWORD }}
42
- run: terraform apply -auto-approve -input=false
29
+ with:
30
+ path: terraform/staging
31
+ backend_config: >
32
+ access_key=${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
33
+ secret_key=${{ secrets.TERRAFORM_STATE_SECRET_ACCESS_KEY }}
43
34
  <% end %>
44
35
  - name: Deploy app
45
36
  uses: cloud-gov/cg-cli-tools@main
46
- env:
47
- RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
48
37
  with:
49
38
  cf_username: ${{ secrets.CF_USERNAME }}
50
39
  cf_password: ${{ secrets.CF_PASSWORD }}
51
40
  cf_org: <%= cloud_gov_organization %>
52
41
  cf_space: <%= cloud_gov_staging_space %>
53
- cf_command: push -vars-file config/deployment/staging.yml --var rails_master_key=${{ env.RAILS_MASTER_KEY }} --strategy rolling
42
+ cf_command: push --vars-file config/deployment/staging.yml --var rails_master_key="${{ secrets.RAILS_MASTER_KEY }}" --strategy rolling
@@ -6,6 +6,10 @@ on:
6
6
  # this will run at noon UTC every day (7am EST / 8am EDT)
7
7
  - cron: '0 12 * * *'
8
8
 
9
+ permissions:
10
+ contents: read
11
+ issues: write
12
+
9
13
  jobs:
10
14
  owasp-scan:
11
15
  name: OWASP ZAP Scan
@@ -25,7 +29,7 @@ jobs:
25
29
  POSTGRES_PASSWORD: postgres
26
30
 
27
31
  steps:
28
- - uses: actions/checkout@v2
32
+ - uses: actions/checkout@v4
29
33
 
30
34
  - id: setup
31
35
  uses: ./.github/actions/setup-project
@@ -35,9 +39,10 @@ jobs:
35
39
  database_url: ${{ steps.setup.outputs.database_url }}
36
40
 
37
41
  - name: Run OWASP Full Scan
38
- uses: zaproxy/action-full-scan@v0.3.0
42
+ uses: zaproxy/action-full-scan@v0.10.0
39
43
  with:
40
- docker_name: 'owasp/zap2docker-weekly'
44
+ token: ${{ secrets.GITHUB_TOKEN }}
45
+ docker_name: 'ghcr.io/zaproxy/zaproxy:weekly'
41
46
  target: 'http://localhost:3000/'
42
47
  fail_action: true
43
48
  rules_file_name: 'zap.conf'
@@ -28,7 +28,7 @@ jobs:
28
28
  POSTGRES_PASSWORD: postgres
29
29
 
30
30
  steps:
31
- - uses: actions/checkout@v2
31
+ - uses: actions/checkout@v4
32
32
 
33
33
  - id: setup
34
34
  uses: ./.github/actions/setup-project
@@ -38,10 +38,11 @@ jobs:
38
38
  database_url: ${{ steps.setup.outputs.database_url }}
39
39
 
40
40
  - name: Run OWASP Baseline Scan
41
- uses: zaproxy/action-baseline@v0.6.1
41
+ uses: zaproxy/action-baseline@v0.12.0
42
42
  with:
43
- docker_name: 'owasp/zap2docker-weekly'
43
+ docker_name: 'ghcr.io/zaproxy/zaproxy:weekly'
44
44
  target: 'http://localhost:3000/'
45
45
  fail_action: true
46
+ allow_issue_writing: false
46
47
  rules_file_name: 'zap.conf'
47
48
  cmd_options: '-I'
@@ -2,6 +2,10 @@ name: pa11y tests
2
2
 
3
3
  on: [pull_request]
4
4
 
5
+ permissions:
6
+ contents: read
7
+ pull-requests: write
8
+
5
9
  jobs:
6
10
  pa11y_scan:
7
11
  name: Pa11y Scan
@@ -21,7 +25,7 @@ jobs:
21
25
  POSTGRES_PASSWORD: postgres
22
26
 
23
27
  steps:
24
- - uses: actions/checkout@v2
28
+ - uses: actions/checkout@v4
25
29
 
26
30
  - id: setup
27
31
  uses: ./.github/actions/setup-project
@@ -34,7 +38,7 @@ jobs:
34
38
  shell: bash
35
39
  run: |
36
40
  set -o pipefail
37
- yarn run pa11y-ci 2>&1 | tee pa11y_output.txt
41
+ yarn run pa11y-ci -c pa11yci.js 2>&1 | tee pa11y_output.txt
38
42
 
39
43
  - name: Read pa11y_output file.
40
44
  if: failure()
@@ -21,7 +21,7 @@ jobs:
21
21
  POSTGRES_PASSWORD: postgres
22
22
 
23
23
  steps:
24
- - uses: actions/checkout@v2
24
+ - uses: actions/checkout@v4
25
25
 
26
26
  - id: setup
27
27
  uses: ./.github/actions/setup-project
@@ -3,77 +3,39 @@ name: Run Terraform plan in production
3
3
  on:
4
4
  pull_request:
5
5
  branches: [ production ]
6
- paths: [ 'terraform/**' ]
7
6
 
8
- defaults:
9
- run:
10
- working-directory: terraform/production
7
+ permissions:
8
+ contents: read
9
+ pull-requests: write
11
10
 
12
11
  jobs:
13
12
  terraform:
14
13
  name: Terraform plan
15
14
  runs-on: ubuntu-latest
16
15
  environment: production
16
+ env:
17
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
17
18
  steps:
18
19
  - name: Checkout
19
- uses: actions/checkout@v2
20
+ uses: actions/checkout@v4
20
21
 
21
- - name: Terraform format
22
- id: format
23
- run: terraform fmt -check
24
-
25
- - name: Terraform init
26
- id: init
27
- env:
28
- AWS_ACCESS_KEY_ID: ${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
29
- AWS_SECRET_ACCESS_KEY: ${{ secrets.TERRAFORM_STATE_SECRET_ACCESS_KEY }}
30
- run: terraform init
22
+ - name: terraform validate
23
+ uses: dflook/terraform-validate@v1
24
+ with:
25
+ path: terraform/production
31
26
 
32
- - name: Terraform validate
33
- id: validation
34
- run: terraform validate -no-color
27
+ - name: terraform fmt
28
+ uses: dflook/terraform-fmt-check@v1
29
+ with:
30
+ path: terraform/production
35
31
 
36
- - name: Terraform plan
37
- id: plan
32
+ - name: terraform plan
33
+ uses: dflook/terraform-plan@v1
38
34
  env:
39
- AWS_ACCESS_KEY_ID: ${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
40
- AWS_SECRET_ACCESS_KEY: ${{ secrets.TERRAFORM_STATE_SECRET_ACCESS_KEY }}
41
35
  TF_VAR_cf_user: ${{ secrets.CF_USERNAME }}
42
36
  TF_VAR_cf_password: ${{ secrets.CF_PASSWORD }}
43
- run: terraform plan -no-color -input=false 2>&1 | tee plan_output.txt
44
-
45
- - name: Read Terraform plan output file
46
- id: terraform_output
47
- uses: juliangruber/read-file-action@v1
48
- if: ${{ always() }}
49
- with:
50
- path: ./terraform/production/plan_output.txt
51
-
52
- # inspiration: https://learn.hashicorp.com/tutorials/terraform/github-actions#review-actions-workflow
53
- - name: Update PR
54
- uses: actions/github-script@v4
55
- # we would like to update the PR even when a prior step failed
56
- if: ${{ always() }}
57
37
  with:
58
- script: |
59
- const output = `Terraform Format and Style: ${{ steps.format.outcome }}
60
- Terraform Initialization: ${{ steps.init.outcome }}
61
- Terraform Validation: ${{ steps.validation.outcome }}
62
- Terraform Plan: ${{ steps.plan.outcome }}
63
-
64
- <details><summary>Show Plan</summary>
65
-
66
- \`\`\`\n
67
- ${{ steps.terraform_output.outputs.content }}
68
- \`\`\`
69
-
70
- </details>
71
-
72
- *Pusher: @${{ github.actor }}, Action: \`${{ github.event_name }}\`*`;
73
-
74
- github.issues.createComment({
75
- issue_number: context.issue.number,
76
- owner: context.repo.owner,
77
- repo: context.repo.repo,
78
- body: output
79
- })
38
+ path: terraform/production
39
+ backend_config: >
40
+ access_key=${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
41
+ secret_key=${{ secrets.TERRAFORM_STATE_SECRET_ACCESS_KEY }}
@@ -3,77 +3,39 @@ name: Run Terraform plan in staging
3
3
  on:
4
4
  pull_request:
5
5
  branches: [ main ]
6
- paths: [ 'terraform/**' ]
7
6
 
8
- defaults:
9
- run:
10
- working-directory: terraform/staging
7
+ permissions:
8
+ contents: read
9
+ pull-requests: write
11
10
 
12
11
  jobs:
13
12
  terraform:
14
13
  name: Terraform plan
15
14
  runs-on: ubuntu-latest
16
15
  environment: staging
16
+ env:
17
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
17
18
  steps:
18
19
  - name: Checkout
19
- uses: actions/checkout@v2
20
+ uses: actions/checkout@v4
20
21
 
21
- - name: Terraform format
22
- id: format
23
- run: terraform fmt -check
24
-
25
- - name: Terraform init
26
- id: init
27
- env:
28
- AWS_ACCESS_KEY_ID: ${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
29
- AWS_SECRET_ACCESS_KEY: ${{ secrets.TERRAFORM_STATE_SECRET_ACCESS_KEY }}
30
- run: terraform init
22
+ - name: terraform validate
23
+ uses: dflook/terraform-validate@v1
24
+ with:
25
+ path: terraform/staging
31
26
 
32
- - name: Terraform validate
33
- id: validation
34
- run: terraform validate -no-color
27
+ - name: terraform fmt
28
+ uses: dflook/terraform-fmt-check@v1
29
+ with:
30
+ path: terraform/staging
35
31
 
36
- - name: Terraform plan
37
- id: plan
32
+ - name: terraform plan
33
+ uses: dflook/terraform-plan@v1
38
34
  env:
39
- AWS_ACCESS_KEY_ID: ${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
40
- AWS_SECRET_ACCESS_KEY: ${{ secrets.TERRAFORM_STATE_SECRET_ACCESS_KEY }}
41
35
  TF_VAR_cf_user: ${{ secrets.CF_USERNAME }}
42
36
  TF_VAR_cf_password: ${{ secrets.CF_PASSWORD }}
43
- run: terraform plan -no-color -input=false 2>&1 | tee plan_output.txt
44
-
45
- - name: Read Terraform plan output file
46
- id: terraform_output
47
- uses: juliangruber/read-file-action@v1
48
- if: ${{ always() }}
49
- with:
50
- path: ./terraform/staging/plan_output.txt
51
-
52
- # inspiration: https://learn.hashicorp.com/tutorials/terraform/github-actions#review-actions-workflow
53
- - name: Update PR
54
- uses: actions/github-script@v4
55
- # we would like to update the PR even when a prior step failed
56
- if: ${{ always() }}
57
37
  with:
58
- script: |
59
- const output = `Terraform Format and Style: ${{ steps.format.outcome }}
60
- Terraform Initialization: ${{ steps.init.outcome }}
61
- Terraform Validation: ${{ steps.validation.outcome }}
62
- Terraform Plan: ${{ steps.plan.outcome }}
63
-
64
- <details><summary>Show Plan</summary>
65
-
66
- \`\`\`\n
67
- ${{ steps.terraform_output.outputs.content }}
68
- \`\`\`
69
-
70
- </details>
71
-
72
- *Pusher: @${{ github.actor }}, Action: \`${{ github.event_name }}\`*`;
73
-
74
- github.issues.createComment({
75
- issue_number: context.issue.number,
76
- owner: context.repo.owner,
77
- repo: context.repo.repo,
78
- body: output
79
- })
38
+ path: terraform/staging
39
+ backend_config: >
40
+ access_key=${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
41
+ secret_key=${{ secrets.TERRAFORM_STATE_SECRET_ACCESS_KEY }}
@@ -0,0 +1,46 @@
1
+ name: Validate OSCAL Assembly
2
+
3
+ on: [pull_request]
4
+
5
+ permissions:
6
+ contents: read
7
+ pull-requests: write
8
+
9
+ jobs:
10
+ validate_ssp:
11
+ name: Validate SSP format
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+
16
+ - name: Validate SSP
17
+ uses: ./.github/actions/trestle-cmd
18
+ with:
19
+ cmd: trestle validate -f system-security-plans/<%= app_name %>/system-security-plan.json
20
+
21
+ check_ssp:
22
+ name: Check assembly is current
23
+ runs-on: ubuntu-latest
24
+ steps:
25
+ - uses: actions/checkout@v4
26
+
27
+ - name: Check assembly
28
+ uses: ./.github/actions/trestle-cmd
29
+ with:
30
+ cmd: assemble-ssp-json 2> /dev/null | grep "^No changes to assembled ssp"
31
+
32
+ - name: Comment on pull request
33
+ if: failure()
34
+ uses: actions/github-script@v4
35
+ with:
36
+ script: |
37
+ const output = `SSP assembly detected changes that aren't checked in.
38
+
39
+ Run \`bin/trestle assemble-ssp-json\` to ensure markdown changes are reflected in your SSP`;
40
+
41
+ github.issues.createComment({
42
+ issue_number: context.issue.number,
43
+ owner: context.repo.owner,
44
+ repo: context.repo.repo,
45
+ body: output
46
+ });