-
Notifications
You must be signed in to change notification settings - Fork 0
feat(security): add CodeQL analysis and pre-release version gate #208
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: develop
Are you sure you want to change the base?
Changes from all commits
49915c0
aad6ec3
046ef64
537771d
f89fd13
927fb87
2edd134
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -76,8 +76,34 @@ | |
| description: 'Use the component working_dir as Docker build context instead of repo root. Useful for independent modules (e.g., tools with their own go.mod).' | ||
| type: boolean | ||
| default: false | ||
| enable_codeql: | ||
| description: 'Enable CodeQL static analysis. Requires codeql_languages to be set.' | ||
| type: boolean | ||
| default: false | ||
| codeql_languages: | ||
| description: 'Languages to analyze with CodeQL (comma-separated, e.g., "go", "javascript-typescript", "actions")' | ||
| type: string | ||
| required: false | ||
| default: '' | ||
| codeql_fail_on_findings: | ||
| description: 'Fail the workflow when CodeQL detects security issues' | ||
| type: boolean | ||
| default: true | ||
| codeql_upload_sarif: | ||
| description: 'Upload CodeQL SARIF results to the GitHub Security tab. Requires Code Security (GHAS) enabled on the repo.' | ||
| type: boolean | ||
| default: false | ||
| enable_prerelease_check: | ||
| description: 'Block dependencies pinned to pre-release versions (-beta, -rc)' | ||
| type: boolean | ||
| default: true | ||
|
Comment on lines
+96
to
+99
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Defaulting This reusable workflow now hard-fails PRs for existing consumers that do not know about the new input yet. "Can be disabled" does not help callers already pinned to a shared ref, because they would have to change their workflow first. If this is meant to be non-breaking, ship it default-off initially or only behind a new version boundary. 🤖 Prompt for AI Agents |
||
| prerelease_block_branches: | ||
| description: 'Comma-separated list of PR target branches where pre-release versions cause a hard failure. On other branches, findings are reported as warnings only.' | ||
| type: string | ||
| default: 'release-candidate,main' | ||
|
|
||
| permissions: | ||
| actions: read # Required for CodeQL status reporting | ||
| id-token: write # Required for OIDC authentication | ||
| contents: read # Required to checkout the repository | ||
| pull-requests: write # Allows commenting on PRs | ||
|
|
@@ -100,7 +126,7 @@ | |
| # ----------------- Detect Changes & Build Matrix ----------------- | ||
| - name: Get changed paths | ||
| id: changed-paths | ||
| uses: LerianStudio/github-actions-shared-workflows/src/config/changed-paths@v1.18.0 | ||
| uses: LerianStudio/github-actions-shared-workflows/src/config/changed-paths@v1.23.1 | ||
| with: | ||
| filter-paths: ${{ inputs.filter_paths }} | ||
| shared-paths: ${{ inputs.shared_paths }} | ||
|
|
@@ -150,7 +176,7 @@ | |
| - name: Trivy Filesystem Scan | ||
| id: fs-scan | ||
| if: always() | ||
| uses: LerianStudio/github-actions-shared-workflows/src/security/trivy-fs-scan@v1.18.0 | ||
| uses: LerianStudio/github-actions-shared-workflows/src/security/trivy-fs-scan@v1.23.1 | ||
| with: | ||
| scan-ref: ${{ matrix.working_dir }} | ||
| app-name: ${{ env.APP_NAME }} | ||
|
|
@@ -175,7 +201,7 @@ | |
| - name: Trivy Image Scan | ||
| id: image-scan | ||
| if: always() && inputs.enable_docker_scan | ||
| uses: LerianStudio/github-actions-shared-workflows/src/security/trivy-image-scan@v1.18.0 | ||
| uses: LerianStudio/github-actions-shared-workflows/src/security/trivy-image-scan@v1.23.1 | ||
| with: | ||
| image-ref: '${{ env.DOCKERHUB_ORG }}/${{ env.APP_NAME }}:pr-scan-${{ github.sha }}' | ||
| app-name: ${{ env.APP_NAME }} | ||
|
|
@@ -185,15 +211,24 @@ | |
| - name: Dockerfile Compliance Checks | ||
| id: dockerfile-checks | ||
| if: always() && inputs.enable_docker_scan && inputs.enable_health_score | ||
| uses: LerianStudio/github-actions-shared-workflows/src/security/dockerfile-checks@v1.18.0 | ||
| uses: LerianStudio/github-actions-shared-workflows/src/security/dockerfile-checks@v1.23.1 | ||
| with: | ||
| dockerfile-path: ${{ env.DOCKERFILE_PATH }} | ||
|
|
||
| # ----------------- Pre-release Version Gate ----------------- | ||
| - name: Pre-release Version Check | ||
| id: prerelease-check | ||
| if: always() && inputs.enable_prerelease_check | ||
| uses: LerianStudio/github-actions-shared-workflows/src/security/prerelease-check@feat/pr-security-scan-codeql-prerelease | ||
|
Check warning on line 222 in .github/workflows/pr-security-scan.yml
|
||
| with: | ||
| scan-ref: ${{ matrix.working_dir }} | ||
| app-name: ${{ env.APP_NAME }} | ||
|
Comment on lines
+218
to
+225
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chain🏁 Script executed: # Read the pr-security-scan.yml file to check the refs at the mentioned lines
cat -n .github/workflows/pr-security-scan.yml | sed -n '200,290p'Repository: LerianStudio/github-actions-shared-workflows Length of output: 5201 🏁 Script executed: # Search for all feature-branch refs in the file
grep -n "feat/pr-security-scan-codeql-prerelease" .github/workflows/pr-security-scan.yml
# Check what branches exist and what the default branch is
git branch -a | head -20Repository: LerianStudio/github-actions-shared-workflows Length of output: 849 🏁 Script executed: # Check for any README or docs about branch/ref strategy
find . -maxdepth 2 -name "*.md" -type f | head -10
# Look for other uses of stable refs in workflows to see the pattern
grep -r "uses:.*github-actions-shared-workflows.*@" .github/workflows/ | grep -v "feat/" | head -5Repository: LerianStudio/github-actions-shared-workflows Length of output: 976 🏁 Script executed: # Check the default branch configuration and what the review comment learnings say
cat README.md | head -50
# Check for version tags to understand the tagging strategy
git tag -l | tail -10Repository: LerianStudio/github-actions-shared-workflows Length of output: 1600 🏁 Script executed: # Check what version tags are used for other composites in the same workflow
grep -n "uses:.*github-actions-shared-workflows.*@" .github/workflows/pr-security-scan.yml | head -15Repository: LerianStudio/github-actions-shared-workflows Length of output: 1338 🏁 Script executed: # Check if the new composites exist and what version tags they might have
for composite in prerelease-check codeql-config codeql-init codeql-analyze codeql-reporter; do
if [ -f "src/security/$composite/action.yml" ]; then
echo "=== $composite exists ==="
else
echo "=== $composite MISSING ==="
fi
done
# Check what branches these new composites are on
git log --oneline -n 20 -- src/security/prerelease-check/ 2>/dev/null | head -5
git log --oneline -n 20 -- src/security/codeql-config/ 2>/dev/null | head -5Repository: LerianStudio/github-actions-shared-workflows Length of output: 422 Switch feature-branch refs to semantic version tags before merge. The five Suggested ref update- uses: LerianStudio/github-actions-shared-workflows/src/security/prerelease-check@feat/pr-security-scan-codeql-prerelease
+ uses: LerianStudio/github-actions-shared-workflows/src/security/prerelease-check@v1.24.0
...
- uses: LerianStudio/github-actions-shared-workflows/src/security/codeql-config@feat/pr-security-scan-codeql-prerelease
+ uses: LerianStudio/github-actions-shared-workflows/src/security/codeql-config@v1.24.0
...
- uses: LerianStudio/github-actions-shared-workflows/src/security/codeql-init@feat/pr-security-scan-codeql-prerelease
+ uses: LerianStudio/github-actions-shared-workflows/src/security/codeql-init@v1.24.0
...
- uses: LerianStudio/github-actions-shared-workflows/src/security/codeql-analyze@feat/pr-security-scan-codeql-prerelease
+ uses: LerianStudio/github-actions-shared-workflows/src/security/codeql-analyze@v1.24.0
...
- uses: LerianStudio/github-actions-shared-workflows/src/security/codeql-reporter@feat/pr-security-scan-codeql-prerelease
+ uses: LerianStudio/github-actions-shared-workflows/src/security/codeql-reporter@v1.24.0🤖 Prompt for AI Agents |
||
|
|
||
| # ----------------- Results & Security Gate ----------------- | ||
| - name: Post Security Scan Results to PR | ||
| id: post-results | ||
| if: always() && github.event_name == 'pull_request' | ||
| uses: LerianStudio/github-actions-shared-workflows/src/security/pr-security-reporter@v1.18.0 | ||
| uses: LerianStudio/github-actions-shared-workflows/src/security/pr-security-reporter@v1.23.1 | ||
| with: | ||
| github-token: ${{ secrets.MANAGE_TOKEN || secrets.GITHUB_TOKEN }} | ||
| app-name: ${{ env.APP_NAME }} | ||
|
|
@@ -202,32 +237,102 @@ | |
| dockerfile-has-non-root-user: ${{ steps.dockerfile-checks.outputs.has-non-root-user || 'false' }} | ||
| fail-on-findings: 'true' | ||
|
|
||
| ## To be fixed | ||
| # - name: Upload Secret Scan Results - Repository (SARIF) to GitHub Security Tab | ||
| # uses: github/codeql-action/upload-sarif@v3 | ||
| # if: always() | ||
| # continue-on-error: true | ||
| # with: | ||
| # sarif_file: 'trivy-secret-scan-repo-${{ env.APP_NAME }}.sarif' | ||
|
|
||
| # - name: Upload Vulnerability Scan Results - Docker Image (SARIF) to GitHub Security Tab | ||
| # uses: github/codeql-action/upload-sarif@v3 | ||
| # if: always() | ||
| # continue-on-error: true | ||
| # with: | ||
| # sarif_file: 'trivy-vulnerability-scan-docker-${{ env.APP_NAME }}.sarif' | ||
| - name: Gate - Fail on Pre-release Versions | ||
| if: always() && inputs.enable_prerelease_check && steps.prerelease-check.outputs.has-findings == 'true' | ||
| env: | ||
| BLOCK_BRANCHES: ${{ inputs.prerelease_block_branches }} | ||
| TARGET_BRANCH: ${{ github.base_ref }} | ||
| FINDINGS_COUNT: ${{ steps.prerelease-check.outputs.findings-count }} | ||
| run: | | ||
| SHOULD_BLOCK=false | ||
| IFS=',' read -ra BRANCHES <<< "$BLOCK_BRANCHES" | ||
| for branch in "${BRANCHES[@]}"; do | ||
| branch=$(echo "$branch" | xargs) | ||
| if [ "$TARGET_BRANCH" = "$branch" ]; then | ||
| SHOULD_BLOCK=true | ||
| break | ||
| fi | ||
| done | ||
|
|
||
| if [ "$SHOULD_BLOCK" = "true" ]; then | ||
| echo "::error::Pre-release version pins detected ($FINDINGS_COUNT finding(s)). Target branch '$TARGET_BRANCH' does not allow beta or release candidate dependencies." | ||
| exit 1 | ||
| else | ||
| echo "::warning::Pre-release version pins detected ($FINDINGS_COUNT finding(s)). Allowed on '$TARGET_BRANCH' — will be blocked on: $BLOCK_BRANCHES." | ||
| fi | ||
|
|
||
| # ----------------- CodeQL Analysis ----------------- | ||
| codeql_scan: | ||
| needs: prepare_matrix | ||
| if: inputs.enable_codeql && inputs.codeql_languages != '' && needs.prepare_matrix.outputs.matrix != '[]' | ||
| runs-on: ${{ inputs.runner_type }} | ||
| steps: | ||
| # ----------------- Setup ----------------- | ||
| - name: Checkout Repository | ||
| uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 | ||
|
|
||
| - name: Extract changed paths from matrix | ||
| id: extract-paths | ||
| env: | ||
| MATRIX: ${{ needs.prepare_matrix.outputs.matrix }} | ||
| run: | | ||
| PATHS=$(echo "$MATRIX" | jq -r '.[].working_dir' | paste -sd ',' -) | ||
| echo "paths=$PATHS" >> "$GITHUB_OUTPUT" | ||
|
|
||
| # ----------------- CodeQL Config ----------------- | ||
| - name: Generate CodeQL Config | ||
| id: codeql-config | ||
| uses: LerianStudio/github-actions-shared-workflows/src/security/codeql-config@feat/pr-security-scan-codeql-prerelease | ||
|
Check warning on line 285 in .github/workflows/pr-security-scan.yml
|
||
| with: | ||
| changed-paths: ${{ steps.extract-paths.outputs.paths }} | ||
|
|
||
| # ----------------- CodeQL Analysis ----------------- | ||
| - name: Initialize CodeQL | ||
| if: steps.codeql-config.outputs.skip != 'true' | ||
| uses: LerianStudio/github-actions-shared-workflows/src/security/codeql-init@feat/pr-security-scan-codeql-prerelease | ||
|
Check warning on line 292 in .github/workflows/pr-security-scan.yml
|
||
| with: | ||
| languages: ${{ inputs.codeql_languages }} | ||
| config-file: ${{ steps.codeql-config.outputs.config-file }} | ||
|
|
||
| - name: Configure private Go modules access | ||
| if: steps.codeql-config.outputs.skip != 'true' | ||
| env: | ||
| TOKEN: ${{ secrets.MANAGE_TOKEN || secrets.GITHUB_TOKEN }} | ||
| run: | | ||
| git config --global url."https://x-access-token:${TOKEN}@github.com/".insteadOf "https://github.com/" | ||
| echo "GOPRIVATE=github.com/LerianStudio/*" >> "$GITHUB_ENV" | ||
|
Comment on lines
+297
to
+303
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Parameterize private Go module access instead of hardcoding
🤖 Prompt for AI Agents |
||
|
|
||
| - name: Autobuild | ||
| if: steps.codeql-config.outputs.skip != 'true' | ||
| uses: github/codeql-action/autobuild@c10b8064de6f491fea524254123dbe5e09572f13 # v4 | ||
|
|
||
| - name: Perform CodeQL Analysis | ||
| if: steps.codeql-config.outputs.skip != 'true' | ||
| uses: LerianStudio/github-actions-shared-workflows/src/security/codeql-analyze@feat/pr-security-scan-codeql-prerelease | ||
|
Check warning on line 311 in .github/workflows/pr-security-scan.yml
|
||
| with: | ||
| category: '/language:${{ inputs.codeql_languages }}' | ||
| upload: ${{ inputs.codeql_upload_sarif }} | ||
|
|
||
| # ----------------- Results & Security Gate ----------------- | ||
| - name: Post CodeQL Results to PR | ||
| if: always() && github.event_name == 'pull_request' && steps.codeql-config.outputs.skip != 'true' | ||
| uses: LerianStudio/github-actions-shared-workflows/src/security/codeql-reporter@feat/pr-security-scan-codeql-prerelease | ||
|
Check warning on line 319 in .github/workflows/pr-security-scan.yml
|
||
| with: | ||
| github-token: ${{ secrets.MANAGE_TOKEN || secrets.GITHUB_TOKEN }} | ||
| languages: ${{ inputs.codeql_languages }} | ||
| fail-on-findings: ${{ inputs.codeql_fail_on_findings }} | ||
|
|
||
| # ----------------- Slack Notification ----------------- | ||
| notify: | ||
| name: Notify | ||
| needs: [prepare_matrix, security_scan] | ||
| needs: [prepare_matrix, security_scan, codeql_scan] | ||
| if: always() && needs.prepare_matrix.outputs.matrix != '[]' | ||
| runs-on: ${{ inputs.runner_type }} | ||
| steps: | ||
| - name: Slack Notification | ||
| uses: LerianStudio/github-actions-shared-workflows/src/notify/slack-notify@v1.18.0 | ||
| uses: LerianStudio/github-actions-shared-workflows/src/notify/slack-notify@v1.23.1 | ||
| with: | ||
| webhook-url: ${{ secrets.SLACK_WEBHOOK_URL }} | ||
| status: ${{ needs.security_scan.result }} | ||
| status: ${{ (needs.security_scan.result == 'failure' || needs.codeql_scan.result == 'failure') && 'failure' || needs.security_scan.result }} | ||
| workflow-name: "PR Security Scan" | ||
| failed-jobs: ${{ needs.security_scan.result == 'failure' && 'Security Scan' || '' }} | ||
| failed-jobs: ${{ needs.security_scan.result == 'failure' && needs.codeql_scan.result == 'failure' && 'Security Scan, CodeQL Scan' || needs.security_scan.result == 'failure' && 'Security Scan' || needs.codeql_scan.result == 'failure' && 'CodeQL Scan' || '' }} | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -6,6 +6,8 @@ Reusable workflow for comprehensive security scanning on pull requests. Supports | |
|
|
||
| - **Secret scanning**: Trivy filesystem scan for exposed secrets (scans only changed component folder) | ||
| - **Vulnerability scanning**: Docker image vulnerability detection (optional) | ||
| - **CodeQL static analysis**: GitHub CodeQL for semantic code analysis (opt-in via `enable_codeql`) | ||
| - **Pre-release version gate**: Blocks dependencies pinned to `-beta` or `-rc` versions (enabled by default) | ||
| - **CLI/Non-Docker support**: Skip Docker scanning for projects without Dockerfile via `enable_docker_scan: false` | ||
| - **Monorepo support**: Automatic detection of changed components | ||
| - **Component-scoped scanning**: Only scans the specific component folder that changed, not entire repo | ||
|
|
@@ -138,9 +140,9 @@ This will: | |
| - ❌ Skip Docker vulnerability scanning | ||
| - ❌ Skip Docker Scout analysis | ||
|
|
||
| ### Docker Scout Analysis | ||
| ### With CodeQL Analysis | ||
|
|
||
| Enable Docker Scout for additional vulnerability scoring and CVE analysis on your Docker images: | ||
| Enable CodeQL for semantic static analysis on top of the standard security scans: | ||
|
|
||
| ```yaml | ||
| name: PR Security Scan | ||
|
|
@@ -153,16 +155,29 @@ jobs: | |
| uses: LerianStudio/github-actions-shared-workflows/.github/workflows/pr-security-scan.yml@v1.0.0 | ||
| with: | ||
| runner_type: "blacksmith-4vcpu-ubuntu-2404" | ||
| enable_docker_scout: true | ||
| enable_codeql: true | ||
| codeql_languages: 'go' | ||
| secrets: inherit | ||
| ``` | ||
|
|
||
| This will run all standard scans plus Docker Scout quickview and CVE analysis. | ||
| This will run all standard scans plus CodeQL analysis scoped to changed paths. Results are posted as a separate PR comment and uploaded to the GitHub Security tab. | ||
|
|
||
| **Requirements:** | ||
| - Docker Hub account with Scout access (Free, Team, or Business) | ||
| - `DOCKER_USERNAME` and `DOCKER_PASSWORD` secrets configured | ||
| - `enable_docker_scan` must also be `true` (default) — Scout reuses the same image built for Trivy scanning | ||
| **Supported languages:** `go`, `javascript-typescript`, `actions`, `python`, `java-kotlin`, `csharp`, `ruby`, `swift`, `cpp` | ||
|
Comment on lines
+163
to
+165
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Security-tab upload is documented as unconditional, but it is opt-in. The workflow only uploads CodeQL SARIF when Also applies to: 199-199, 547-547 🤖 Prompt for AI Agents |
||
|
|
||
| ### With Pre-release Version Gate | ||
|
|
||
| Pre-release checks are enabled by default. To disable: | ||
|
|
||
| ```yaml | ||
| jobs: | ||
| security-scan: | ||
| uses: LerianStudio/github-actions-shared-workflows/.github/workflows/pr-security-scan.yml@v1.0.0 | ||
| with: | ||
| enable_prerelease_check: false | ||
| secrets: inherit | ||
| ``` | ||
|
|
||
| When enabled, the workflow scans `go.mod`, `package.json`, and `Dockerfile` for version pins containing `-beta` or `-rc` suffixes and fails the PR if any are found. | ||
|
Comment on lines
+167
to
+180
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The prerelease gate is branch-aware, not unconditional. This section currently says the PR fails if any prerelease pins are found, but the workflow only exits non-zero on branches listed in Also applies to: 307-311 🤖 Prompt for AI Agents |
||
|
|
||
| ## Inputs | ||
|
|
||
|
|
@@ -177,7 +192,13 @@ This will run all standard scans plus Docker Scout quickview and CVE analysis. | |
| | `docker_registry` | string | `docker.io` | Docker registry URL | | ||
| | `dockerfile_name` | string | `Dockerfile` | Name of the Dockerfile | | ||
| | `enable_docker_scan` | boolean | `true` | Enable Docker image build and vulnerability scanning. Set to `false` for projects without Dockerfile (e.g., CLI tools) | | ||
| | `enable_docker_scout` | boolean | `false` | Enable Docker Scout image analysis for vulnerability scoring. Requires Docker Hub with Scout access | | ||
| | `enable_health_score` | boolean | `true` | Enable Docker Hub Health Score compliance checks (non-root user, CVEs, licenses) | | ||
| | `enable_codeql` | boolean | `false` | Enable CodeQL static analysis. Requires `codeql_languages` to be set | | ||
| | `codeql_languages` | string | `''` | Languages to analyze with CodeQL (comma-separated, e.g., `go`, `javascript-typescript`, `actions`) | | ||
| | `codeql_fail_on_findings` | boolean | `true` | Fail the workflow when CodeQL detects security issues | | ||
| | `codeql_upload_sarif` | boolean | `false` | Upload CodeQL SARIF results to the GitHub Security tab. Requires Code Security (GHAS) enabled on the repo | | ||
| | `enable_prerelease_check` | boolean | `true` | Block dependencies pinned to pre-release versions (`-beta`, `-rc`) | | ||
| | `prerelease_block_branches` | string | `release-candidate,main` | Comma-separated PR target branches where pre-release versions cause a hard failure. On other branches, findings are reported as warnings only | | ||
|
|
||
| ## Secrets | ||
|
|
||
|
|
@@ -219,14 +240,26 @@ For each component in the matrix: | |
| 1. **Docker Login**: Authenticate to registry (avoids rate limits) | ||
| 2. **Checkout Repository**: Clone the code | ||
| 3. **Setup Docker Buildx**: Enable multi-platform builds *(skipped if `enable_docker_scan: false`)* | ||
| 4. **Trivy Secret Scan (Table)**: Scan filesystem for secrets - **fails on detection** | ||
| 5. **Trivy Secret Scan (SARIF)**: Generate SARIF report | ||
| 6. **Build Docker Image**: Build image for vulnerability scanning *(skipped if `enable_docker_scan: false`)* | ||
| 7. **Trivy Vulnerability Scan (Table)**: Scan image for vulnerabilities *(skipped if `enable_docker_scan: false`)* | ||
| 8. **Trivy Vulnerability Scan (SARIF)**: Generate SARIF report *(skipped if `enable_docker_scan: false`)* | ||
| 9. **Docker Scout Analysis**: Quickview and CVE analysis *(skipped unless `enable_docker_scout: true` AND `enable_docker_scan: true`)* | ||
| 4. **Trivy Filesystem Scan**: Scan filesystem for secrets and vulnerabilities | ||
| 5. **Build Docker Image**: Build image for vulnerability scanning *(skipped if `enable_docker_scan: false`)* | ||
| 6. **Trivy Image Scan**: Scan image for vulnerabilities and licenses *(skipped if `enable_docker_scan: false`)* | ||
| 7. **Dockerfile Compliance Checks**: Non-root user and health score checks *(skipped unless `enable_health_score: true` AND `enable_docker_scan: true`)* | ||
| 8. **Pre-release Version Check**: Scan for `-beta`/`-rc` version pins *(skipped if `enable_prerelease_check: false`)* | ||
| 9. **Post Security Scan Results**: PR comment with consolidated findings | ||
|
|
||
| > **Note**: When `enable_docker_scan: false`, only filesystem scanning and pre-release checks run. | ||
|
|
||
| > **Note**: When `enable_docker_scan: false`, only filesystem secret scanning runs. This is useful for CLI tools and projects without Dockerfiles. | ||
| ### Job 3: codeql_scan *(optional)* | ||
|
|
||
| Runs when `enable_codeql: true` and `codeql_languages` is set: | ||
|
|
||
| 1. **Checkout Repository**: Clone the code | ||
| 2. **Extract Changed Paths**: Derive scoped paths from the component matrix | ||
| 3. **Generate CodeQL Config**: Scope analysis to changed paths | ||
| 4. **Initialize CodeQL**: Set up CodeQL with configured languages and query suite | ||
| 5. **Autobuild**: Automatically build the project for compiled languages | ||
| 6. **Perform CodeQL Analysis**: Run semantic analysis and upload SARIF | ||
| 7. **Post CodeQL Results**: PR comment with findings table and security gate | ||
|
|
||
| ## Security Scans | ||
|
|
||
|
|
@@ -259,6 +292,24 @@ For each component in the matrix: | |
|
|
||
| **Exit behavior**: `exit-code: 0` (informative only, doesn't fail workflow) | ||
|
|
||
| ### CodeQL Analysis | ||
|
|
||
| **What it does**: Runs GitHub CodeQL semantic analysis for security vulnerabilities and code quality issues | ||
|
|
||
| **Scope**: Automatically scoped to changed paths in the PR (via `codeql-config` composite) | ||
|
|
||
| **Query suite**: `security-extended` (default) — covers OWASP Top 10, CWE Top 25, and more | ||
|
|
||
| **Exit behavior**: Configurable via `codeql_fail_on_findings` (default: fails on findings) | ||
|
|
||
| ### Pre-release Version Gate | ||
|
|
||
| **What it does**: Scans `go.mod`, `package.json`, and `Dockerfile` for version pins containing `-beta` or `-rc` suffixes | ||
|
|
||
| **Pattern matched**: `X.Y.Z-beta.*` and `X.Y.Z-rc.*` (any semver followed by a pre-release identifier) | ||
|
|
||
| **Exit behavior**: `exit-code: 1` on branches listed in `prerelease_block_branches` (default: `release-candidate,main`). On other branches (e.g., `develop`), findings are reported as warnings only. | ||
|
|
||
| ## Monorepo Type 2 Behavior | ||
|
|
||
| ### Backend Changes | ||
|
|
@@ -493,7 +544,7 @@ Generated for each scan type: | |
| - `trivy-secret-scan-repo-{app-name}.sarif` | ||
| - `trivy-vulnerability-scan-docker-{app-name}.sarif` | ||
|
|
||
| Can be uploaded to GitHub Security tab (currently commented out in workflow). | ||
| Uploaded to GitHub Security tab via CodeQL when `enable_codeql` is enabled. | ||
|
|
||
| ## Related Workflows | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -9,12 +9,17 @@ | |
| description: 'Output directory for SARIF files' | ||
| required: false | ||
| default: '../results' | ||
| upload: | ||
| description: 'Upload SARIF to GitHub Security tab (requires Code Security / GHAS enabled on the repo)' | ||
| required: false | ||
| default: 'false' | ||
|
Comment on lines
+12
to
+15
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Line 15 defaults Suggested fix upload:
description: 'Upload SARIF to GitHub Security tab (requires Code Security / GHAS enabled on the repo)'
required: false
- default: 'false'
+ default: 'true'Also applies to: 25-25 🤖 Prompt for AI Agents |
||
|
|
||
| runs: | ||
| using: composite | ||
| steps: | ||
| - name: Perform CodeQL Analysis | ||
| uses: github/codeql-action/analyze@v4 | ||
| with: | ||
| category: ${{ inputs.category }} | ||
| output: ${{ inputs.output }} | ||
| upload: ${{ inputs.upload }} | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
Repository: LerianStudio/github-actions-shared-workflows
Length of output: 126
🏁 Script executed:
Repository: LerianStudio/github-actions-shared-workflows
Length of output: 15834
🏁 Script executed:
Repository: LerianStudio/github-actions-shared-workflows
Length of output: 70
Add validation to fail fast when CodeQL is enabled without languages.
The
codeql_scanjob condition (line 240) silently skips whenenable_codeql: truebutcodeql_languagesis empty, masking caller misconfiguration. The description correctly states the requirement, but there is no validation enforcing it. Add a validation job that runs wheninputs.enable_codeql && inputs.codeql_languages == ''and exits with a clear error about the missing language configuration.🤖 Prompt for AI Agents