From bb71d9a37f75945d5cc539a22a02897c3ae9ccac Mon Sep 17 00:00:00 2001 From: Fabio Niephaus Date: Tue, 8 Nov 2022 13:58:10 +0100 Subject: [PATCH] Revise build reports and use HTML tables. --- dist/cleanup/index.js | Bin 3113545 -> 3116812 bytes dist/main/index.js | Bin 3148257 -> 3151524 bytes src/features/reports.ts | 251 +++++++++++++++++++++++++++++----------- 3 files changed, 184 insertions(+), 67 deletions(-) diff --git a/dist/cleanup/index.js b/dist/cleanup/index.js index 414de2789a2beb15d71b98361e4199ccfa6c626e..d693b2ff207dd073b6241261607e69902cc18faf 100644 GIT binary patch delta 4575 zcmbtYO>7%Q6joXw%_dNao5YR(#y{!QCElchLrWc(GzleDf0MRIs3;lR6MNJ3uC=>P zaf4+JBf)_Sr@2w6gnHlzQd9{laYUjV00|)^P8>KQE^q`=RAAIz1;9WMr_Obo!DfTpbh7Gamh5d!8L)FEAfF%tqN5 z8)trYgiWvj3$hRkvj{^h%3>_e5^Rzk{Q_GOe@DhA`QN`EeTkn6?2mB#)xPldZxT+9 z@HhV)9_Bxv!M^RmaeQ~+xP;)7wv3GZARhCGs7gVbjj43qie=IS6%D#R8{;3w@fd&P z$5JMSEMgR>H5*&aszkdL%Pi1rrGOM|T~AMwOnTbNcTs34g(7I=zxZ(^>>=}yAD>9= zBI6j=It0Xw%o>mU>l@`uN3dKs2vKibM3;!AY*MsTA_a=hRunalmT6fxEJ?b#me>;3 z${H!r+RZgopc*xZMZtR$m5E^?eH~dvig02pr)w5{+mbi*Yz-s$3yvbAqM;TxZ5fjq zn^V-dZm6~C_O1cP%KB|M!nMoiszG0UhiFAx%GcZo$2&wWRZ3Yd1kOO)_*?Am}u%<@8cnQK{iRZXPw??RrvfwJFj%#HPZoUfUE_ zH^?SQ_4f5Vh#)UVg`R%A9IF>{ZvV~^BP)2B(^Zw`EZx}E%|b&GoOL80^A>z=1iQh5 zIgO}QQ!#<-W<|A3NviK;Ly;0EH(SgQBq?@g{XC>XK{u+PyV%a;mXMRl*Q#Y|_7;Im znXLB~c}<~ez7I9MwOpiDQSYwiCKNNrVqs2O4?Nk0PwY6bq^+!;uQpun0H}9ad@zAW zX5B$vrX*Js!RZWcN11I_#hD-;<-bng174-^Y7j?+;2=L3z!P55Qvn?Gk^zmQd@X>J zUV?LB?BjO>Sn?9IHI~EpfRG;I--Ds20Ocn09Nc$Qrw&NEcAmpQ?C;Wfmg&04AE;aX zVI1zm^f}bFwZkwcR*5bCbr4TPT8Y?bqAiLvL)yf3i2o48QLlq-aHS9)_7ZG^3(^ul z6WTktcS6{&y7_zl(vml-i7n!k966^F)1;=np(%Y}6XK6TIJE4AbxZrYT`2lgZWDTt z$HLz92jIv1#e8zFG!~U2?MC{7PVzM057_)r0FNztzf{IKNqi8?_fUb~d!e{I)Uo+X1|@Fp%)=`rUU}1pe;dKaytw{X1iumj z!@Du30VsbN;gfsJgx3`@m!|-gvfHIb%*DGtd>V=3*krb9Q8Vd5KK>oTr#)N)Z3U=$ zP4DdhCbsh8g0lpJ@dZVrHJfNpFdlps?Rsmv3}c6Z^2F*Vau1?7;1#)_qBtd{t=%Kn zerY@A>Bu#a((NyG>xOC5f_p~+=6^c|JQTwrFv8jG{augh()Fe%#`|e!OoNA=r2o}|zVNJnG!IHP{C#LVc^&ebOP*VT^ delta 1494 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 Y0c92?j*>u0qRgSlD9V|!n#%n8KZ~Zmx&QzG diff --git a/src/features/reports.ts b/src/features/reports.ts index 27f48f9..23731ea 100644 --- a/src/features/reports.ts +++ b/src/features/reports.ts @@ -1,6 +1,7 @@ import * as c from '../constants' import * as core from '@actions/core' import * as fs from 'fs' +import * as github from '@actions/github' import {join} from 'path' import {tmpdir} from 'os' import {createPRComment, isPREvent, toSemVer} from '../utils' @@ -149,6 +150,7 @@ function setNativeImageOption(value: string): void { } function createReport(data: BuildOutput): string { + const context = github.context const info = data.general_info const analysis = data.analysis_results const details = data.image_details @@ -160,89 +162,204 @@ function createReport(data: BuildOutput): string { debugInfoBytes let debugInfoLine = '' if (details.debug_info) { - debugInfoLine = `\n| [Debug info](${DOCS_BASE}#glossary-debug-info) | ${bytesToHuman( - debugInfoBytes - )} | ${toPercent(debugInfoBytes, details.total_bytes)} | |` + debugInfoLine = ` + + Debug info + ${bytesToHuman(debugInfoBytes)} + ${toPercent(debugInfoBytes, details.total_bytes)} + + ` } const resources = data.resource_usage - return `## Generated \`${info.name}\` + return `## GraalVM Native Image Build Report -using [Native Image](https://www.graalvm.org/native-image/) from ${ - info.graalvm_version - } (${info.java_version}). +\`${info.name}\` generated as part of the '${ + context.job + }' job in run #${context.runNumber}. + +#### Environment + + + + + + + + + + + + + + +
GraalVM version${info.graalvm_version}C compiler${info.c_compiler}
Java version${info.java_version}Garbage collector${info.garbage_collector}
#### Analysis Results -| Category | Types | in % | Fields | in % | Methods | in % | -|:---------|------:|-----:|-------:|-----:|--------:|-----:| -| [Reachable](${DOCS_BASE}#glossary-reachability) | ${ - analysis.classes.reachable - } | ${toPercent(analysis.classes.reachable, analysis.classes.total)} | ${ - analysis.fields.reachable - } | ${toPercent(analysis.fields.reachable, analysis.fields.total)} | ${ - analysis.methods.reachable - } | ${toPercent(analysis.methods.reachable, analysis.methods.total)} | -| [Reflection](${DOCS_BASE}#glossary-reflection-registrations) | ${ - analysis.classes.reflection - } | ${toPercent(analysis.classes.reflection, analysis.classes.total)} | ${ - analysis.fields.reflection - } | ${toPercent(analysis.fields.reflection, analysis.fields.total)} | ${ - analysis.methods.reflection - } | ${toPercent(analysis.methods.reflection, analysis.methods.total)} | -| [JNI](${DOCS_BASE}#glossary-jni-access-registrations) | ${ - analysis.classes.jni - } | ${toPercent(analysis.classes.jni, analysis.classes.total)} | ${ - analysis.fields.jni - } | ${toPercent(analysis.fields.jni, analysis.fields.total)} | ${ - analysis.methods.jni - } | ${toPercent(analysis.methods.jni, analysis.methods.total)} | -| [Loaded](${DOCS_BASE}#glossary-reachability) | ${ - analysis.classes.total - } | 100.000% | ${analysis.fields.total} | 100.000% | ${ - analysis.methods.total - } | 100.000% | + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CategoryTypesin %Fieldsin %Methodsin %
Reachable${analysis.classes.reachable}${toPercent( + analysis.classes.reachable, + analysis.classes.total + )}${analysis.fields.reachable}${toPercent( + analysis.fields.reachable, + analysis.fields.total + )}${analysis.methods.reachable}${toPercent( + analysis.methods.reachable, + analysis.methods.total + )}
Reflection${analysis.classes.reflection}${toPercent( + analysis.classes.reflection, + analysis.classes.total + )}${analysis.fields.reflection}${toPercent( + analysis.fields.reflection, + analysis.fields.total + )}${analysis.methods.reflection}${toPercent( + analysis.methods.reflection, + analysis.methods.total + )}
JNI${analysis.classes.jni}${toPercent( + analysis.classes.jni, + analysis.classes.total + )}${analysis.fields.jni}${toPercent( + analysis.fields.jni, + analysis.fields.total + )}${analysis.methods.jni}${toPercent( + analysis.methods.jni, + analysis.methods.total + )}
Loaded${analysis.classes.total}100.000%${analysis.fields.total}100.000%${analysis.methods.total}100.000%
#### Image Details -| Category | Size | in % | Details | -|:---------|-----:|-----:|:--------| -| [Code area](${DOCS_BASE}#glossary-code-area)| ${bytesToHuman( - details.code_area.bytes - )} | ${toPercent(details.code_area.bytes, details.total_bytes)} | ${ - details.code_area.compilation_units - } compilation units | -| [Image heap](${DOCS_BASE}#glossary-image-heap) | ${bytesToHuman( - details.image_heap.bytes - )} | ${toPercent( - details.image_heap.bytes, - details.total_bytes - )} | ${bytesToHuman(details.image_heap.resources.bytes)} for ${ - details.image_heap.resources.count - } resources |${debugInfoLine} -| [Other data](${DOCS_BASE}#glossary-other-data) | ${bytesToHuman( - otherBytes - )} | ${toPercent(otherBytes, details.total_bytes)} | | -| Total | **${bytesToHuman(details.total_bytes)}** | 100.000% | | + + + + + + + + + + + + + + + + + + + + + + ${debugInfoLine} + + + + + + + + + + + + + +
CategorySizein %Details
Code area${bytesToHuman(details.code_area.bytes)}${toPercent( + details.code_area.bytes, + details.total_bytes + )}${ + details.code_area.compilation_units + } compilation units
Image heap${bytesToHuman(details.image_heap.bytes)}${toPercent( + details.image_heap.bytes, + details.total_bytes + )}${bytesToHuman( + details.image_heap.resources.bytes + )} for ${details.image_heap.resources.count} resources
Other data${bytesToHuman(otherBytes)}${toPercent(otherBytes, details.total_bytes)}
Total${bytesToHuman( + details.total_bytes + )}100.000%
#### Resource Usage -| Category | | -|:---------|:------| -| [GCs](${DOCS_BASE}#glossary-garbage-collections) | ${resources.garbage_collection.total_secs.toFixed( - 2 - )}s in ${resources.garbage_collection.count} GCs | -| [Peak RSS](${DOCS_BASE}#glossary-peak-rss) | ${bytesToHuman( - resources.memory.peak_rss_bytes - )} | -| [CPU load](${DOCS_BASE}#glossary-cpu-load) | ${resources.cpu.load.toFixed( - 3 - )} (${toPercent(resources.cpu.load, resources.cpu.total_cores)} of ${ + + + + + + + + + + + + + + + +
Garbage collection${resources.garbage_collection.total_secs.toFixed( + 2 + )}s in ${resources.garbage_collection.count} GCs
Peak RSS${bytesToHuman( + resources.memory.peak_rss_bytes + )} (${toPercent( + resources.memory.peak_rss_bytes, + resources.memory.system_total + )} of ${bytesToHuman(resources.memory.system_total)} system memory)
CPU load${resources.cpu.load.toFixed(3)} (${toPercent( + resources.cpu.load, resources.cpu.total_cores - } CPU cores) | + )} of ${resources.cpu.total_cores} CPU cores)
-_Report generated by [setup-graalvm](https://github.com/marketplace/actions/github-action-for-graalvm)._` +Report generated by setup-graalvm.` } function toPercent(part: number, total: number): string {