CI/CD Health Monitor & Auto-Fix #152
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI/CD Health Monitor & Auto-Fix | |
| on: | |
| workflow_run: | |
| workflows: ["StrRay Framework CI/CD v1.0.0", "lint", "security-audit"] | |
| types: | |
| - completed | |
| schedule: | |
| # Daily health check | |
| - cron: "0 8 * * *" # Every day at 8 AM UTC | |
| workflow_dispatch: | |
| inputs: | |
| max_iterations: | |
| description: "Maximum auto-fix iterations (1-5)" | |
| required: false | |
| default: "3" | |
| type: string | |
| force_fix: | |
| description: "Force auto-fix even if healthy" | |
| required: false | |
| default: false | |
| type: boolean | |
| jobs: | |
| monitor-ci-health: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: "20" | |
| cache: "npm" | |
| - name: Install dependencies | |
| run: npm run ci-install | |
| - name: Run CI/CD Health Monitor | |
| id: monitor | |
| run: node scripts/node/github-actions-monitor.cjs --report | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| GITHUB_REPOSITORY: ${{ github.repository }} | |
| - name: Check if auto-fix needed | |
| id: check-fix | |
| run: | | |
| echo "🔍 Workflow trigger analysis:" >> $GITHUB_STEP_SUMMARY | |
| echo "Event: ${{ github.event_name }}" >> $GITHUB_STEP_SUMMARY | |
| echo "Workflow: ${{ github.event.workflow_run.name || 'N/A' }}" >> $GITHUB_STEP_SUMMARY | |
| echo "Conclusion: ${{ github.event.workflow_run.conclusion || 'N/A' }}" >> $GITHUB_STEP_SUMMARY | |
| echo "Action: ${{ github.event.action || 'N/A' }}" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| if [ -f .opencode/logs/ci-cd-monitor-report.json ]; then | |
| STATUS=$(jq -r '.ci_status' .opencode/logs/ci-cd-monitor-report.json) | |
| HEALTH_SCORE=$(jq -r '.health_score' .opencode/logs/ci-cd-monitor-report.json) | |
| ISSUE_COUNT=$(jq -r '.issues | length' .opencode/logs/ci-cd-monitor-report.json) | |
| echo "status=$STATUS" >> $GITHUB_OUTPUT | |
| echo "health_score=$HEALTH_SCORE" >> $GITHUB_OUTPUT | |
| echo "issue_count=$ISSUE_COUNT" >> $GITHUB_OUTPUT | |
| # Determine if auto-fix should run | |
| FORCE_FIX="${{ inputs.force_fix || false }}" | |
| TRIGGER_TYPE="${{ github.event_name }}" | |
| WORKFLOW_CONCLUSION="${{ github.event.workflow_run.conclusion }}" | |
| echo "Force fix: $FORCE_FIX" >> $GITHUB_STEP_SUMMARY | |
| echo "Workflow conclusion: $WORKFLOW_CONCLUSION" >> $GITHUB_STEP_SUMMARY | |
| # Only run auto-fix if workflow actually completed (not still running) | |
| if [ "$WORKFLOW_CONCLUSION" = "success" ] || [ "$WORKFLOW_CONCLUSION" = "failure" ]; then | |
| if [ "$FORCE_FIX" = "true" ] || [ "$TRIGGER_TYPE" = "workflow_run" ]; then | |
| if [ "$STATUS" = "critical" ] || [ "$STATUS" = "warning" ] || [ "$HEALTH_SCORE" -lt 80 ] || [ "$ISSUE_COUNT" -gt 0 ]; then | |
| echo "needs_fix=true" >> $GITHUB_OUTPUT | |
| echo "🔧 Auto-fix needed: Status=$STATUS, Health=$HEALTH_SCORE%, Issues=$ISSUE_COUNT" >> $GITHUB_STEP_SUMMARY | |
| else | |
| echo "needs_fix=false" >> $GITHUB_OUTPUT | |
| echo "✅ No auto-fix needed: Status=$STATUS, Health=$HEALTH_SCORE%, Issues=$ISSUE_COUNT" >> $GITHUB_STEP_SUMMARY | |
| fi | |
| else | |
| echo "needs_fix=false" >> $GITHUB_OUTPUT | |
| echo "⏭️ Skipping auto-fix: Manual trigger without force flag" >> $GITHUB_STEP_SUMMARY | |
| fi | |
| else | |
| echo "needs_fix=false" >> $GITHUB_OUTPUT | |
| echo "⏸️ Skipping auto-fix: Workflow not yet completed (conclusion: $WORKFLOW_CONCLUSION)" >> $GITHUB_STEP_SUMMARY | |
| fi | |
| else | |
| echo "needs_fix=false" >> $GITHUB_OUTPUT | |
| echo "❌ No monitoring report found" >> $GITHUB_STEP_SUMMARY | |
| fi | |
| - name: Upload monitoring report | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ci-cd-health-report | |
| path: .opencode/logs/ci-cd-monitor-report.json | |
| - name: Run CI/CD Auto-Fix | |
| if: steps.check-fix.outputs.needs_fix == 'true' && github.event.workflow_run.conclusion != 'in_progress' | |
| id: auto-fix | |
| run: node scripts/node/ci-cd-auto-fix.cjs | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| GITHUB_REPOSITORY: ${{ github.repository }} | |
| MAX_ITERATIONS: ${{ inputs.max_iterations || 3 }} | |
| - name: Auto-Fix Summary | |
| if: steps.check-fix.outputs.needs_fix == 'true' | |
| run: | | |
| echo "## CI/CD Auto-Fix Results" >> $GITHUB_STEP_SUMMARY | |
| echo "**Trigger:** ${{ github.event_name }}" >> $GITHUB_STEP_SUMMARY | |
| echo "**Health Status:** ${{ steps.check-fix.outputs.status }} (${{ steps.check-fix.outputs.health_score }}%)" >> $GITHUB_STEP_SUMMARY | |
| echo "**Issues Found:** ${{ steps.check-fix.outputs.issue_count }}" >> $GITHUB_STEP_SUMMARY | |
| echo "**Auto-Fix Applied:** Yes" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| if [ -f .opencode/logs/ci-cd-monitor-report.json ]; then | |
| echo "### Updated Health Status" >> $GITHUB_STEP_SUMMARY | |
| echo "\`\`\`json" >> $GITHUB_STEP_SUMMARY | |
| cat .opencode/logs/ci-cd-monitor-report.json >> $GITHUB_STEP_SUMMARY | |
| echo "\`\`\`" >> $GITHUB_STEP_SUMMARY | |
| fi | |
| - name: Health status notification | |
| if: failure() | |
| run: | | |
| echo "🚨 CI/CD Health Alert" | |
| echo "CI/CD pipelines may be unhealthy" | |
| echo "Check the monitoring report for details" | |
| - name: Final Summary Report | |
| run: | | |
| if [ -f .opencode/logs/ci-cd-monitor-report.json ]; then | |
| echo "## Final CI/CD Health Summary" >> $GITHUB_STEP_SUMMARY | |
| echo "\`\`\`json" >> $GITHUB_STEP_SUMMARY | |
| cat .opencode/logs/ci-cd-monitor-report.json >> $GITHUB_STEP_SUMMARY | |
| echo "\`\`\`" >> $GITHUB_STEP_SUMMARY | |
| fi |