Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 40 additions & 40 deletions .github/workflows/container-scan.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
GATE_FAIL_THRESHOLD: "8.0"
GATE_WARN_THRESHOLD: "5.0"

# SAST /Linting
# SAST / Linting
SEMGREP_CONFIG_RULESETS: >-
semgrep-rules/dockerfile
OPENGREP_SAST_SARIF_OUTPUT: sast-opengrep-dockerfile.sarif
Expand All @@ -37,7 +37,7 @@ jobs:
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3

- name: Set up Python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 #v6.2.0
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
# renovate: datasource=python-version depName=python
python-version: '3.14.4'
Expand All @@ -54,52 +54,52 @@ jobs:
run: python ci/container_scan.py --scan-type sast

- name: Run SCA scanning
if: always()
if: ${{ !cancelled() }}
run: python ci/container_scan.py --scan-type sca --image ${{ env.IMAGE_NAME }}

- name: Upload Trivy SARIF to GitHub Security tab
id: upload_trivy
if: always()
uses: github/codeql-action/upload-sarif@4e94bd11f71e507f7f87df81788dff88d1dacbfb # v4.31.2
with:
sarif_file: ${{ env.TRIVY_SCA_SARIF_OUTPUT }}
category: trivy-container-scanning

- name: Upload OSV Scanner SARIF to GitHub Security tab
id: upload_osv
if: always()
uses: github/codeql-action/upload-sarif@4e94bd11f71e507f7f87df81788dff88d1dacbfb # v4.31.2
with:
sarif_file: ${{ env.OSV_SCA_SARIF_OUTPUT }}
category: osv-scanner-container-scanning

- name: Upload OpenGrep SARIF to GitHub Security tab
id: upload_opengrep
if: always()
uses: github/codeql-action/upload-sarif@4e94bd11f71e507f7f87df81788dff88d1dacbfb # v4.31.2
with:
sarif_file: ${{ env.OPENGREP_SAST_SARIF_OUTPUT }}
category: opengrep-sast

- name: Upload Hadolint SARIF to GitHub Security tab
id: upload_hadolint
if: always()
uses: github/codeql-action/upload-sarif@4e94bd11f71e507f7f87df81788dff88d1dacbfb # v4.31.2
with:
sarif_file: ${{ env.HADOLINT_SAST_SARIF_OUTPUT }}
category: hadolint-sast

- name: Merge all SARIF reports
if: always()
if: ${{ !cancelled() }}
run: |
python ci/container_scan.py \
--merge-sarif "${{ env.TRIVY_SCA_SARIF_OUTPUT }}" "${{ env.OSV_SCA_SARIF_OUTPUT }}" "${{ env.OPENGREP_SAST_SARIF_OUTPUT }}" "${{ env.HADOLINT_SAST_SARIF_OUTPUT }}" \
--merge-output "${{ env.CONTAINER_SCAN_MERGED_SARIF_OUTPUT }}"

- name: Upload SARIF artifacts
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
- name: Upload merged SARIF to GitHub Security tab
if: ${{ !cancelled() && hashFiles(env.CONTAINER_SCAN_MERGED_SARIF_OUTPUT) != '' }}
uses: github/codeql-action/upload-sarif@4e94bd11f71e507f7f87df81788dff88d1dacbfb # v4.31.2
with:
sarif_file: ${{ env.CONTAINER_SCAN_MERGED_SARIF_OUTPUT }}
category: container-scan

# Artifact downloads are gated only by repo read access, and GitHub has no
# per-artifact permissions. Encrypt before upload, and delete the plaintext
# so no later step can publish it.
- name: Encrypt SARIF report
id: encrypt
if: ${{ !cancelled() && hashFiles(env.CONTAINER_SCAN_MERGED_SARIF_OUTPUT) != '' }}
env:
PW: ${{ secrets.ARTIFACT_PASSWORD }}
OUT: ${{ env.CONTAINER_SCAN_MERGED_SARIF_OUTPUT }}.gpg
run: |
if [ -z "$PW" ]; then
echo "::warning title=SARIF report not uploaded::ARTIFACT_PASSWORD is not available in this run (Dependabot, Renovate or fork PR). Skipping encryption and upload."
rm -f -- "$CONTAINER_SCAN_MERGED_SARIF_OUTPUT"
exit 0
fi
printf '%s' "$PW" | gpg --symmetric --batch --yes --quiet \
--pinentry-mode loopback --passphrase-fd 0 \
--no-symkey-cache \
--cipher-algo AES256 \
--s2k-mode 3 --s2k-digest-algo SHA512 --s2k-count 65011712 \
--output "$OUT" -- "$CONTAINER_SCAN_MERGED_SARIF_OUTPUT"
rm -f -- "$CONTAINER_SCAN_MERGED_SARIF_OUTPUT"
echo "encrypted=$OUT" >> "$GITHUB_OUTPUT"

