@@ -20,34 +20,37 @@ function runBuild() {
20
20
// get a codeBuild instance from the SDK
21
21
const sdk = buildSdk ( ) ;
22
22
23
+ const inputs = githubInputs ( ) ;
24
+
25
+ const config = ( ( { updateInterval, updateBackOff } ) => ( {
26
+ updateInterval,
27
+ updateBackOff,
28
+ } ) ) ( inputs ) ;
29
+
23
30
// Get input options for startBuild
24
- const params = inputs2Parameters ( githubInputs ( ) ) ;
31
+ const params = inputs2Parameters ( inputs ) ;
25
32
26
- return build ( sdk , params ) ;
33
+ return build ( sdk , params , config ) ;
27
34
}
28
35
29
- async function build ( sdk , params ) {
36
+ async function build ( sdk , params , config ) {
30
37
// Start the build
31
38
const start = await sdk . codeBuild . startBuild ( params ) . promise ( ) ;
32
39
33
40
// Wait for the build to "complete"
34
- return waitForBuildEndTime ( sdk , start . build ) ;
41
+ return waitForBuildEndTime ( sdk , start . build , config ) ;
35
42
}
36
43
37
44
async function waitForBuildEndTime (
38
45
sdk ,
39
46
{ id, logs } ,
47
+ { updateInterval, updateBackOff } ,
40
48
seqEmptyLogs ,
41
49
totalEvents ,
42
50
throttleCount ,
43
51
nextToken
44
52
) {
45
- const {
46
- codeBuild,
47
- cloudWatchLogs,
48
- wait = 1000 * 30 ,
49
- backOff = 1000 * 15 ,
50
- } = sdk ;
53
+ const { codeBuild, cloudWatchLogs } = sdk ;
51
54
52
55
totalEvents = totalEvents || 0 ;
53
56
seqEmptyLogs = seqEmptyLogs || 0 ;
@@ -86,17 +89,21 @@ async function waitForBuildEndTime(
86
89
if ( errObject ) {
87
90
//We caught an error in trying to make the AWS api call, and are now checking to see if it was just a rate limiting error
88
91
if ( errObject . message && errObject . message . search ( "Rate exceeded" ) !== - 1 ) {
89
- //We were rate-limited, so add `backOff` seconds to the wait time
90
- let newWait = wait + backOff ;
92
+ // We were rate-limited, so add backoff with Full Jitter, ref: https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/
93
+ let jitteredBackOff = Math . floor (
94
+ Math . random ( ) * ( updateBackOff * 2 ** throttleCount )
95
+ ) ;
96
+ let newWait = updateInterval + jitteredBackOff ;
91
97
throttleCount ++ ;
92
98
93
99
//Sleep before trying again
94
100
await new Promise ( ( resolve ) => setTimeout ( resolve , newWait ) ) ;
95
101
96
102
// Try again from the same token position
97
103
return waitForBuildEndTime (
98
- { ...sdk , wait : newWait } ,
104
+ { ...sdk } ,
99
105
{ id, logs } ,
106
+ { updateInterval : newWait , updateBackOff } ,
100
107
seqEmptyLogs ,
101
108
totalEvents ,
102
109
throttleCount ,
@@ -136,13 +143,19 @@ async function waitForBuildEndTime(
136
143
// More to do: Sleep for a few seconds to avoid rate limiting
137
144
// If never throttled and build is complete, halve CWL polling delay to minimize latency
138
145
await new Promise ( ( resolve ) =>
139
- setTimeout ( resolve , current . endTime && throttleCount == 0 ? wait / 2 : wait )
146
+ setTimeout (
147
+ resolve ,
148
+ current . endTime && throttleCount == 0
149
+ ? updateInterval / 2
150
+ : updateInterval
151
+ )
140
152
) ;
141
153
142
154
// Try again
143
155
return waitForBuildEndTime (
144
156
sdk ,
145
157
current ,
158
+ { updateInterval, updateBackOff } ,
146
159
seqEmptyLogs ,
147
160
totalEvents ,
148
161
throttleCount ,
@@ -173,8 +186,9 @@ function githubInputs() {
173
186
core . getInput ( "compute-type-override" , { required : false } ) || undefined ;
174
187
175
188
const environmentTypeOverride =
176
- core . getInput ( "environment-type-override" , { required : false } ) || undefined ;
177
- const imageOverride =
189
+ core . getInput ( "environment-type-override" , { required : false } ) ||
190
+ undefined ;
191
+ const imageOverride =
178
192
core . getInput ( "image-override" , { required : false } ) || undefined ;
179
193
180
194
const envPassthrough = core
@@ -183,6 +197,17 @@ function githubInputs() {
183
197
. map ( ( i ) => i . trim ( ) )
184
198
. filter ( ( i ) => i !== "" ) ;
185
199
200
+ const updateInterval =
201
+ parseInt (
202
+ core . getInput ( "update-interval" , { required : false } ) || "30" ,
203
+ 10
204
+ ) * 1000 ;
205
+ const updateBackOff =
206
+ parseInt (
207
+ core . getInput ( "update-back-off" , { required : false } ) || "15" ,
208
+ 10
209
+ ) * 1000 ;
210
+
186
211
return {
187
212
projectName,
188
213
owner,
@@ -193,6 +218,8 @@ function githubInputs() {
193
218
environmentTypeOverride,
194
219
imageOverride,
195
220
envPassthrough,
221
+ updateInterval,
222
+ updateBackOff,
196
223
} ;
197
224
}
198
225
0 commit comments