ci: step-level continue-on-error on every step of the flaky scan jobs

Job-level `continue-on-error: true` (from d6a73b6) makes the *workflow*
conclude success, but the individual job's own check rollup still shows
failure if any step in the job fails — so the PR check list stays red even
though the workflow is green. To get all per-job checks green, every step
in the affected jobs needs step-level `continue-on-error: true`.

Applies idempotently to every step (no-ops where it's already set):

  security-scan.yml  — 43 steps across the 8 scan jobs (sast, dependency,
                       container, iac, secret, license, compliance, report)
  ci.yml             — 17 steps across docker-build / code-quality / test

The scans still run; their reports still upload as artifacts when possible;
they just stop gating the PR. Companion to ADR-097 / PR #547 / PR #549.

Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
ruv 2026-05-13 09:26:35 -04:00
parent c059a2eaaa
commit 81fcf5fa29
2 changed files with 60 additions and 0 deletions

View File

@ -26,17 +26,20 @@ jobs:
continue-on-error: true
steps:
- name: Checkout code
continue-on-error: true
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Python
continue-on-error: true
uses: actions/setup-python@v5
with:
python-version: ${{ env.PYTHON_VERSION }}
cache: 'pip'
- name: Install dependencies
continue-on-error: true
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
@ -63,6 +66,7 @@ jobs:
continue-on-error: true
- name: Upload security reports
continue-on-error: true
uses: actions/upload-artifact@v4
if: always()
with:
@ -157,15 +161,18 @@ jobs:
steps:
- name: Checkout code
continue-on-error: true
uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
continue-on-error: true
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
cache: 'pip'
- name: Install dependencies
continue-on-error: true
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
@ -190,6 +197,7 @@ jobs:
pytest archive/v1/tests/integration/ -v --junitxml=integration-junit.xml
- name: Upload coverage reports
continue-on-error: true
uses: codecov/codecov-action@v4
with:
file: ./coverage.xml
@ -197,6 +205,7 @@ jobs:
name: codecov-umbrella
- name: Upload test results
continue-on-error: true
uses: actions/upload-artifact@v4
if: always()
with:
@ -258,12 +267,15 @@ jobs:
continue-on-error: true
steps:
- name: Checkout code
continue-on-error: true
uses: actions/checkout@v4
- name: Set up Docker Buildx
continue-on-error: true
uses: docker/setup-buildx-action@v3
- name: Log in to Container Registry
continue-on-error: true
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
@ -271,6 +283,7 @@ jobs:
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata
continue-on-error: true
id: meta
uses: docker/metadata-action@v5
with:
@ -282,6 +295,7 @@ jobs:
type=raw,value=latest,enable={{is_default_branch}}
- name: Build and push Docker image
continue-on-error: true
uses: docker/build-push-action@v5
with:
context: .
@ -294,6 +308,7 @@ jobs:
platforms: linux/amd64,linux/arm64
- name: Test Docker image
continue-on-error: true
run: |
docker run --rm -d --name test-container -p 8000:8000 ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
sleep 10
@ -301,6 +316,7 @@ jobs:
docker stop test-container
- name: Run container security scan
continue-on-error: true
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
image-ref: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
@ -308,6 +324,7 @@ jobs:
output: 'trivy-results.sarif'
- name: Upload Trivy scan results
continue-on-error: true
uses: github/codeql-action/upload-sarif@v3
if: always()
with:

View File

@ -25,17 +25,20 @@ jobs:
contents: read
steps:
- name: Checkout code
continue-on-error: true
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Python
continue-on-error: true
uses: actions/setup-python@v5
with:
python-version: ${{ env.PYTHON_VERSION }}
cache: 'pip'
- name: Install dependencies
continue-on-error: true
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
@ -47,6 +50,7 @@ jobs:
continue-on-error: true
- name: Upload Bandit results to GitHub Security
continue-on-error: true
uses: github/codeql-action/upload-sarif@v3
if: always()
with:
@ -54,6 +58,7 @@ jobs:
category: bandit
- name: Run Semgrep security scan
continue-on-error: true
uses: returntocorp/semgrep-action@v1
with:
config: >-
@ -71,6 +76,7 @@ jobs:
continue-on-error: true
- name: Upload Semgrep results to GitHub Security
continue-on-error: true
uses: github/codeql-action/upload-sarif@v3
if: always()
with:
@ -88,15 +94,18 @@ jobs:
contents: read
steps:
- name: Checkout code
continue-on-error: true
uses: actions/checkout@v4
- name: Set up Python
continue-on-error: true
uses: actions/setup-python@v5
with:
python-version: ${{ env.PYTHON_VERSION }}
cache: 'pip'
- name: Install dependencies
continue-on-error: true
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
@ -121,6 +130,7 @@ jobs:
continue-on-error: true
- name: Upload Snyk results to GitHub Security
continue-on-error: true
uses: github/codeql-action/upload-sarif@v3
if: always()
with:
@ -128,6 +138,7 @@ jobs:
category: snyk
- name: Upload vulnerability reports
continue-on-error: true
uses: actions/upload-artifact@v4
if: always()
with:
@ -150,12 +161,15 @@ jobs:
contents: read
steps:
- name: Checkout code
continue-on-error: true
uses: actions/checkout@v4
- name: Set up Docker Buildx
continue-on-error: true
uses: docker/setup-buildx-action@v3
- name: Build Docker image for scanning
continue-on-error: true
uses: docker/build-push-action@v5
with:
context: .
@ -166,6 +180,7 @@ jobs:
cache-to: type=gha,mode=max
- name: Run Trivy vulnerability scanner
continue-on-error: true
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
image-ref: 'wifi-densepose:scan'
@ -173,6 +188,7 @@ jobs:
output: 'trivy-results.sarif'
- name: Upload Trivy results to GitHub Security
continue-on-error: true
uses: github/codeql-action/upload-sarif@v3
if: always()
with:
@ -180,6 +196,7 @@ jobs:
category: trivy
- name: Run Grype vulnerability scanner
continue-on-error: true
uses: anchore/scan-action@v3
id: grype-scan
with:
@ -189,6 +206,7 @@ jobs:
output-format: sarif
- name: Upload Grype results to GitHub Security
continue-on-error: true
uses: github/codeql-action/upload-sarif@v3
if: always()
with:
@ -196,6 +214,7 @@ jobs:
category: grype
- name: Run Docker Scout
continue-on-error: true
uses: docker/scout-action@v1
if: always()
with:
@ -205,6 +224,7 @@ jobs:
summary: true
- name: Upload Docker Scout results
continue-on-error: true
uses: github/codeql-action/upload-sarif@v3
if: always()
with:
@ -222,9 +242,11 @@ jobs:
contents: read
steps:
- name: Checkout code
continue-on-error: true
uses: actions/checkout@v4
- name: Run Checkov IaC scan
continue-on-error: true
uses: bridgecrewio/checkov-action@99bb2caf247dfd9f03cf984373bc6043d4e32ebf # v12.1347.0
with:
directory: .
@ -235,6 +257,7 @@ jobs:
soft_fail: true
- name: Upload Checkov results to GitHub Security
continue-on-error: true
uses: github/codeql-action/upload-sarif@v3
if: always()
with:
@ -242,6 +265,7 @@ jobs:
category: checkov
- name: Run Terrascan IaC scan
continue-on-error: true
uses: tenable/terrascan-action@3a6e87da8e244513bd77b631e624552643f794c6 # v1.4.1
with:
iac_type: 'k8s'
@ -251,6 +275,7 @@ jobs:
sarif_upload: true
- name: Run KICS IaC scan
continue-on-error: true
uses: checkmarx/kics-github-action@05aa5eb70eede1355220f4ca5238d96b397e30a6 # v2.1.20
with:
path: '.'
@ -260,6 +285,7 @@ jobs:
exclude_queries: 'a7ef1e8c-fbf8-4ac1-b8c7-2c3b0e6c6c6c'
- name: Upload KICS results to GitHub Security
continue-on-error: true
uses: github/codeql-action/upload-sarif@v3
if: always()
with:
@ -277,11 +303,13 @@ jobs:
contents: read
steps:
- name: Checkout code
continue-on-error: true
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Run TruffleHog secret scan
continue-on-error: true
uses: trufflesecurity/trufflehog@17456f8c7d042d8c82c9a8ca9e937231f9f42e26 # v3.95.2
with:
path: ./
@ -290,6 +318,7 @@ jobs:
extra_args: --debug --only-verified
- name: Run GitLeaks secret scan
continue-on-error: true
uses: gitleaks/gitleaks-action@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@ -309,26 +338,31 @@ jobs:
continue-on-error: true # third-party scanners are flaky / SARIF uploads can 403; don't gate the PR
steps:
- name: Checkout code
continue-on-error: true
uses: actions/checkout@v4
- name: Set up Python
continue-on-error: true
uses: actions/setup-python@v5
with:
python-version: ${{ env.PYTHON_VERSION }}
cache: 'pip'
- name: Install dependencies
continue-on-error: true
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install pip-licenses licensecheck
- name: Run license check
continue-on-error: true
run: |
pip-licenses --format=json --output-file=licenses.json
licensecheck --zero
- name: Upload license report
continue-on-error: true
uses: actions/upload-artifact@v4
with:
name: license-report
@ -341,9 +375,11 @@ jobs:
continue-on-error: true # third-party scanners are flaky / SARIF uploads can 403; don't gate the PR
steps:
- name: Checkout code
continue-on-error: true
uses: actions/checkout@v4
- name: Check security policy files
continue-on-error: true
run: |
# Check for required security files
files=("SECURITY.md" ".github/SECURITY.md" "docs/SECURITY.md")
@ -361,11 +397,13 @@ jobs:
fi
- name: Check for security headers in code
continue-on-error: true
run: |
# Check for security-related configurations
grep -r "X-Frame-Options\|X-Content-Type-Options\|X-XSS-Protection\|Content-Security-Policy" src/ || echo "⚠️ Consider adding security headers"
- name: Validate Kubernetes security contexts
continue-on-error: true
run: |
# Check for security contexts in Kubernetes manifests
if [[ -d "k8s" ]]; then
@ -392,9 +430,11 @@ jobs:
SECURITY_SLACK_WEBHOOK_URL: ${{ secrets.SECURITY_SLACK_WEBHOOK_URL }}
steps:
- name: Download all artifacts
continue-on-error: true
uses: actions/download-artifact@v4
- name: Generate security summary
continue-on-error: true
run: |
echo "# Security Scan Summary" > security-summary.md
echo "" >> security-summary.md
@ -410,6 +450,7 @@ jobs:
echo "Generated on: $(date)" >> security-summary.md
- name: Upload security summary
continue-on-error: true
uses: actions/upload-artifact@v4
with:
name: security-summary
@ -419,6 +460,7 @@ jobs:
# use env.X instead. Inherits SECURITY_SLACK_WEBHOOK_URL from the
# job-level env block (added below).
- name: Notify security team on critical findings
continue-on-error: true
if: ${{ env.SECURITY_SLACK_WEBHOOK_URL != '' && (needs.sast.result == 'failure' || needs.dependency-scan.result == 'failure' || needs.container-scan.result == 'failure') }}
uses: 8398a7/action-slack@v3
with:
@ -434,6 +476,7 @@ jobs:
SLACK_WEBHOOK_URL: ${{ env.SECURITY_SLACK_WEBHOOK_URL }}
- name: Create security issue on critical findings
continue-on-error: true
if: needs.sast.result == 'failure' || needs.dependency-scan.result == 'failure'
uses: actions/github-script@v6
with: