|
1 | 1 | import hudson.FilePath |
| 2 | +import java.nio.charset.* |
| 3 | +import java.nio.ByteBuffer |
| 4 | +import java.nio.CharBuffer |
| 5 | + |
| 6 | +import java.io.StringWriter |
| 7 | +import java.io.PrintWriter |
| 8 | +import hudson.model.Result |
| 9 | + |
| 10 | +out = manager.listener.logger // same as console log |
| 11 | +out.println "Post Build Groovy: Starting" |
| 12 | + |
| 13 | + |
| 14 | +// Returns only the decoded text; logs the charset used. |
| 15 | +def readWithFallback(FilePath fp) { |
| 16 | + byte[] bytes |
| 17 | + fp.read().withStream { is -> bytes = is.readAllBytes() } |
| 18 | + |
| 19 | + // Quick BOM hint |
| 20 | + String bomHint = null |
| 21 | + if (bytes.length >= 3 && bytes[0]==(byte)0xEF && bytes[1]==(byte)0xBB && bytes[2]==(byte)0xBF) bomHint = 'UTF-8' |
| 22 | + else if (bytes.length >= 2 && bytes[0]==(byte)0xFF && bytes[1]==(byte)0xFE) bomHint = 'UTF-16LE' |
| 23 | + else if (bytes.length >= 2 && bytes[0]==(byte)0xFE && bytes[1]==(byte)0xFF) bomHint = 'UTF-16BE' |
| 24 | + |
| 25 | + List<String> charsets = [ |
| 26 | + 'UTF-8', 'UTF-16LE', 'UTF-16BE', |
| 27 | + 'GB18030', 'GBK', |
| 28 | + 'windows-31j', 'Shift_JIS', 'EUC-JP', 'ISO-2022-JP', |
| 29 | + 'MS949', 'x-windows-949', 'EUC-KR', 'ISO-2022-KR', |
| 30 | + 'windows-1252', 'ISO-8859-1' |
| 31 | + ].unique() |
| 32 | + |
| 33 | + if (bomHint && charsets.contains(bomHint)) { |
| 34 | + charsets = [bomHint] + (charsets - bomHint) |
| 35 | + } |
| 36 | + |
| 37 | + for (String name : charsets) { |
| 38 | + try { |
| 39 | + Charset cs = Charset.forName(name) |
| 40 | + CharsetDecoder dec = cs.newDecoder() |
| 41 | + .onMalformedInput(CodingErrorAction.REPORT) |
| 42 | + .onUnmappableCharacter(CodingErrorAction.REPORT) |
| 43 | + CharBuffer cb = dec.decode(ByteBuffer.wrap(bytes)) |
| 44 | + out.println "Post Build Groovy: Decoded ${fp.getName()} with charset: ${name}" |
| 45 | + return cb.toString() |
| 46 | + } catch (CharacterCodingException ignore) { |
| 47 | + // try next |
| 48 | + } catch (Exception ignore) { |
| 49 | + // try next |
| 50 | + } |
| 51 | + } |
| 52 | + |
| 53 | + // Fallback: ISO-8859-1 |
| 54 | + out.println "Post Build Groovy: Fall Back Decode ${fp.getName()} with charset: ISO-8859-1 (fallback)" |
| 55 | + return new String(bytes, Charset.forName('ISO-8859-1')) |
| 56 | +} |
2 | 57 |
|
3 | 58 | Boolean buildFailed = false |
4 | 59 | Boolean buildUnstable = false |
@@ -84,55 +139,71 @@ if(manager.logContains(".*Abnormal Termination on Environment.*")) { |
84 | 139 | manager.addBadge("icon-error icon-xlg", "Abnormal Termination of at least one Environment") |
85 | 140 | } |
86 | 141 |
|
87 | | -def debugInfo = "" |
88 | | -def summaryStr = "" |
| 142 | +try { |
| 143 | + def summaryStr = "" |
89 | 144 |
|
90 | | -FilePath fp_cd = new FilePath(manager.build.getWorkspace(),'coverage_diffs.html_tmp') |
91 | | -FilePath fp_i = new FilePath(manager.build.getWorkspace(),'@PROJECT_BASE@_rebuild.html_tmp') |
92 | | -FilePath fp_f = new FilePath(manager.build.getWorkspace(),'@PROJECT_BASE@_full_report.html_tmp') |
93 | | -FilePath fp_m = new FilePath(manager.build.getWorkspace(),'@PROJECT_BASE@_metrics_report.html_tmp') |
| 145 | + FilePath fp_cd = new FilePath(manager.build.getWorkspace(),'coverage_diffs.html_tmp') |
| 146 | + FilePath fp_i = new FilePath(manager.build.getWorkspace(),'@PROJECT_BASE@_rebuild.html_tmp') |
| 147 | + FilePath fp_f = new FilePath(manager.build.getWorkspace(),'@PROJECT_BASE@_full_report.html_tmp') |
| 148 | + FilePath fp_m = new FilePath(manager.build.getWorkspace(),'@PROJECT_BASE@_metrics_report.html_tmp') |
94 | 149 |
|
95 | | -if (fp_cd.exists()) { |
96 | | - summaryStr = "<hr style=\"height:5px;border-width:0;color:gray;background-color:gray\"> " |
97 | | - summaryStr += fp_cd.readToString() |
98 | | -} |
| 150 | + if (fp_cd.exists()) { |
| 151 | + summaryStr = "<hr style=\"height:5px;border-width:0;color:gray;background-color:gray\"> " |
| 152 | + summaryStr += readWithFallback(fp_cd) |
99 | 153 |
|
100 | | -if (fp_i.exists()) { |
101 | | - summaryStr += "<hr style=\"height:5px;border-width:0;color:gray;background-color:gray\"> " |
102 | | - summaryStr += fp_i.readToString() |
103 | | -} |
| 154 | + } |
104 | 155 |
|
105 | | -if (fp_f.exists()) { |
106 | | - summaryStr += "<hr style=\"height:5px;border-width:0;color:gray;background-color:gray\"> " |
107 | | - summaryStr += fp_f.readToString() |
108 | | -} |
| 156 | + if (fp_i.exists()) { |
| 157 | + summaryStr += "<hr style=\"height:5px;border-width:0;color:gray;background-color:gray\"> " |
| 158 | + summaryStr += readWithFallback(fp_i) |
| 159 | + } |
109 | 160 |
|
110 | | -if (fp_m.exists()) |
111 | | -{ |
112 | | - summaryStr += "<hr style=\"height:5px;border-width:0;color:gray;background-color:gray\"> " |
113 | | - summaryStr += fp_m.readToString() |
| 161 | + if (fp_f.exists()) { |
| 162 | + summaryStr += "<hr style=\"height:5px;border-width:0;color:gray;background-color:gray\"> " |
| 163 | + summaryStr += readWithFallback(fp_f) |
| 164 | + } |
114 | 165 |
|
115 | | -} |
| 166 | + if (fp_m.exists()) |
| 167 | + { |
| 168 | + summaryStr += "<hr style=\"height:5px;border-width:0;color:gray;background-color:gray\"> " |
| 169 | + summaryStr += readWithFallback(fp_m) |
| 170 | + } |
116 | 171 |
|
117 | | -manager.createSummary("icon-orange-square icon-xlg").appendText(summaryStr, false) |
| 172 | + manager.createSummary("icon-orange-square icon-xlg").appendText(summaryStr, false) |
118 | 173 |
|
119 | | -if (!fp_f.exists() && !fp_m.exists()) |
120 | | -{ |
121 | | - manager.createSummary("icon-error icon-xlg").appendText("General Failure", false, false, false, "red") |
122 | | - manager.build.description = "General Failure, Incremental Build Report or Full Report Not Present. Please see the console for more information" |
123 | | - manager.addBadge("icon-error icon-xlg", "General Error") |
| 174 | + if (!fp_f.exists() && !fp_m.exists()) |
| 175 | + { |
| 176 | + manager.createSummary("icon-error icon-xlg").appendText("General Failure", false, false, false, "red") |
| 177 | + manager.build.description = "General Failure, Incremental Build Report or Full Report Not Present. Please see the console for more information" |
| 178 | + manager.addBadge("icon-error icon-xlg", "General Error") |
124 | 179 |
|
125 | | - if (!buildFailed) { |
126 | | - buildUnstable = true |
| 180 | + if (!buildFailed) { |
| 181 | + buildUnstable = true |
| 182 | + } |
127 | 183 | } |
128 | | -} |
129 | 184 |
|
130 | | -if (buildFailed) |
131 | | -{ |
132 | | - manager.buildFailure() |
133 | | -} |
134 | | -if (buildUnstable) |
135 | | -{ |
136 | | - manager.buildUnstable() |
137 | | -} |
| 185 | + if (buildFailed) |
| 186 | + { |
| 187 | + manager.buildFailure() |
| 188 | + } |
| 189 | + if (buildUnstable) |
| 190 | + { |
| 191 | + manager.buildUnstable() |
| 192 | + } |
| 193 | + |
| 194 | +} catch (Throwable t) { |
| 195 | + out.println "Post Build Groovy: Failed reading the reports" |
| 196 | + |
| 197 | + def sw = new StringWriter() |
| 198 | + t.printStackTrace(new PrintWriter(sw)) |
138 | 199 |
|
| 200 | + out.println "Post Build Groovy: ERROR: ${t.class.name}: ${t.message}" |
| 201 | + out.println sw.toString() // full stack with file/line numbers when available |
| 202 | + |
| 203 | + // Mark build as failed (or UNSTABLE if you prefer) |
| 204 | + manager.build.setResult(Result.FAILURE) |
| 205 | + |
| 206 | + // Re-throw if you want the Post Build Groovy: step itself to error out: |
| 207 | + throw t |
| 208 | +} |
| 209 | +out.println "Post Build Groovy: Complete - No errors" |
0 commit comments