- name: Upload encrypted SARIF artifact
if: ${{ !cancelled() && steps.encrypt.outputs.encrypted != '' }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: container-scan-sarif-report
path: ${{ env.CONTAINER_SCAN_MERGED_SARIF_OUTPUT }}
path: ${{ steps.encrypt.outputs.encrypted }}
retention-days: 30
if-no-files-found: error
37 changes: 29 additions & 8 deletions .github/workflows/sast.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ jobs:
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3

- name: Set up Python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 #v6.2.0
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
# renovate: datasource=python-version depName=python
python-version: '3.14.4'
Expand All @@ -38,18 +38,39 @@ jobs:
- name: Run SAST scanning
run: python ci/sast_scan.py

- name: Upload Semgrep SARIF to GitHub Security tab
id: upload_semgrep
if: always()
- name: Upload SARIF to GitHub Security tab
if: ${{ !cancelled() && hashFiles(env.OPENGREP_SARIF_OUTPUT) != '' }}
uses: github/codeql-action/upload-sarif@4e94bd11f71e507f7f87df81788dff88d1dacbfb # v4.31.2
with:
sarif_file: ${{ env.OPENGREP_SARIF_OUTPUT }}
category: semgrep-app

- name: Upload SARIF artifact
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a #v7.0.1
- name: Encrypt SARIF report
id: encrypt
if: ${{ !cancelled() && hashFiles(env.OPENGREP_SARIF_OUTPUT) != '' }}
env:
PW: ${{ secrets.ARTIFACT_PASSWORD }}
OUT: ${{ env.OPENGREP_SARIF_OUTPUT }}.gpg
run: |
if [ -z "$PW" ]; then
echo "::warning title=SARIF report not uploaded::ARTIFACT_PASSWORD is not available in this run (Dependabot, Renovate or fork PR). Skipping encryption and upload."
rm -f -- "$OPENGREP_SARIF_OUTPUT"
exit 0
fi
printf '%s' "$PW" | gpg --symmetric --batch --yes --quiet \
--pinentry-mode loopback --passphrase-fd 0 \
--no-symkey-cache \
--cipher-algo AES256 \
--s2k-mode 3 --s2k-digest-algo SHA512 --s2k-count 65011712 \
--output "$OUT" -- "$OPENGREP_SARIF_OUTPUT"
rm -f -- "$OPENGREP_SARIF_OUTPUT"
echo "encrypted=$OUT" >> "$GITHUB_OUTPUT"

- name: Upload encrypted SARIF artifact
if: ${{ !cancelled() && steps.encrypt.outputs.encrypted != '' }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: sast-scan-sarif-report
path: ${{ env.OPENGREP_SARIF_OUTPUT }}
path: ${{ steps.encrypt.outputs.encrypted }}
retention-days: 30
if-no-files-found: error
50 changes: 32 additions & 18 deletions .github/workflows/sca.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,13 @@ jobs:
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0

- name: Set up Python
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 #v6.3.0
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
with:
# renovate: datasource=python-version depName=python
python-version: '3.14.4'

- name: Cache npm packages
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 #v6.1.0
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
with:
path: ~/.npm
key: ${{ runner.os }}-npm-v1-${{ hashFiles('**/package-lock.json') }}
Expand All @@ -44,29 +44,43 @@ jobs:
- name: Setup tools and generate SBOM
run: bash ci/setup-tools.sh --install-tool trivy,osv-scanner --sbom-ecosystem npm


- name: Run SCA tools
run: python ci/sca_scan.py

- name: Upload Trivy SARIF to GitHub Security tab
id: upload_trivy
if: always()
- name: Upload merged SARIF to GitHub Security tab
if: ${{ !cancelled() && hashFiles(env.SCA_MERGED_SARIF_OUTPUT) != '' }}
uses: github/codeql-action/upload-sarif@4e94bd11f71e507f7f87df81788dff88d1dacbfb # v4.31.2
with:
sarif_file: ${{ env.TRIVY_SARIF_OUTPUT }}
category: trivy-app
sarif_file: ${{ env.SCA_MERGED_SARIF_OUTPUT }}
category: sca-app

- name: Upload OSV Scanner SARIF to GitHub Security tab
id: upload_osv
if: always()
uses: github/codeql-action/upload-sarif@4e94bd11f71e507f7f87df81788dff88d1dacbfb # v4.31.2
with:
sarif_file: ${{ env.OSV_SARIF_OUTPUT }}
category: osv-scanner-app
- name: Encrypt SARIF report
id: encrypt
if: ${{ !cancelled() && hashFiles(env.SCA_MERGED_SARIF_OUTPUT) != '' }}
env:
PW: ${{ secrets.ARTIFACT_PASSWORD }}
OUT: ${{ env.SCA_MERGED_SARIF_OUTPUT }}.gpg
run: |
if [ -z "$PW" ]; then
echo "::warning title=SARIF report not uploaded::ARTIFACT_PASSWORD is not available in this run (Dependabot, Renovate or fork PR). Skipping encryption and upload."
rm -f -- "$SCA_MERGED_SARIF_OUTPUT"
exit 0
fi
printf '%s' "$PW" | gpg --symmetric --batch --yes --quiet \
--pinentry-mode loopback --passphrase-fd 0 \
--no-symkey-cache \
--cipher-algo AES256 \
--s2k-mode 3 --s2k-digest-algo SHA512 --s2k-count 65011712 \
--output "$OUT" -- "$SCA_MERGED_SARIF_OUTPUT"
rm -f -- "$SCA_MERGED_SARIF_OUTPUT"
echo "encrypted=$OUT" >> "$GITHUB_OUTPUT"

- name: Upload SARIF artifacts
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a #v7.0.1
- name: Upload encrypted SARIF artifact
if: ${{ !cancelled() && steps.encrypt.outputs.encrypted != '' }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: sca-scan-sarif-report
path: ${{ env.SCA_MERGED_SARIF_OUTPUT }}
path: ${{ steps.encrypt.outputs.encrypted }}
retention-days: 30
if-no-files-found: error
Loading
Loading