@@ -37,50 +37,73 @@ jobs:
3737 otp-version : ' 28.3'
3838
3939 - name : Clone Hypatia
40+ id : clone_hypatia
41+ continue-on-error : true
4042 run : |
4143 HYPATIA_DIR="${GITHUB_WORKSPACE}/../hypatia"
4244 if [ ! -d "$HYPATIA_DIR" ]; then
43- git clone --depth 1 https://github.com/hyperpolymath/hypatia.git "$HYPATIA_DIR"
45+ git clone --depth 1 https://github.com/hyperpolymath/hypatia.git "$HYPATIA_DIR" || {
46+ echo "::warning::Hypatia clone failed — scan will be skipped"
47+ exit 0
48+ }
4449 fi
4550 echo "HYPATIA_DIR=$HYPATIA_DIR" >> "$GITHUB_ENV"
51+ echo "hypatia_ready=true" >> "$GITHUB_OUTPUT"
4652
4753 - name : Build Hypatia scanner (if needed)
54+ if : steps.clone_hypatia.outputs.hypatia_ready == 'true'
55+ id : build_hypatia
56+ continue-on-error : true
4857 run : |
4958 cd "$HYPATIA_DIR"
5059 if [ ! -f hypatia ] && [ ! -f hypatia-v2 ]; then
5160 echo "Building hypatia-v2 scanner..."
52- mix deps.get --quiet
53- mix escript.build
61+ mix deps.get --quiet || { echo "::warning::mix deps.get failed"; exit 0; }
62+ mix escript.build || { echo "::warning::mix escript.build failed"; exit 0; }
5463 fi
64+ echo "scanner_ready=true" >> "$GITHUB_OUTPUT"
5565
5666 - name : Run Hypatia scan
5767 id : scan
68+ if : steps.build_hypatia.outputs.scanner_ready == 'true'
5869 run : |
5970 echo "Scanning repository: ${{ github.repository }}"
6071
61- # Run scanner
62- HYPATIA_FORMAT=json "$HYPATIA_DIR/hypatia-cli.sh" scan . > hypatia-findings.json || true
63-
64- # Count findings
65- FINDING_COUNT=$(jq '. | length' hypatia-findings.json 2>/dev/null || echo 0)
66- echo "findings_count=$FINDING_COUNT" >> $GITHUB_OUTPUT
67-
68- # Extract severity counts
69- CRITICAL=$(jq '[.[] | select(.severity == "critical")] | length' hypatia-findings.json)
70- HIGH=$(jq '[.[] | select(.severity == "high")] | length' hypatia-findings.json)
71- MEDIUM=$(jq '[.[] | select(.severity == "medium")] | length' hypatia-findings.json)
72-
73- echo "critical=$CRITICAL" >> $GITHUB_OUTPUT
74- echo "high=$HIGH" >> $GITHUB_OUTPUT
75- echo "medium=$MEDIUM" >> $GITHUB_OUTPUT
72+ # Run scanner — failures here must not red the check; scanner-infra
73+ # issues are tracked upstream and surface as a warning instead.
74+ HYPATIA_FORMAT=json "$HYPATIA_DIR/hypatia-cli.sh" scan . > hypatia-findings.json 2>scan-stderr.log || {
75+ echo "::warning::hypatia-cli.sh exited non-zero — see scan-stderr.log"
76+ echo "[]" > hypatia-findings.json
77+ }
78+
79+ # If the scanner wrote something that isn't a JSON array, normalise to [].
80+ if ! jq -e 'type == "array"' hypatia-findings.json >/dev/null 2>&1; then
81+ echo "::warning::hypatia-findings.json is not a JSON array — treating as empty"
82+ echo "[]" > hypatia-findings.json
83+ fi
7684
77- echo "## Hypatia Scan Results" >> $GITHUB_STEP_SUMMARY
78- echo "- Total findings: $FINDING_COUNT" >> $GITHUB_STEP_SUMMARY
79- echo "- Critical: $CRITICAL" >> $GITHUB_STEP_SUMMARY
80- echo "- High: $HIGH" >> $GITHUB_STEP_SUMMARY
81- echo "- Medium: $MEDIUM" >> $GITHUB_STEP_SUMMARY
85+ FINDING_COUNT=$(jq 'length' hypatia-findings.json 2>/dev/null || echo 0)
86+ CRITICAL=$(jq '[.[] | select(.severity == "critical")] | length' hypatia-findings.json 2>/dev/null || echo 0)
87+ HIGH=$(jq '[.[] | select(.severity == "high")] | length' hypatia-findings.json 2>/dev/null || echo 0)
88+ MEDIUM=$(jq '[.[] | select(.severity == "medium")] | length' hypatia-findings.json 2>/dev/null || echo 0)
89+
90+ {
91+ echo "findings_count=$FINDING_COUNT"
92+ echo "critical=$CRITICAL"
93+ echo "high=$HIGH"
94+ echo "medium=$MEDIUM"
95+ } >> "$GITHUB_OUTPUT"
96+
97+ {
98+ echo "## Hypatia Scan Results"
99+ echo "- Total findings: $FINDING_COUNT"
100+ echo "- Critical: $CRITICAL"
101+ echo "- High: $HIGH"
102+ echo "- Medium: $MEDIUM"
103+ } >> "$GITHUB_STEP_SUMMARY"
82104
83105 - name : Upload findings artifact
106+ if : steps.build_hypatia.outputs.scanner_ready == 'true'
84107 uses : actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
85108 with :
86109 name : hypatia-findings
@@ -89,19 +112,26 @@ jobs:
89112
90113 - name : Submit findings to gitbot-fleet (Phase 2)
91114 if : steps.scan.outputs.findings_count > 0
115+ continue-on-error : true
92116 env :
93117 GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
94118 GITHUB_REPOSITORY : ${{ github.repository }}
95119 GITHUB_SHA : ${{ github.sha }}
96120 run : |
97121 echo "📤 Submitting ${{ steps.scan.outputs.findings_count }} findings to gitbot-fleet..."
98122
99- # Clone gitbot-fleet to temp directory
123+ # Clone gitbot-fleet to temp directory. Private repo — if unauthenticated,
124+ # skip with a warning rather than failing the whole workflow.
100125 FLEET_DIR="/tmp/gitbot-fleet-$$"
101- git clone https://github.com/hyperpolymath/gitbot-fleet.git "$FLEET_DIR"
126+ if ! git clone https://github.com/hyperpolymath/gitbot-fleet.git "$FLEET_DIR" 2>/dev/null; then
127+ echo "::warning::gitbot-fleet clone failed (likely private/no auth) — skipping submission"
128+ exit 0
129+ fi
102130
103131 # Run submission script
104- bash "$FLEET_DIR/scripts/submit-finding.sh" "$(pwd)/hypatia-findings.json"
132+ bash "$FLEET_DIR/scripts/submit-finding.sh" "$(pwd)/hypatia-findings.json" || {
133+ echo "::warning::submit-finding.sh failed — see step log"
134+ }
105135
106136 # Cleanup
107137 rm -rf "$FLEET_DIR"
0 commit comments