@@ -48,13 +48,15 @@ type logKey struct {
48
48
}
49
49
50
50
type Tester struct {
51
- env map [string ]string // shared environment variables for running tests
52
- rnr ExecRunner // for running commands and manipulating files
53
- baseDir string // the directory in which this tester was created
54
- saKeyPath string // where sa_key.json is relative to baseDir
55
- cassettePaths map [provider.Version ]string // where cassettes are relative to baseDir by version
56
- logPaths map [logKey ]string // where logs are relative to baseDir by version and mode
57
- repoPaths map [provider.Version ]string // relative paths of already cloned repos by version
51
+ env map [string ]string // shared environment variables for running tests
52
+ rnr ExecRunner // for running commands and manipulating files
53
+ logBucket string // GCS bucket name to store logs
54
+ cassetteBucket string // GCS bucket name to store cassettes
55
+ baseDir string // the directory in which this tester was created
56
+ saKeyPath string // where sa_key.json is relative to baseDir
57
+ cassettePaths map [provider.Version ]string // where cassettes are relative to baseDir by version
58
+ logPaths map [logKey ]string // where logs are relative to baseDir by version and mode
59
+ repoPaths map [provider.Version ]string // relative paths of already cloned repos by version
58
60
}
59
61
60
62
const accTestParallelism = 32
@@ -67,19 +69,24 @@ var testResultsExpression = regexp.MustCompile(`(?m:^--- (PASS|FAIL|SKIP): (Test
67
69
var testPanicExpression = regexp .MustCompile (`^panic: .*` )
68
70
69
71
// Create a new tester in the current working directory and write the service account key file.
70
- func NewTester (env map [string ]string , rnr ExecRunner ) (* Tester , error ) {
71
- saKeyPath := "sa_key.json"
72
- if err := rnr .WriteFile (saKeyPath , env ["SA_KEY" ]); err != nil {
73
- return nil , err
72
+ func NewTester (env map [string ]string , logBucket , cassetteBucket string , rnr ExecRunner ) (* Tester , error ) {
73
+ var saKeyPath string
74
+ if saKeyVal , ok := env ["SA_KEY" ]; ok {
75
+ saKeyPath = "sa_key.json"
76
+ if err := rnr .WriteFile (saKeyPath , saKeyVal ); err != nil {
77
+ return nil , err
78
+ }
74
79
}
75
80
return & Tester {
76
- env : env ,
77
- rnr : rnr ,
78
- baseDir : rnr .GetCWD (),
79
- saKeyPath : saKeyPath ,
80
- cassettePaths : make (map [provider.Version ]string , provider .NumVersions ),
81
- logPaths : make (map [logKey ]string , provider .NumVersions * numModes ),
82
- repoPaths : make (map [provider.Version ]string , provider .NumVersions ),
81
+ env : env ,
82
+ rnr : rnr ,
83
+ logBucket : logBucket ,
84
+ cassetteBucket : cassetteBucket ,
85
+ baseDir : rnr .GetCWD (),
86
+ saKeyPath : saKeyPath ,
87
+ cassettePaths : make (map [provider.Version ]string , provider .NumVersions ),
88
+ logPaths : make (map [logKey ]string , provider .NumVersions * numModes ),
89
+ repoPaths : make (map [provider.Version ]string , provider .NumVersions ),
83
90
}, nil
84
91
}
85
92
@@ -98,19 +105,19 @@ func (vt *Tester) FetchCassettes(version provider.Version, baseBranch, prNumber
98
105
vt .rnr .Mkdir (cassettePath )
99
106
if baseBranch != "FEATURE-BRANCH-major-release-6.0.0" {
100
107
// pull main cassettes (major release uses branch specific casssettes as primary ones)
101
- bucketPath := fmt .Sprintf ("gs://ci-vcr-cassettes /%sfixtures/*" , version .BucketPath ())
108
+ bucketPath := fmt .Sprintf ("gs://%s /%sfixtures/*" , vt . cassetteBucket , version .BucketPath ())
102
109
if err := vt .fetchBucketPath (bucketPath , cassettePath ); err != nil {
103
110
fmt .Println ("Error fetching cassettes: " , err )
104
111
}
105
112
}
106
113
if baseBranch != "main" {
107
- bucketPath := fmt .Sprintf ("gs://ci-vcr-cassettes /%srefs/branches/%s/fixtures/*" , version .BucketPath (), baseBranch )
114
+ bucketPath := fmt .Sprintf ("gs://%s /%srefs/branches/%s/fixtures/*" , vt . cassetteBucket , version .BucketPath (), baseBranch )
108
115
if err := vt .fetchBucketPath (bucketPath , cassettePath ); err != nil {
109
116
fmt .Println ("Error fetching cassettes: " , err )
110
117
}
111
118
}
112
119
if prNumber != "" {
113
- bucketPath := fmt .Sprintf ("gs://ci-vcr-cassettes /%srefs/heads/auto-pr-%s/fixtures/*" , version .BucketPath (), prNumber )
120
+ bucketPath := fmt .Sprintf ("gs://%s /%srefs/heads/auto-pr-%s/fixtures/*" , vt . cassetteBucket , version .BucketPath (), prNumber )
114
121
if err := vt .fetchBucketPath (bucketPath , cassettePath ); err != nil {
115
122
fmt .Println ("Error fetching cassettes: " , err )
116
123
}
@@ -396,49 +403,93 @@ func (vt *Tester) getLogPath(mode Mode, version provider.Version) (string, error
396
403
return logPath , nil
397
404
}
398
405
399
- func (vt * Tester ) UploadLogs (logBucket , prNumber , buildID string , parallel , afterRecording bool , mode Mode , version provider.Version ) error {
400
- bucketPath := fmt .Sprintf ("gs://%s/%s/" , logBucket , version )
401
- if prNumber != "" {
402
- bucketPath += fmt .Sprintf ("refs/heads/auto-pr-%s/" , prNumber )
406
+ // UploadLogsOptions defines options for uploading logs.
407
+ type UploadLogsOptions struct {
408
+ PRNumber string
409
+ BuildID string
410
+ Parallel bool
411
+ AfterRecording bool
412
+ Mode Mode
413
+ Version provider.Version
414
+ }
415
+
416
+ // UploadLogs uploads logs to Google Cloud Storage.
417
+ func (vt * Tester ) UploadLogs (opts UploadLogsOptions ) error {
418
+ bucketPath := fmt .Sprintf ("gs://%s/%s/" , vt .logBucket , opts .Version )
419
+ if opts .PRNumber != "" {
420
+ bucketPath += fmt .Sprintf ("refs/heads/auto-pr-%s/" , opts .PRNumber )
403
421
}
404
- if buildID != "" {
405
- bucketPath += fmt .Sprintf ("artifacts/%s/" , buildID )
422
+ if opts . BuildID != "" {
423
+ bucketPath += fmt .Sprintf ("artifacts/%s/" , opts . BuildID )
406
424
}
407
- lgky := logKey {mode , version }
425
+ lgky := logKey {opts . Mode , opts . Version }
408
426
logPath , ok := vt .logPaths [lgky ]
409
427
if ! ok {
410
- return fmt .Errorf ("no log path found for mode %s and version %s" , mode .Lower (), version )
428
+ return fmt .Errorf ("no log path found for mode %s and version %s" , opts .Mode .Lower (), opts .Version )
429
+ }
430
+ args := []string {
431
+ "-h" ,
432
+ "Content-Type:text/plain" ,
433
+ "-q" ,
434
+ "cp" ,
435
+ "-r" ,
436
+ filepath .Join (vt .baseDir , "testlogs" , fmt .Sprintf ("%s_test.log" , opts .Mode .Lower ())),
437
+ bucketPath + "build-log/" ,
411
438
}
412
- args := []string {"-h" , "Content-Type:text/plain" , "-q" , "cp" , "-r" , filepath .Join (vt .baseDir , "testlogs" , fmt .Sprintf ("%s_test.log" , mode .Lower ())), bucketPath + "build-log/" }
413
439
fmt .Println ("Uploading build log:\n " , "gsutil" , strings .Join (args , " " ))
414
440
if _ , err := vt .rnr .Run ("gsutil" , args , nil ); err != nil {
415
441
fmt .Println ("Error uploading build log: " , err )
416
442
}
417
443
var suffix string
418
- if afterRecording {
444
+ if opts . AfterRecording {
419
445
suffix = "_after_recording"
420
446
}
421
- if parallel {
422
- args := []string {"-h" , "Content-Type:text/plain" , "-m" , "-q" , "cp" , "-r" , filepath .Join (vt .baseDir , "testlogs" , mode .Lower ()+ "_build" , "*" ), fmt .Sprintf ("%sbuild-log/%s_build%s/" , bucketPath , mode .Lower (), suffix )}
447
+ if opts .Parallel {
448
+ args := []string {
449
+ "-h" ,
450
+ "Content-Type:text/plain" ,
451
+ "-m" ,
452
+ "-q" ,
453
+ "cp" ,
454
+ "-r" ,
455
+ filepath .Join (vt .baseDir , "testlogs" , opts .Mode .Lower ()+ "_build" , "*" ),
456
+ fmt .Sprintf ("%sbuild-log/%s_build%s/" , bucketPath , opts .Mode .Lower (), suffix ),
457
+ }
423
458
fmt .Println ("Uploading build logs:\n " , "gsutil" , strings .Join (args , " " ))
424
459
if _ , err := vt .rnr .Run ("gsutil" , args , nil ); err != nil {
425
460
fmt .Println ("Error uploading build logs: " , err )
426
461
}
427
462
}
428
- args = []string {"-h" , "Content-Type:text/plain" , "-m" , "-q" , "cp" , "-r" , filepath .Join (logPath , "*" ), fmt .Sprintf ("%s%s%s/" , bucketPath , mode .Lower (), suffix )}
463
+ args = []string {
464
+ "-h" ,
465
+ "Content-Type:text/plain" ,
466
+ "-m" ,
467
+ "-q" ,
468
+ "cp" ,
469
+ "-r" ,
470
+ filepath .Join (logPath , "*" ),
471
+ fmt .Sprintf ("%s%s%s/" , bucketPath , opts .Mode .Lower (), suffix ),
472
+ }
429
473
fmt .Println ("Uploading logs:\n " , "gsutil" , strings .Join (args , " " ))
430
474
if _ , err := vt .rnr .Run ("gsutil" , args , nil ); err != nil {
431
475
fmt .Println ("Error uploading logs: " , err )
476
+ vt .printLogs (logPath )
432
477
}
433
478
return nil
434
479
}
435
480
436
- func (vt * Tester ) UploadCassettes (logBucket , prNumber string , version provider.Version ) error {
481
+ func (vt * Tester ) UploadCassettes (prNumber string , version provider.Version ) error {
437
482
cassettePath , ok := vt .cassettePaths [version ]
438
483
if ! ok {
439
484
return fmt .Errorf ("no cassettes found for version %s" , version )
440
485
}
441
- args := []string {"-m" , "-q" , "cp" , filepath .Join (cassettePath , "*" ), fmt .Sprintf ("gs://%s/%s/refs/heads/auto-pr-%s/fixtures/" , logBucket , version , prNumber )}
486
+ args := []string {
487
+ "-m" ,
488
+ "-q" ,
489
+ "cp" ,
490
+ filepath .Join (cassettePath , "*" ),
491
+ fmt .Sprintf ("gs://%s/%s/refs/heads/auto-pr-%s/fixtures/" , vt .cassetteBucket , version , prNumber ),
492
+ }
442
493
fmt .Println ("Uploading cassettes:\n " , "gsutil" , strings .Join (args , " " ))
443
494
if _ , err := vt .rnr .Run ("gsutil" , args , nil ); err != nil {
444
495
fmt .Println ("Error uploading cassettes: " , err )
0 commit comments