Automate Compliance Scanning with GitHub Actions
· 7 min read
Learn how to integrate Juro's compliance scanning into your GitHub Actions workflow for automated, continuous compliance monitoring.
Why Automate Compliance Scanning?
Manual compliance checks are:
- Time-consuming: Require manual intervention for every code change
- Error-prone: Easy to miss violations in large codebases
- Inconsistent: Different team members may check different things
- Reactive: Issues are found after code is already merged
Automated compliance scanning with GitHub Actions provides:
- Continuous Monitoring: Every pull request and push is automatically scanned
- Consistent Results: Same checks applied to every code change
- Early Detection: Issues caught before they reach production
- Team Collaboration: Compliance status visible to all team members
Basic GitHub Actions Integration
1. Create Workflow File
Create .github/workflows/compliance.yml:
name: Compliance Check
on: [push, pull_request]
jobs:
compliance:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install Juro CLI
run: npm install -g @juro/cli
- name: Run Compliance Scan
run: |
juro scan --path ./src --rules gdpr,soc2,owasp --format json --output compliance-results.json
env:
JURO_API_KEY: ${{ secrets.JURO_API_KEY }}
- name: Upload Results
uses: actions/upload-artifact@v3
with:
name: compliance-results
path: compliance-results.json
2. Configure Secrets
Add your Juro API key to GitHub Secrets:
- Go to your repository settings
- Navigate to "Secrets and variables" → "Actions"
- Click "New repository secret"
- Name:
JURO_API_KEY - Value: Your Juro API key
3. Test the Workflow
# Push changes to trigger the workflow
git add .
git commit -m "Add compliance scanning workflow"
git push origin main
Advanced GitHub Actions Features
SARIF Integration
Upload compliance results as SARIF for GitHub Security tab:
name: Compliance Check with SARIF
on: [push, pull_request]
jobs:
compliance:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install Juro CLI
run: npm install -g @juro/cli
- name: Run Compliance Scan
run: |
juro scan --path ./src --rules gdpr,soc2,owasp --format sarif --output compliance-results.sarif
env:
JURO_API_KEY: ${{ secrets.JURO_API_KEY }}
- name: Upload SARIF results
uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: compliance-results.sarif
Pull Request Comments
Add compliance results as PR comments:
name: Compliance Check with PR Comments
on: [pull_request]
jobs:
compliance:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install Juro CLI
run: npm install -g @juro/cli
- name: Run Compliance Scan
run: |
juro scan --path ./src --rules gdpr,soc2,owasp --format json --output compliance-results.json
env:
JURO_API_KEY: ${{ secrets.JURO_API_KEY }}
- name: Comment PR
uses: actions/github-script@v6
with:
script: |
const fs = require('fs');
const results = JSON.parse(fs.readFileSync('compliance-results.json', 'utf8'));
const violations = results.violations || [];
const criticalCount = violations.filter(v => v.severity === 'critical').length;
const highCount = violations.filter(v => v.severity === 'high').length;
let comment = `## 🔍 Compliance Scan Results\n\n`;
comment += `- **Total Violations**: ${violations.length}\n`;
comment += `- **Critical**: ${criticalCount}\n`;
comment += `- **High**: ${highCount}\n\n`;
if (violations.length > 0) {
comment += `### Violations Found:\n\n`;
violations.slice(0, 10).forEach(violation => {
comment += `- **${violation.severity.toUpperCase()}**: ${violation.message}\n`;
comment += ` - File: \`${violation.file}:${violation.line}\`\n`;
comment += ` - Rule: ${violation.rule}\n\n`;
});
if (violations.length > 10) {
comment += `... and ${violations.length - 10} more violations\n\n`;
}
} else {
comment += `✅ No compliance violations found!\n`;
}
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: comment
});
Conditional Scanning
Only scan when relevant files change:
name: Smart Compliance Check
on: [push, pull_request]
jobs:
compliance:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Check for relevant changes
id: changes
uses: dorny/paths-filter@v2
with:
filters: |
src:
- 'src/**'
config:
- '**/*.config.js'
- '**/*.config.json'
- name: Setup Node.js
if: steps.changes.outputs.src == 'true' || steps.changes.outputs.config == 'true'
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install Juro CLI
if: steps.changes.outputs.src == 'true' || steps.changes.outputs.config == 'true'
run: npm install -g @juro/cli
- name: Run Compliance Scan
if: steps.changes.outputs.src == 'true' || steps.changes.outputs.config == 'true'
run: |
juro scan --path ./src --rules gdpr,soc2,owasp --format json --output compliance-results.json
env:
JURO_API_KEY: ${{ secrets.JURO_API_KEY }}