Skip to content
Merged
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
153 changes: 153 additions & 0 deletions .github/workflows/dependency-review-action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
# Automatically scans every PR for newly added dependencies
# Blocks merges if a dependency license is NOT in the allow-list
# Flags CVEs with moderate+ severity
# Docs: https://github.com/actions/dependency-review-action


name: Dependency Review

on:
pull_request:
branches:
- main
- master
- develop
# Only re-run when dependency manifests actually change
paths:
Comment on lines +9 to +16
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

Consider a scheduled/manual run to catch newly disclosed CVEs.

This workflow triggers on PR manifest changes, so advisories published later for unchanged dependencies won’t be surfaced here. A periodic run (or workflow_dispatch) can close that gap.

📌 Optional workflow trigger extension
 on:
+  workflow_dispatch:
+  schedule:
+    - cron: "0 3 * * 1" # weekly, Monday 03:00 UTC
   pull_request:
     branches:
       - main
       - master
       - develop
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/dependency-review-action.yml around lines 9 - 16, The
workflow currently only triggers on pull_request changes (the on: pull_request
block with branches and paths), so newly disclosed CVEs for unchanged manifests
are missed; add a periodic trigger (schedule with cron) and/or a manual trigger
(workflow_dispatch) to the on: section so the job runs regularly and can be
manually invoked to rescan dependencies and surface new advisories.

# JavaScript / TypeScript / Node
- "**/package.json"
- "**/package-lock.json"
- "**/yarn.lock"
- "**/pnpm-lock.yaml"
# Python
- "**/requirements*.txt"
- "**/Pipfile.lock"
- "**/pyproject.toml"
- "**/poetry.lock"
# Rust
- "**/Cargo.toml"
- "**/Cargo.lock"
# Go
- "**/go.mod"
- "**/go.sum"
# Java / Kotlin / Android
- "**/pom.xml"
- "**/build.gradle"
- "**/build.gradle.kts"
- "**/*.gradle"
# Ruby
- "**/Gemfile.lock"
# Docker / Infrastructure
- "**/Dockerfile"
- "**/docker-compose*.yml"
- "**/docker-compose*.yaml"
# GitHub Actions themselves
- ".github/workflows/*.yml"
- ".github/workflows/*.yaml"

permissions:
contents: read # Required to read the repo content
# pull-requests: write # Required to post review comments on the PR

jobs:
dependency-review:
name: Dependency & License Review
runs-on: ubuntu-latest

steps:
- name: Run Dependency Review
uses: actions/dependency-review-action@v4
with:
# ── VULNERABILITY SETTINGS ──────────────────────────
# Fail if any newly added dependency has a CVE at this
# severity level or above. Options: low | moderate | high | critical
fail-on-severity: moderate

# Which dependency scopes to check for vulnerabilities
# Options: runtime | development | unknown (comma-separated)
fail-on-scopes: runtime

# ── LICENSE ENFORCEMENT ─────────────────────────────
# ALLOW: Only these licenses are permitted in new dependencies.
# PRs introducing any other license will fail automatically.
# Full SPDX list: https://spdx.org/licenses/
allow-licenses: >-
MIT,
Apache-2.0,
BSD-2-Clause,
BSD-3-Clause,
ISC,
CC0-1.0,
Unlicense,
GPL-2.0-only,
GPL-2.0-or-later,
GPL-3.0-only,
GPL-3.0-or-later,
LGPL-2.0-only,
LGPL-2.0-or-later,
LGPL-2.1-only,
LGPL-2.1-or-later,
LGPL-3.0-only,
LGPL-3.0-or-later,
AGPL-3.0-only,
AGPL-3.0-or-later,
MPL-2.0,
EUPL-1.2,
Python-2.0,
PSF-2.0

# PER-PACKAGE EXCEPTIONS: Packages excluded from license checks entirely.
# Use for packages with unrecognized/non-standard license declarations.
# Format: "pkg:npm/name, pkg:pypi/name, pkg:githubactions/owner/repo@version"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems wrong.

See this:

Image

# ── Edit this list when adding approved exceptions ──
# allow-dependencies-licenses: >-
# pkg:npm/example-package,
# pkg:pypi/example-package

# ── SCOPE FILTERING ─────────────────────────────────
# Skip dev-only dependencies (test frameworks, linters, etc.)
# They are not shipped to production so risk is lower.
# Set to "all" to also scan devDependencies.
# Options: runtime | development | all
# Using "runtime" keeps noise low in template repos
# where dev deps vary wildly by project type.
# Uncomment the line below to enforce on devDeps too:
# fail-on-scopes: runtime, development
allow-ghsas: "" # Leave empty to block all known GHSAs

# ── OUTPUT & COMMENTS ────────────────────────────────
# Post a detailed summary comment directly on the PR
# comment-summary-in-pr: always

# Fail (don't just warn) on license violations.
# Change to "true" to only warn without failing.
warn-only: false

# ── VULNERABILITY DATABASE ───────────────────────────
# Use the GitHub Advisory Database (GHSA) as the source.
# This is the default; listed explicitly for clarity.
# vulnerability-check: true # default
# Add explicitly so teams know it's active
show-openssf-scorecard: true
warn-on-openssf-scorecard-level: 3

# Post a status summary badge to PR
# summarize:
# name: Post Review Summary
# runs-on: ubuntu-latest
# needs: dependency-review
# if: always()

# steps:
# - name: 📋 Summarize Result
# run: |
# if [ "${{ needs.dependency-review.result }}" == "success" ]; then
# echo "✅ Dependency review passed — no license violations or CVEs found."
# else
# echo "❌ Dependency review failed — check the PR comment for details."
# echo ""
# echo "Common fixes:"
# echo " • Replace dependencies using licenses not in allow-licenses"
# echo " • Upgrade vulnerable packages to patched versions"
# echo " • Add an explicit exception to allow-dependencies-licenses if intentional"
# fi
Loading