1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
| # CI/CD 流水线监控和报告生成器 awk ' BEGIN { # 流水线配置 pipeline_stages["build"] = "构建" pipeline_stages["test"] = "测试" pipeline_stages["deploy"] = "部署" pipeline_stages["verify"] = "验证" current_pipeline = "" start_time = systime() }
# 解析CI/CD日志 /^Pipeline: / { current_pipeline = $2 pipeline_start[current_pipeline] = systime() print "🚀 开始执行流水线:", current_pipeline }
/^Stage: ([a-zA-Z]+) (STARTED|FINISHED|FAILED)/ { stage = $2 status = $3 timestamp = systime() if(status == "STARTED") { stage_start[current_pipeline,stage] = timestamp print " ⏱️ 阶段开始:", pipeline_stages[stage] } else if(status == "FINISHED") { duration = timestamp - stage_start[current_pipeline,stage] stage_duration[current_pipeline,stage] = duration print " ✅ 阶段完成:", pipeline_stages[stage], "(" duration "秒)" } else if(status == "FAILED") { duration = timestamp - stage_start[current_pipeline,stage] stage_duration[current_pipeline,stage] = duration stage_failed[current_pipeline,stage] = 1 print " ❌ 阶段失败:", pipeline_stages[stage], "(" duration "秒)" } }
/^Artifact: (.+) Size: ([0-9]+) bytes/ { artifact_name = $2 artifact_size = $4 artifacts[current_pipeline,artifact_name] = artifact_size print " 📦 生成制品:", artifact_name, "(" format_bytes(artifact_size) ")" }
/^Test Results: ([0-9]+) passed, ([0-9]+) failed, ([0-9]+) skipped/ { passed = $3 failed = $5 skipped = $8 total_tests = passed + failed + skipped test_results[current_pipeline,"passed"] = passed test_results[current_pipeline,"failed"] = failed test_results[current_pipeline,"skipped"] = skipped success_rate = (total_tests > 0) ? (passed/total_tests)*100 : 0 print " 🧪 测试结果:", passed "通过,", failed "失败,", skipped "跳过" print " 📊 成功率:", sprintf("%.1f", success_rate) "%" }
END { # 生成最终报告 generate_ci_report() }
function generate_ci_report() { print "\n" "=" x 50 print "CI/CD 流水线执行报告" print "=" x 50 for(pipeline in pipeline_start) { print "\n📋 流水线:", pipeline print "开始时间:", strftime("%Y-%m-%d %H:%M:%S", pipeline_start[pipeline]) total_duration = 0 all_passed = 1 for(stage in pipeline_stages) { if((pipeline,stage) in stage_duration) { duration = stage_duration[pipeline,stage] total_duration += duration status_icon = ((pipeline,stage) in stage_failed) ? "❌" : "✅" print " " status_icon, pipeline_stages[stage] ":", duration "秒" if((pipeline,stage) in stage_failed) { all_passed = 0 } } } print "总耗时:", total_duration "秒" print "最终状态:", (all_passed ? "✅ 成功" : "❌ 失败") # 测试结果 if((pipeline,"passed") in test_results) { passed = test_results[pipeline,"passed"] failed = test_results[pipeline,"failed"] skipped = test_results[pipeline,"skipped"] total = passed + failed + skipped print "测试统计:", passed "通过,", failed "失败,", skipped "跳过" if(total > 0) { success_rate = (passed/total)*100 print "成功率:", sprintf("%.1f", success_rate) "%" } } # 制品信息 artifact_count = 0 total_size = 0 for(key in artifacts) { split(key, parts, SUBSEP) if(parts[1] == pipeline) { artifact_count++ total_size += artifacts[key] } } if(artifact_count > 0) { print "生成制品:", artifact_count "个, 总大小:", format_bytes(total_size) } } print "\n" "=" x 50 print "报告生成时间:", strftime("%Y-%m-%d %H:%M:%S") print "=" x 50 }
function format_bytes(bytes) { units[1] = "B"; units[2] = "KB"; units[3] = "MB"; units[4] = "GB" unit = 1 temp_bytes = bytes while(temp_bytes >= 1024 && unit < 4) { temp_bytes /= 1024 unit++ } return sprintf("%.1f %s", temp_bytes, units[unit]) }'
|