@@ -50,15 +50,25 @@ const PR_TREE =
50
50
const COMMIT_TREE =
51
51
`result,url,number,${ ACTION_TREE } ,${ CHANGE_TREE } ,builtOn,` +
52
52
`subBuilds[${ BUILD_FIELDS } ]` ;
53
+ const CITGM_MAIN_TREE =
54
+ `result,url,number,${ ACTION_TREE } ,${ CHANGE_TREE } ,builtOn` ;
55
+
53
56
// com.tikal.jenkins.plugins.multijob.MultiJobBuild
54
57
const FANNED_TREE =
55
58
`result,url,number,subBuilds[phaseName,${ BUILD_FIELDS } ]` ;
59
+
56
60
// hudson.matrix.MatrixBuild
57
61
const BUILD_TREE = 'result,runs[url,number,result],builtOn' ;
58
62
const LINTER_TREE = 'result,url,number,builtOn' ;
59
63
const CAUSE_TREE = 'upstreamBuild,upstreamProject,shortDescription,_class' ;
60
64
const RUN_TREE = `actions[causes[${ CAUSE_TREE } ]],builtOn` ;
61
65
66
+ // hudson.tasks.test.MatrixTestResult
67
+
68
+ const RESULT_TREE = 'result[suites[cases[name,status]]]' ;
69
+ const CITGM_REPORT_TREE =
70
+ `failCount,skipCount,totalCount,childReports[child[url],${ RESULT_TREE } ]` ;
71
+
62
72
function getPath ( url ) {
63
73
return url . replace ( `https://${ CI_DOMAIN } /` , '' ) . replace ( 'api/json' , '' ) ;
64
74
}
@@ -133,13 +143,13 @@ class Job {
133
143
async getAPIData ( ) {
134
144
const { cli, request, path } = this ;
135
145
const url = this . apiUrl ;
136
- cli . updateSpinner ( `Querying API of ${ path } ` ) ;
146
+ cli . updateSpinner ( `Querying API for ${ path } ` ) ;
137
147
return request . json ( url ) ;
138
148
}
139
149
140
150
async getConsoleText ( ) {
141
151
const { cli, request, path } = this ;
142
- cli . updateSpinner ( `Querying console text of ${ path } ` ) ;
152
+ cli . updateSpinner ( `Querying console text for ${ path } ` ) ;
143
153
const data = await request . text ( this . consoleUrl ) ;
144
154
return data . replace ( / \r / g, '' ) ;
145
155
}
@@ -740,6 +750,102 @@ class PRBuild extends TestBuild {
740
750
}
741
751
}
742
752
753
+ class CITGMBuild extends TestBuild {
754
+ constructor ( cli , request , id ) {
755
+ const path = `job/citgm-smoker/${ id } /` ;
756
+ const tree = CITGM_MAIN_TREE ;
757
+
758
+ super ( cli , request , path , tree ) ;
759
+
760
+ this . id = id ;
761
+ }
762
+
763
+ async getResults ( ) {
764
+ let headerData ;
765
+ try {
766
+ headerData = await this . getBuildData ( ) ;
767
+ } catch ( err ) {
768
+ this . failures = [
769
+ new NCUFailure ( { url : this . apiUrl } , err . message )
770
+ ] ;
771
+ return this . failures ;
772
+ }
773
+ const { result } = headerData ;
774
+
775
+ this . setBuildData ( headerData ) ;
776
+
777
+ this . updateAPIVariables ( ) ;
778
+
779
+ let resultData ;
780
+ try {
781
+ resultData = await this . getBuildData ( ) ;
782
+ } catch ( err ) {
783
+ this . failures = [
784
+ new NCUFailure ( { url : this . apiUrl } , err . message )
785
+ ] ;
786
+ return this . failures ;
787
+ }
788
+
789
+ const { childReports } = resultData ;
790
+
791
+ this . results = this . parseResults ( childReports ) ;
792
+
793
+ return { result } ;
794
+ }
795
+
796
+ parseResults ( data ) {
797
+ const results = { passes : [ ] , failures : [ ] , skips : [ ] , fixes : [ ] } ;
798
+ data . forEach ( platform => {
799
+ const cases = flatten ( platform . result . suites [ 0 ] . cases ) ;
800
+ const nodeName = getNodeName ( platform . child . url ) ;
801
+
802
+ const passedModules = cases . filter ( c => c . status === 'PASSED' ) ;
803
+ results . passes . push ( { [ nodeName ] : passedModules } ) ;
804
+
805
+ const failedModules = cases . filter ( c => c . status === 'FAILED' ) ;
806
+ results . failures . push ( { [ nodeName ] : failedModules } ) ;
807
+
808
+ const skippedModules = cases . filter ( c => c . status === 'SKIPPED' ) ;
809
+ results . skips . push ( { [ nodeName ] : skippedModules } ) ;
810
+
811
+ const fixedModules = cases . filter ( c => c . status === 'FIXED' ) ;
812
+ results . fixes . push ( { [ nodeName ] : fixedModules } ) ;
813
+ } ) ;
814
+ return results ;
815
+ }
816
+
817
+ displayBuilds ( ) {
818
+ const { cli, results } = this ;
819
+
820
+ cli . separator ( 'Failures' ) ;
821
+ for ( const failure of results . failures ) {
822
+ const platform = Object . keys ( failure ) [ 0 ] ;
823
+ const modules = failure [ platform ] . map ( f => f . name ) ;
824
+
825
+ cli . table ( platform , `${ modules . length } Failures` , 25 ) ;
826
+ cli . write ( '\n' ) ;
827
+ cli . table ( ' ' . repeat ( 11 ) , modules . join ( '\n' + ' ' . repeat ( 11 ) ) ) ;
828
+ cli . write ( '\n\n' ) ;
829
+ }
830
+
831
+ // TODO(codebytere): how to display other builds?
832
+ }
833
+
834
+ updateAPIVariables ( ) {
835
+ this . tree = CITGM_REPORT_TREE ;
836
+ this . path = `job/citgm-smoker/${ this . id } /testReport/` ;
837
+ }
838
+
839
+ display ( ) {
840
+ this . displayHeader ( ) ;
841
+ this . displayBuilds ( ) ;
842
+ }
843
+
844
+ formatAsMarkdown ( ) {
845
+ // TODO(codebytere): implement.
846
+ }
847
+ }
848
+
743
849
function filterBuild ( builds , type ) {
744
850
return builds
745
851
. filter ( build => build . result === type )
@@ -1034,6 +1140,7 @@ module.exports = {
1034
1140
PRBuild,
1035
1141
BenchmarkRun,
1036
1142
CommitBuild,
1143
+ CITGMBuild,
1037
1144
HealthBuild,
1038
1145
jobCache,
1039
1146
parseJobFromURL,
0 commit comments