Add CI/CD and parser modules
This commit is contained in:
134
depaudit/cicd.py
Normal file
134
depaudit/cicd.py
Normal file
@@ -0,0 +1,134 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
@dataclass
|
||||
class CICDConfig:
|
||||
provider: str
|
||||
schedule: str | None = None
|
||||
fail_on_critical: bool = True
|
||||
fail_on_high: bool = True
|
||||
fail_on_medium: bool = False
|
||||
comment_on_pr: bool = True
|
||||
include_licenses: bool = True
|
||||
include_outdated: bool = True
|
||||
include_unused: bool = False
|
||||
|
||||
|
||||
GITHUB_WORKFLOW_TEMPLATE = """name: DepAudit Security Scan
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '{schedule}'
|
||||
push:
|
||||
branches: [main, master]
|
||||
pull_request:
|
||||
branches: [main, master]
|
||||
|
||||
jobs:
|
||||
depaudit:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.11'
|
||||
|
||||
- name: Install DepAudit
|
||||
run: |
|
||||
pip install depaudit-cli
|
||||
|
||||
- name: Run DepAudit
|
||||
run: |
|
||||
depaudit . --format=json --output=depaudit-results.json
|
||||
continue-on-error: true
|
||||
|
||||
- name: Upload results
|
||||
uses: actions/upload-artifact@v4
|
||||
if: always()
|
||||
with:
|
||||
name: depaudit-results
|
||||
path: depaudit-results.json
|
||||
|
||||
- name: Comment on PR
|
||||
if: github.event_name == 'pull_request'
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const fs = require('fs');
|
||||
const results = JSON.parse(fs.readFileSync('depaudit-results.json', 'utf8'));
|
||||
const summary = results.summary || {{}};
|
||||
const comment = `
|
||||
## DepAudit Security Scan Results
|
||||
|
||||
**Vulnerabilities:**
|
||||
- Critical: ${{{{summary.total_vulnerabilities?.severity_breakdown?.critical || 0}}}}
|
||||
- High: ${{{{summary.total_vulnerabilities?.severity_breakdown?.high || 0}}}}
|
||||
- Medium: ${{{{summary.total_vulnerabilities?.severity_breakdown?.medium || 0}}}}
|
||||
- Low: ${{{{summary.total_vulnerabilities?.severity_breakdown?.low || 0}}}}
|
||||
|
||||
**Outdated Packages:** ${{{{summary.total_outdated || 0}}}}
|
||||
**License Issues:** ${{{{summary.total_license_issues || 0}}}}
|
||||
`;
|
||||
github.rest.issues.createComment({{
|
||||
issue_number: context.issue.number,
|
||||
body: comment
|
||||
}});
|
||||
"""
|
||||
|
||||
|
||||
GITLAB_CI_TEMPLATE = """stages:
|
||||
- security
|
||||
|
||||
depaudit:
|
||||
stage: security
|
||||
image: python:3.11-slim
|
||||
script:
|
||||
- pip install depaudit-cli
|
||||
- depaudit . --format=json --output=depaudit-results.json || true
|
||||
artifacts:
|
||||
reports:
|
||||
dotenv: depaudit-results.json
|
||||
rules:
|
||||
- if: $CI_PIPELINE_SOURCE == "schedule"
|
||||
- if: $CI_COMMIT_BRANCH == "main"
|
||||
- if: $CI_MERGE_REQUEST_IID
|
||||
"""
|
||||
|
||||
|
||||
def generate_github_workflow(config: CICDConfig) -> str:
|
||||
schedule = config.schedule or "0 0 * * 0"
|
||||
workflow = GITHUB_WORKFLOW_TEMPLATE.format(schedule=schedule)
|
||||
return workflow
|
||||
|
||||
|
||||
def generate_gitlab_ci(config: CICDConfig) -> str:
|
||||
return GITLAB_CI_TEMPLATE
|
||||
|
||||
|
||||
def generate_cicd_config(
|
||||
provider: str,
|
||||
output_dir: Path,
|
||||
config: CICDConfig | None = None,
|
||||
) -> Path:
|
||||
if config is None:
|
||||
config = CICDConfig(provider=provider)
|
||||
|
||||
if provider == "github":
|
||||
content = generate_github_workflow(config)
|
||||
output_path = output_dir / ".github" / "workflows" / "depaudit.yml"
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
output_path.write_text(content)
|
||||
elif provider == "gitlab":
|
||||
content = generate_gitlab_ci(config)
|
||||
output_path = output_dir / ".gitlab-ci.yml"
|
||||
output_path.write_text(content)
|
||||
else:
|
||||
raise ValueError(f"Unsupported CI/CD provider: {provider}")
|
||||
|
||||
return output_path
|
||||
Reference in New Issue
Block a user