@@ -41,7 +41,22 @@ jest.mock('aws-sdk', () => ({
41
41
} ) ) ;
42
42
43
43
const bucketName = 'my-bucket' ;
44
- const bucketObjectKey = 'actions-runner-linux.tar.gz' ;
44
+ const objectExtension : Record < string , string > = {
45
+ linux : '.tar.gz' ,
46
+ win : '.zip' ,
47
+ } ;
48
+ const bucketObjectNames : Record < string , string > = {
49
+ linux : `actions-runner-linux${ objectExtension [ 'linux' ] } ` ,
50
+ win : `actions-runner-windows${ objectExtension [ 'win' ] } ` ,
51
+ } ;
52
+
53
+ const bucketObjectKey = ( os : string ) => bucketObjectNames [ os ] ;
54
+
55
+ const runnerOs = [ [ 'linux' ] , [ 'win' ] ] ;
56
+
57
+ const latestRelease = '2.287.0' ;
58
+ const latestPreRelease = '2.287.1' ;
59
+
45
60
beforeEach ( ( ) => {
46
61
jest . clearAllMocks ( ) ;
47
62
} ) ;
@@ -51,19 +66,22 @@ jest.setTimeout(60 * 1000);
51
66
describe ( 'Synchronize action distribution.' , ( ) => {
52
67
beforeEach ( ( ) => {
53
68
process . env . S3_BUCKET_NAME = bucketName ;
54
- process . env . S3_OBJECT_KEY = bucketObjectKey ;
55
69
process . env . GITHUB_RUNNER_ALLOW_PRERELEASE_BINARIES = 'false' ;
56
70
57
71
mockOctokit . repos . listReleases . mockImplementation ( ( ) => ( {
58
72
data : listReleases ,
59
73
} ) ) ;
60
74
} ) ;
61
75
62
- it ( 'Distribution is up-to-date with latest release.' , async ( ) => {
76
+ test . each ( runnerOs ) ( '%p Distribution is up-to-date with latest release.' , async ( os ) => {
77
+ process . env . S3_OBJECT_KEY = bucketObjectKey ( os ) ;
78
+ process . env . GITHUB_RUNNER_OS = os ;
63
79
mockS3 . getObjectTagging . mockImplementation ( ( ) => {
64
80
return {
65
81
promise ( ) {
66
- return Promise . resolve ( { TagSet : [ { Key : 'name' , Value : 'actions-runner-linux-x64-2.285.1.tar.gz' } ] } ) ;
82
+ return Promise . resolve ( {
83
+ TagSet : [ { Key : 'name' , Value : `actions-runner-${ os } -x64-${ latestRelease } ${ objectExtension [ os ] } ` } ] ,
84
+ } ) ;
67
85
} ,
68
86
} ;
69
87
} ) ;
@@ -72,22 +90,52 @@ describe('Synchronize action distribution.', () => {
72
90
expect ( mockOctokit . repos . listReleases ) . toBeCalledTimes ( 1 ) ;
73
91
expect ( mockS3 . getObjectTagging ) . toBeCalledWith ( {
74
92
Bucket : bucketName ,
75
- Key : bucketObjectKey ,
93
+ Key : bucketObjectKey ( os ) ,
76
94
} ) ;
77
95
expect ( mockS3 . upload ) . toBeCalledTimes ( 0 ) ;
78
96
} ) ;
79
97
80
- it ( 'Distribution is up-to-date with latest release when there are no prereleases.' , async ( ) => {
98
+ test . each ( runnerOs ) (
99
+ '%p Distribution is up-to-date with latest release when there are no prereleases.' ,
100
+ async ( os ) => {
101
+ process . env . S3_OBJECT_KEY = bucketObjectKey ( os ) ;
102
+ process . env . GITHUB_RUNNER_OS = os ;
103
+ process . env . GITHUB_RUNNER_ALLOW_PRERELEASE_BINARIES = 'true' ;
104
+ const releases = listReleases . slice ( 1 ) ;
105
+
106
+ mockOctokit . repos . listReleases . mockImplementation ( ( ) => ( {
107
+ data : releases ,
108
+ } ) ) ;
109
+ mockS3 . getObjectTagging . mockImplementation ( ( ) => {
110
+ return {
111
+ promise ( ) {
112
+ return Promise . resolve ( {
113
+ TagSet : [ { Key : 'name' , Value : `actions-runner-${ os } -x64-${ latestRelease } ${ objectExtension [ os ] } ` } ] ,
114
+ } ) ;
115
+ } ,
116
+ } ;
117
+ } ) ;
118
+
119
+ await sync ( ) ;
120
+ expect ( mockOctokit . repos . listReleases ) . toBeCalledTimes ( 1 ) ;
121
+ expect ( mockS3 . getObjectTagging ) . toBeCalledWith ( {
122
+ Bucket : bucketName ,
123
+ Key : bucketObjectKey ( os ) ,
124
+ } ) ;
125
+ expect ( mockS3 . upload ) . toBeCalledTimes ( 0 ) ;
126
+ } ,
127
+ ) ;
128
+
129
+ test . each ( runnerOs ) ( '%p Distribution is up-to-date with latest prerelease.' , async ( os ) => {
130
+ process . env . S3_OBJECT_KEY = bucketObjectKey ( os ) ;
131
+ process . env . GITHUB_RUNNER_OS = os ;
81
132
process . env . GITHUB_RUNNER_ALLOW_PRERELEASE_BINARIES = 'true' ;
82
- const releases = listReleases . slice ( 1 ) ;
83
-
84
- mockOctokit . repos . listReleases . mockImplementation ( ( ) => ( {
85
- data : releases ,
86
- } ) ) ;
87
133
mockS3 . getObjectTagging . mockImplementation ( ( ) => {
88
134
return {
89
135
promise ( ) {
90
- return Promise . resolve ( { TagSet : [ { Key : 'name' , Value : 'actions-runner-linux-x64-2.285.1.tar.gz' } ] } ) ;
136
+ return Promise . resolve ( {
137
+ TagSet : [ { Key : 'name' , Value : `actions-runner-${ os } -x64-${ latestPreRelease } ${ objectExtension [ os ] } ` } ] ,
138
+ } ) ;
91
139
} ,
92
140
} ;
93
141
} ) ;
@@ -96,17 +144,20 @@ describe('Synchronize action distribution.', () => {
96
144
expect ( mockOctokit . repos . listReleases ) . toBeCalledTimes ( 1 ) ;
97
145
expect ( mockS3 . getObjectTagging ) . toBeCalledWith ( {
98
146
Bucket : bucketName ,
99
- Key : bucketObjectKey ,
147
+ Key : bucketObjectKey ( os ) ,
100
148
} ) ;
101
149
expect ( mockS3 . upload ) . toBeCalledTimes ( 0 ) ;
102
150
} ) ;
103
151
104
- it ( 'Distribution is up-to-date with latest prerelease.' , async ( ) => {
105
- process . env . GITHUB_RUNNER_ALLOW_PRERELEASE_BINARIES = 'true' ;
152
+ test . each ( runnerOs ) ( '%p Distribution should update to release.' , async ( os ) => {
153
+ process . env . S3_OBJECT_KEY = bucketObjectKey ( os ) ;
154
+ process . env . GITHUB_RUNNER_OS = os ;
106
155
mockS3 . getObjectTagging . mockImplementation ( ( ) => {
107
156
return {
108
157
promise ( ) {
109
- return Promise . resolve ( { TagSet : [ { Key : 'name' , Value : 'actions-runner-linux-x64-2.286.0.tar.gz' } ] } ) ;
158
+ return Promise . resolve ( {
159
+ TagSet : [ { Key : 'name' , Value : `actions-runner-${ os } -x64-0${ objectExtension [ os ] } ` } ] ,
160
+ } ) ;
110
161
} ,
111
162
} ;
112
163
} ) ;
@@ -115,32 +166,16 @@ describe('Synchronize action distribution.', () => {
115
166
expect ( mockOctokit . repos . listReleases ) . toBeCalledTimes ( 1 ) ;
116
167
expect ( mockS3 . getObjectTagging ) . toBeCalledWith ( {
117
168
Bucket : bucketName ,
118
- Key : bucketObjectKey ,
119
- } ) ;
120
- expect ( mockS3 . upload ) . toBeCalledTimes ( 0 ) ;
121
- } ) ;
122
-
123
- it ( 'Distribution should update to release.' , async ( ) => {
124
- mockS3 . getObjectTagging . mockImplementation ( ( ) => {
125
- return {
126
- promise ( ) {
127
- return Promise . resolve ( { TagSet : [ { Key : 'name' , Value : 'actions-runner-linux-x64-0.tar.gz' } ] } ) ;
128
- } ,
129
- } ;
130
- } ) ;
131
-
132
- await sync ( ) ;
133
- expect ( mockOctokit . repos . listReleases ) . toBeCalledTimes ( 1 ) ;
134
- expect ( mockS3 . getObjectTagging ) . toBeCalledWith ( {
135
- Bucket : bucketName ,
136
- Key : bucketObjectKey ,
169
+ Key : bucketObjectKey ( os ) ,
137
170
} ) ;
138
171
expect ( mockS3 . upload ) . toBeCalledTimes ( 1 ) ;
139
172
const s3JsonBody = mockS3 . upload . mock . calls [ 0 ] [ 0 ] ;
140
- expect ( s3JsonBody [ 'Tagging' ] ) . toEqual ( ' name=actions-runner-linux -x64-2.285.1.tar.gz' ) ;
173
+ expect ( s3JsonBody [ 'Tagging' ] ) . toEqual ( ` name=actions-runner-${ os } -x64-${ latestRelease } ${ objectExtension [ os ] } ` ) ;
141
174
} ) ;
142
175
143
- it ( 'Distribution should update to release if there are no pre-releases.' , async ( ) => {
176
+ test . each ( runnerOs ) ( '%p Distribution should update to release if there are no pre-releases.' , async ( os ) => {
177
+ process . env . S3_OBJECT_KEY = bucketObjectKey ( os ) ;
178
+ process . env . GITHUB_RUNNER_OS = os ;
144
179
process . env . GITHUB_RUNNER_ALLOW_PRERELEASE_BINARIES = 'true' ;
145
180
const releases = listReleases . slice ( 1 ) ;
146
181
@@ -150,7 +185,9 @@ describe('Synchronize action distribution.', () => {
150
185
mockS3 . getObjectTagging . mockImplementation ( ( ) => {
151
186
return {
152
187
promise ( ) {
153
- return Promise . resolve ( { TagSet : [ { Key : 'name' , Value : 'actions-runner-linux-x64-0.tar.gz' } ] } ) ;
188
+ return Promise . resolve ( {
189
+ TagSet : [ { Key : 'name' , Value : `actions-runner-${ os } -x64-0${ objectExtension [ os ] } ` } ] ,
190
+ } ) ;
154
191
} ,
155
192
} ;
156
193
} ) ;
@@ -159,19 +196,23 @@ describe('Synchronize action distribution.', () => {
159
196
expect ( mockOctokit . repos . listReleases ) . toBeCalledTimes ( 1 ) ;
160
197
expect ( mockS3 . getObjectTagging ) . toBeCalledWith ( {
161
198
Bucket : bucketName ,
162
- Key : bucketObjectKey ,
199
+ Key : bucketObjectKey ( os ) ,
163
200
} ) ;
164
201
expect ( mockS3 . upload ) . toBeCalledTimes ( 1 ) ;
165
202
const s3JsonBody = mockS3 . upload . mock . calls [ 0 ] [ 0 ] ;
166
- expect ( s3JsonBody [ 'Tagging' ] ) . toEqual ( ' name=actions-runner-linux -x64-2.285.1.tar.gz' ) ;
203
+ expect ( s3JsonBody [ 'Tagging' ] ) . toEqual ( ` name=actions-runner-${ os } -x64-${ latestRelease } ${ objectExtension [ os ] } ` ) ;
167
204
} ) ;
168
205
169
- it ( 'Distribution should update to prerelease.' , async ( ) => {
206
+ test . each ( runnerOs ) ( '%p Distribution should update to prerelease.' , async ( os ) => {
207
+ process . env . S3_OBJECT_KEY = bucketObjectKey ( os ) ;
208
+ process . env . GITHUB_RUNNER_OS = os ;
170
209
process . env . GITHUB_RUNNER_ALLOW_PRERELEASE_BINARIES = 'true' ;
171
210
mockS3 . getObjectTagging . mockImplementation ( ( ) => {
172
211
return {
173
212
promise ( ) {
174
- return Promise . resolve ( { TagSet : [ { Key : 'name' , Value : 'actions-runner-linux-x64-0.tar.gz' } ] } ) ;
213
+ return Promise . resolve ( {
214
+ TagSet : [ { Key : 'name' , Value : `actions-runner-${ os } -x64-0${ objectExtension [ os ] } ` } ] ,
215
+ } ) ;
175
216
} ,
176
217
} ;
177
218
} ) ;
@@ -180,14 +221,16 @@ describe('Synchronize action distribution.', () => {
180
221
expect ( mockOctokit . repos . listReleases ) . toBeCalledTimes ( 1 ) ;
181
222
expect ( mockS3 . getObjectTagging ) . toBeCalledWith ( {
182
223
Bucket : bucketName ,
183
- Key : bucketObjectKey ,
224
+ Key : bucketObjectKey ( os ) ,
184
225
} ) ;
185
226
expect ( mockS3 . upload ) . toBeCalledTimes ( 1 ) ;
186
227
const s3JsonBody = mockS3 . upload . mock . calls [ 0 ] [ 0 ] ;
187
- expect ( s3JsonBody [ 'Tagging' ] ) . toEqual ( ' name=actions-runner-linux -x64-2.286.0.tar.gz' ) ;
228
+ expect ( s3JsonBody [ 'Tagging' ] ) . toEqual ( ` name=actions-runner-${ os } -x64-${ latestPreRelease } ${ objectExtension [ os ] } ` ) ;
188
229
} ) ;
189
230
190
- it ( 'Distribution should not update to prerelease if there is a newer release.' , async ( ) => {
231
+ test . each ( runnerOs ) ( '%p Distribution should not update to prerelease if there is a newer release.' , async ( os ) => {
232
+ process . env . S3_OBJECT_KEY = bucketObjectKey ( os ) ;
233
+ process . env . GITHUB_RUNNER_OS = os ;
191
234
process . env . GITHUB_RUNNER_ALLOW_PRERELEASE_BINARIES = 'true' ;
192
235
const releases = listReleases ;
193
236
releases [ 0 ] . prerelease = false ;
@@ -199,7 +242,9 @@ describe('Synchronize action distribution.', () => {
199
242
mockS3 . getObjectTagging . mockImplementation ( ( ) => {
200
243
return {
201
244
promise ( ) {
202
- return Promise . resolve ( { TagSet : [ { Key : 'name' , Value : 'actions-runner-linux-x64-0.tar.gz' } ] } ) ;
245
+ return Promise . resolve ( {
246
+ TagSet : [ { Key : 'name' , Value : `actions-runner-${ os } -x64-0${ objectExtension [ os ] } ` } ] ,
247
+ } ) ;
203
248
} ,
204
249
} ;
205
250
} ) ;
@@ -208,14 +253,16 @@ describe('Synchronize action distribution.', () => {
208
253
expect ( mockOctokit . repos . listReleases ) . toBeCalledTimes ( 1 ) ;
209
254
expect ( mockS3 . getObjectTagging ) . toBeCalledWith ( {
210
255
Bucket : bucketName ,
211
- Key : bucketObjectKey ,
256
+ Key : bucketObjectKey ( os ) ,
212
257
} ) ;
213
258
expect ( mockS3 . upload ) . toBeCalledTimes ( 1 ) ;
214
259
const s3JsonBody = mockS3 . upload . mock . calls [ 0 ] [ 0 ] ;
215
- expect ( s3JsonBody [ 'Tagging' ] ) . toEqual ( ' name=actions-runner-linux -x64-2.286.0.tar.gz' ) ;
260
+ expect ( s3JsonBody [ 'Tagging' ] ) . toEqual ( ` name=actions-runner-${ os } -x64-${ latestPreRelease } ${ objectExtension [ os ] } ` ) ;
216
261
} ) ;
217
262
218
- it ( 'No tag in S3, distribution should update.' , async ( ) => {
263
+ test . each ( runnerOs ) ( '%p No tag in S3, distribution should update.' , async ( os ) => {
264
+ process . env . S3_OBJECT_KEY = bucketObjectKey ( os ) ;
265
+ process . env . GITHUB_RUNNER_OS = os ;
219
266
mockS3 . getObjectTagging . mockImplementation ( ( ) => {
220
267
return {
221
268
promise ( ) {
@@ -228,12 +275,14 @@ describe('Synchronize action distribution.', () => {
228
275
expect ( mockOctokit . repos . listReleases ) . toBeCalledTimes ( 1 ) ;
229
276
expect ( mockS3 . getObjectTagging ) . toBeCalledWith ( {
230
277
Bucket : bucketName ,
231
- Key : bucketObjectKey ,
278
+ Key : bucketObjectKey ( os ) ,
232
279
} ) ;
233
280
expect ( mockS3 . upload ) . toBeCalledTimes ( 1 ) ;
234
281
} ) ;
235
282
236
- it ( 'Tags, but no version, distribution should update.' , async ( ) => {
283
+ test . each ( runnerOs ) ( '%p Tags, but no version, distribution should update.' , async ( os ) => {
284
+ process . env . S3_OBJECT_KEY = bucketObjectKey ( os ) ;
285
+ process . env . GITHUB_RUNNER_OS = os ;
237
286
mockS3 . getObjectTagging . mockImplementation ( ( ) => {
238
287
return {
239
288
promise ( ) {
@@ -246,7 +295,7 @@ describe('Synchronize action distribution.', () => {
246
295
expect ( mockOctokit . repos . listReleases ) . toBeCalledTimes ( 1 ) ;
247
296
expect ( mockS3 . getObjectTagging ) . toBeCalledWith ( {
248
297
Bucket : bucketName ,
249
- Key : bucketObjectKey ,
298
+ Key : bucketObjectKey ( os ) ,
250
299
} ) ;
251
300
expect ( mockS3 . upload ) . toBeCalledTimes ( 1 ) ;
252
301
} ) ;
@@ -256,7 +305,7 @@ describe('No release assets found.', () => {
256
305
const errorMessage = 'Cannot find GitHub release asset.' ;
257
306
beforeEach ( ( ) => {
258
307
process . env . S3_BUCKET_NAME = bucketName ;
259
- process . env . S3_OBJECT_KEY = bucketObjectKey ;
308
+ process . env . S3_OBJECT_KEY = bucketObjectKey ( 'linux' ) ;
260
309
} ) ;
261
310
262
311
it ( 'Empty list of assets.' , async ( ) => {
@@ -267,7 +316,9 @@ describe('No release assets found.', () => {
267
316
await expect ( sync ( ) ) . rejects . toThrow ( errorMessage ) ;
268
317
} ) ;
269
318
270
- it ( 'No linux x64 asset.' , async ( ) => {
319
+ test . each ( runnerOs ) ( 'No %p x64 asset.' , async ( os ) => {
320
+ process . env . S3_OBJECT_KEY = bucketObjectKey ( os ) ;
321
+ process . env . GITHUB_RUNNER_OS = os ;
271
322
mockOctokit . repos . listReleases . mockImplementation ( ( ) => ( {
272
323
data : [ listReleasesNoLinux ] ,
273
324
} ) ) ;
@@ -293,7 +344,7 @@ describe('Invalid config', () => {
293
344
} ) ;
294
345
it ( 'No bucket.' , async ( ) => {
295
346
delete process . env . S3_BUCKET_NAME ;
296
- process . env . S3_OBJECT_KEY = bucketObjectKey ;
347
+ process . env . S3_OBJECT_KEY = bucketObjectKey ( 'linux' ) ;
297
348
await expect ( sync ( ) ) . rejects . toThrow ( errorMessage ) ;
298
349
} ) ;
299
350
it ( 'No object key.' , async ( ) => {
@@ -307,35 +358,16 @@ describe('Synchronize action distribution for arm64.', () => {
307
358
const errorMessage = 'Cannot find GitHub release asset.' ;
308
359
beforeEach ( ( ) => {
309
360
process . env . S3_BUCKET_NAME = bucketName ;
310
- process . env . S3_OBJECT_KEY = bucketObjectKey ;
311
361
process . env . GITHUB_RUNNER_ARCHITECTURE = 'arm64' ;
312
362
} ) ;
313
363
314
- it ( 'No linux arm64 asset.' , async ( ) => {
364
+ test . each ( runnerOs ) ( 'No %p arm64 asset.' , async ( os ) => {
365
+ process . env . S3_OBJECT_KEY = bucketObjectKey ( os ) ;
366
+ process . env . GITHUB_RUNNER_OS = os ;
315
367
mockOctokit . repos . listReleases . mockImplementation ( ( ) => ( {
316
368
data : [ listReleasesNoArm64 ] ,
317
369
} ) ) ;
318
370
319
371
await expect ( sync ( ) ) . rejects . toThrow ( errorMessage ) ;
320
372
} ) ;
321
373
} ) ;
322
-
323
- describe ( 'Synchronize action distribution for windows.' , ( ) => {
324
- const errorMessage = 'Cannot find GitHub release asset.' ;
325
- beforeEach ( ( ) => {
326
- process . env . S3_BUCKET_NAME = bucketName ;
327
- process . env . S3_OBJECT_KEY = bucketObjectKey ;
328
- process . env . GITHUB_RUNNER_OS = 'win' ;
329
- } ) ;
330
-
331
- it ( 'No win asset.' , async ( ) => {
332
- mockOctokit . repos . listReleases . mockImplementation ( ( ) => ( {
333
- data : listReleases . map ( ( release ) => ( {
334
- ...release ,
335
- assets : release . assets . filter ( ( asset ) => ! asset . name . includes ( 'win' ) ) ,
336
- } ) ) ,
337
- } ) ) ;
338
-
339
- await expect ( sync ( ) ) . rejects . toThrow ( errorMessage ) ;
340
- } ) ;
341
- } ) ;
0 commit comments