fix: 修复原始消息日志记录器误过滤 OpenQuakeAPI 数据的问题 #252
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: 💩 屎山代码检测 | |
| on: | |
| push: | |
| branches: [ main ] | |
| pull_request: | |
| branches: [ main, master, dev/* ] | |
| jobs: | |
| shit-check: | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| pull-requests: write | |
| steps: | |
| - name: 检出代码 | |
| uses: actions/checkout@v7 | |
| - name: 下载 fuck-u-code(固定 v1.0.0-beta.1) | |
| run: | | |
| curl -fL -o fuck-u-code \ | |
| https://github.com/Done-0/fuck-u-code/releases/download/v1.0.0-beta.1/fuck-u-code-linux-amd64 | |
| chmod +x fuck-u-code | |
| ./fuck-u-code --help >/dev/null | |
| - name: 运行屎山分析 & 详细评分 | |
| id: analyze | |
| run: | | |
| # 注意:有管道时需要检查 PIPESTATUS[0],否则 analyze 失败会被 tee 掩盖成“成功” | |
| ./fuck-u-code analyze --verbose --lang zh-CN --top 10 2>&1 | tee analysis.log | |
| ANALYZE_EXIT=${PIPESTATUS[0]} | |
| # 兼容参数兜底(某些版本可能使用 zh) | |
| if [ "$ANALYZE_EXIT" -ne 0 ]; then | |
| echo "::warning::analyze(--lang zh-CN) 失败,尝试兼容参数 --lang zh" | |
| ./fuck-u-code analyze --verbose --lang zh --top 10 2>&1 | tee analysis.log | |
| ANALYZE_EXIT=${PIPESTATUS[0]} | |
| fi | |
| if [ "$ANALYZE_EXIT" -ne 0 ]; then | |
| echo "::error::fuck-u-code analyze 执行失败,请检查 analysis.log" | |
| exit "$ANALYZE_EXIT" | |
| fi | |
| # 优先使用结构化 JSON 字段,避免终端文本格式变化导致解析失败 | |
| SCORE="" | |
| if [ -f analysis.json ]; then | |
| SCORE=$(grep -oP '"overallScore"\s*:\s*\K[0-9.]+' analysis.json | head -1) | |
| fi | |
| if [ -z "$SCORE" ]; then | |
| SCORE=$(grep -oP '"overallScore"\s*:\s*\K[0-9.]+' analysis.log | head -1) | |
| fi | |
| if [ -z "$SCORE" ]; then | |
| SCORE=$(grep -oP '总体(质量)?评分[::]\s*\K[0-9.]+' analysis.log | head -1) | |
| fi | |
| if [ -z "$SCORE" ]; then | |
| SCORE=$(grep -oP '(Overall|Issue)\s*Score[::]\s*\K[0-9.]+' analysis.log | head -1) | |
| fi | |
| if [ -z "$SCORE" ]; then | |
| echo "::error::未能从 analysis.json / analysis.log 解析出分数,拒绝回退为 0 以避免误报" | |
| exit 1 | |
| fi | |
| echo "原始分数: $SCORE" | |
| # 11档精细等级(对标源码 QualityLevels) | |
| EMOJI="" | |
| STATUS="" | |
| COLOR="" | |
| DESC="" | |
| ADVICE="" # 新增:具体建议 | |
| ALLOW_MERGE="true" | |
| if (( $(echo "$SCORE < 5" | bc -l) )); then | |
| EMOJI="🌱" | |
| STATUS="清洁级" | |
| COLOR="brightgreen" | |
| DESC="代码洁净,令人赏心悦目" | |
| ADVICE="继续保持,你是编码界的一股清流,代码洁癖者的骄傲" | |
| ALLOW_MERGE="true" | |
| echo "✨ 检测结果:清洁级 - 这是艺术品,不是代码" | |
| elif (( $(echo "$SCORE < 15" | bc -l) )); then | |
| EMOJI="🌸" | |
| STATUS="微臭级" | |
| COLOR="green" | |
| DESC="基本没事,但是有伤风化" | |
| ADVICE="继续保持,你是编码界的一股清流,代码洁癖者的骄傲" | |
| ALLOW_MERGE="true" | |
| echo "🌸 检测结果:微臭级 - 空气清新,略有花香" | |
| elif (( $(echo "$SCORE < 25" | bc -l) )); then | |
| EMOJI="😐" | |
| STATUS="中等混乱" | |
| COLOR="yellowgreen" | |
| DESC="略有异味,建议适量通风" | |
| ADVICE="继续保持,你是编码界的一股清流,代码洁癖者的骄傲" | |
| ALLOW_MERGE="true" | |
| echo "😐 检测结果:中等混乱 - 青春期的代码,需要适当管教" | |
| elif (( $(echo "$SCORE < 40" | bc -l) )); then | |
| EMOJI="😷" | |
| STATUS="糟糕级" | |
| COLOR="yellow" | |
| DESC="代码开始散发气味,谨慎维护" | |
| ADVICE="这代码像个叛逆期的青少年,需要适当管教才能成才" | |
| ALLOW_MERGE="true" | |
| echo "😷 检测结果:糟糕级 - 建议戴口罩阅读" | |
| elif (( $(echo "$SCORE < 55" | bc -l) )); then | |
| # 你们在的这个档位,再细分3个子档 | |
| if (( $(echo "$SCORE < 45" | bc -l) )); then | |
| SUB="轻度" | |
| DESC="屎山刚开始发酵,臭味初显,但还能抢救" | |
| elif (( $(echo "$SCORE < 50" | bc -l) )); then | |
| SUB="中度" | |
| DESC="屎山已经形成,开窗也救不了,建议谨慎维护" | |
| else | |
| SUB="重度" | |
| DESC="屎山重度污染,维护难度陡增,重构迫在眉睫" | |
| fi | |
| EMOJI="💩" | |
| STATUS="${SUB}屎山级" | |
| COLOR="orange" | |
| ADVICE="这代码像个叛逆期的青少年,需要适当管教才能成才" | |
| ALLOW_MERGE="true" | |
| echo "💩 检测结果:${SUB}屎山级(40-54分档) - 代码开始散发不可描述的气味" | |
| elif (( $(echo "$SCORE < 65" | bc -l) )); then | |
| EMOJI="🤕" | |
| STATUS="灾难级" | |
| COLOR="red" | |
| DESC="写时一时爽,改时火葬场" | |
| ADVICE="删库跑路是唯一出路,或者封印它,等下辈子再维护" | |
| ALLOW_MERGE="false" | |
| echo "::warning::🤕 检测结果:灾难级 - 维护像打副本,建议重构" | |
| elif (( $(echo "$SCORE < 75" | bc -l) )); then | |
| EMOJI="☣️" | |
| STATUS="严重灾难" | |
| COLOR="#DC143C" # 猩红色 | |
| DESC="毒气弥漫,建议戴防毒面具" | |
| ADVICE="删库跑路是唯一出路,或者封印它,等下辈子再维护" | |
| ALLOW_MERGE="false" | |
| echo "::warning::☣️ 检测结果:严重灾难级 - 代码已成遗迹" | |
| elif (( $(echo "$SCORE < 85" | bc -l) )); then | |
| EMOJI="🧟" | |
| STATUS="非常糟糕" | |
| COLOR="#8B0000" # 深红 | |
| DESC="进去的程序员没有一个活着出来" | |
| ADVICE="删库跑路是唯一出路,或者封印它,等下辈子再维护" | |
| ALLOW_MERGE="false" | |
| echo "::error::🧟 检测结果:非常糟糕级 - 代码像僵尸,死而不僵" | |
| elif (( $(echo "$SCORE < 95" | bc -l) )); then | |
| EMOJI="☢️" | |
| STATUS="极端灾难" | |
| COLOR="purple" | |
| DESC="反人类罪行,建议火化" | |
| ADVICE="删库跑路是唯一出路,或者封印它,等下辈子再维护" | |
| ALLOW_MERGE="false" | |
| echo "::error::☢️ 检测结果:极端灾难级 - 建议放弃治疗" | |
| elif (( $(echo "$SCORE < 100" | bc -l) )); then | |
| EMOJI="🪦" | |
| STATUS="废弃级" | |
| COLOR="#4B0082" # 靛紫 | |
| DESC="历代工程师共创的遗产,无法维护" | |
| ADVICE="删库跑路是唯一出路,或者封印它,等下辈子再维护" | |
| ALLOW_MERGE="false" | |
| echo "::error::🪦 检测结果:废弃级 - 建议直接删库" | |
| else # 满分100 | |
| EMOJI="👑💩" | |
| STATUS="终极灾难" | |
| COLOR="black" | |
| DESC="写的时候热血澎湃,改的时候亲妈都不认" | |
| ADVICE="删库跑路是唯一出路,或者封印它,等下辈子再维护" | |
| ALLOW_MERGE="false" | |
| echo "::error::👑💩 检测结果:终极灾难级 - 这是艺术品,建议送博物馆" | |
| fi | |
| # 输出到环境 | |
| echo "score=$SCORE" >> $GITHUB_OUTPUT | |
| echo "status=$STATUS" >> $GITHUB_OUTPUT | |
| echo "emoji=$EMOJI" >> $GITHUB_OUTPUT | |
| echo "color=$COLOR" >> $GITHUB_OUTPUT | |
| echo "desc=$DESC" >> $GITHUB_OUTPUT | |
| echo "advice=$ADVICE" >> $GITHUB_OUTPUT | |
| echo "allow_merge=$ALLOW_MERGE" >> $GITHUB_OUTPUT | |
| # 生成带详细建议的摘要 | |
| echo "### $EMOJI 屎山检测摘要(11档精细版)" >> $GITHUB_STEP_SUMMARY | |
| echo "| 指标 | 数值 |" >> $GITHUB_STEP_SUMMARY | |
| echo "|------|------|" >> $GITHUB_STEP_SUMMARY | |
| echo "| **总体评分** | $SCORE / 100 |" >> $GITHUB_STEP_SUMMARY | |
| echo "| **屎山等级** | $STATUS |" >> $GITHUB_STEP_SUMMARY | |
| echo "| **等级描述** | $DESC |" >> $GITHUB_STEP_SUMMARY | |
| echo "| **合并建议** | $([ "$ALLOW_MERGE" == "true" ] && echo "✅ 允许" || echo "❌ 禁止") |" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "**💡 优化建议**" >> $GITHUB_STEP_SUMMARY | |
| echo "$ADVICE" >> $GITHUB_STEP_SUMMARY | |
| # 在 PR 评论里显示详细等级 | |
| - name: PR 评论(氛围版) | |
| if: github.event_name == 'pull_request' | |
| uses: actions/github-script@v9 | |
| with: | |
| script: | | |
| const score = parseFloat('${{ steps.analyze.outputs.score }}'); | |
| const status = '${{ steps.analyze.outputs.status }}'; | |
| const emoji = '${{ steps.analyze.outputs.emoji }}'; | |
| const desc = '${{ steps.analyze.outputs.desc }}'; | |
| const allowMerge = '${{ steps.analyze.outputs.allow_merge }}'; | |
| // 整体氛围评价(不针对具体代码,只谈感觉) | |
| let vibe = ''; | |
| let nextMove = ''; | |
| if (score < 10) { | |
| vibe = '如沐春风,仿佛被天使亲吻过'; | |
| } else if (score < 20) { | |
| vibe = '清新宜人,初闻像早晨的露珠'; | |
| } else if (score < 30) { | |
| vibe = '略带清香,偶尔飘过一丝酸爽'; | |
| } else if (score < 40) { | |
| vibe = '有点臭味,但还不至于熏死人'; | |
| } else if (score < 50) { | |
| vibe = '臭气扑鼻,建议佩戴口罩阅读'; | |
| } else if (score < 60) { | |
| vibe = '毒气缭绕,代码审查犹如酷刑'; | |
| } else if (score < 70) { | |
| vibe = '熏天臭气,维护者已开始咳血'; | |
| } else if (score < 80) { | |
| vibe = '生化危机,接手前请立好遗嘱'; | |
| } else if (score < 90) { | |
| vibe = '核废料现场,需穿防护服维护'; | |
| } else { | |
| vibe = '厄难级毒瘤,看一眼减寿十年'; | |
| } | |
| if (score < 30) { | |
| nextMove = '继续保持,你是编码界的一股清流,代码洁癖者的骄傲'; | |
| } else if (score < 60) { | |
| nextMove = '这代码像个叛逆期的青少年,需要适当管教才能成才'; | |
| } else { | |
| nextMove = '删库跑路是唯一出路,或者封印它,等下辈子再维护'; | |
| } | |
| const mergeBadge = allowMerge === 'true' | |
| ? '' | |
| : ''; | |
| const body = '## ' + emoji + ' 屎山代码检测报告 ' + mergeBadge + '\n\n' + | |
| '🎯 **本次检测概览**\n\n' + | |
| '> 「' + desc + '」\n\n' + | |
| '| 维度 | 数据 |\n' + | |
| '|:------|:------|\n' + | |
| '| **屎山指数** | `' + score.toFixed(2) + ' / 100` |\n' + | |
| '| **屎山等级** | **' + status + '** |\n' + | |
| '| **检测时间** | ' + new Date().toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' }) + ' |\n\n' + | |
| '### 🎭 整体印象\n' + | |
| vibe + '\n\n' + | |
| '### 🧭 下一步\n' + | |
| nextMove + '\n\n' + | |
| '---\n\n' + | |
| '**📥 详细数据**\n' + | |
| '- [查看完整分析报告](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})\n' + | |
| '- [下载 Markdown 报告](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}/artifacts)\n\n' + | |
| '*由 [fuck-u-code](https://github.com/Done-0/fuck-u-code) 自动检测 · 本评论不代表人类观点*'; | |
| // 获取现有评论 | |
| const comments = await github.rest.issues.listComments({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| issue_number: context.issue.number, | |
| }); | |
| // 查找机器人之前发的屎山检测报告评论 | |
| const botComment = comments.data.find(comment => | |
| comment.user.type === 'Bot' && | |
| comment.body.includes('屎山代码检测报告') | |
| ); | |
| if (botComment) { | |
| // 如果已有评论,更新它 | |
| await github.rest.issues.updateComment({ | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| comment_id: botComment.id, | |
| body: body | |
| }); | |
| } else { | |
| // 如果没有,创建新评论 | |
| await github.rest.issues.createComment({ | |
| issue_number: context.issue.number, | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| body: body | |
| }); | |
| } | |
| # 根据等级决定是否阻断合并(可选) | |
| - name: 门禁检查(可选) | |
| if: steps.analyze.outputs.allow_merge != 'true' | |
| run: | | |
| echo "❌ 屎山指数 ${{ steps.analyze.outputs.score }} 已达到「${{ steps.analyze.outputs.status }}」级别" | |
| echo " ${{ steps.analyze.outputs.desc }}" | |
| echo "::error::代码质量未达标,建议重构后再合并" | |
| # 需要阻断就取消下面这行的注释: | |
| # exit 1 |