aprs.me/.github/workflows/horusec-security-scan.yml

100 lines
3 KiB
YAML

name: Horusec Security Scan
on:
push:
branches: [main]
pull_request:
branches: [main]
schedule:
- cron: "0 0 * * 0" # Weekly at midnight on Sunday
# Cancel in-progress runs when a new workflow with the same group is triggered
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
horusec-security:
name: Horusec Security Scan
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
# Cache Horusec to speed up subsequent runs
- name: Cache Horusec
uses: actions/cache@v4
with:
path: ~/.horusec
key: ${{ runner.os }}-horusec-${{ hashFiles('**/mix.lock') }}
restore-keys: |
${{ runner.os }}-horusec-
# Install Horusec CLI directly since the action isn't available
- name: Install Horusec CLI
run: |
curl -fsSL https://raw.githubusercontent.com/ZupIT/horusec/main/deployments/scripts/install.sh | bash -s latest
horusec version
- name: Running Horusec Security Scan
id: horusec
run: |
horusec start -p="./" --config-file-path="./horusec-config.json" --output-format="json" --output="./horusec-report.json" || echo "::warning::Vulnerabilities found"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# Upload security scan results as an artifact
- name: Upload Horusec Report
uses: actions/upload-artifact@v4
if: always()
with:
name: horusec-report
path: horusec-report.json
retention-days: 7
# Analyze Elixir-specific vulnerabilities with Sobelow
- name: Set up Elixir
if: always()
uses: erlef/setup-beam@v1
with:
elixir-version: "1.17.x"
otp-version: "26.x"
- name: Cache Elixir deps
if: always()
uses: actions/cache@v4
with:
path: |
deps
_build
key: ${{ runner.os }}-mix-${{ hashFiles('**/mix.lock') }}
restore-keys: |
${{ runner.os }}-mix-
- name: Install dependencies
if: always()
run: mix deps.get
- name: Run Sobelow (Elixir-specific security scan)
if: always()
run: mix sobelow --format=json --out=sobelow-report.json --exit || echo "::warning::Sobelow detected vulnerabilities"
- name: Upload Sobelow Report
uses: actions/upload-artifact@v4
if: always()
with:
name: sobelow-report
path: sobelow-report.json
retention-days: 7
# Optional: Fail the workflow if critical vulnerabilities are found
- name: Check for critical vulnerabilities
if: always()
run: |
if grep -q "CRITICAL" horusec-report.json; then
echo "Critical vulnerabilities found in the security scan!"
echo "Review the security reports in the workflow artifacts."
exit 1
fi