@@ -5,7 +5,7 @@ const github = require('@actions/github');
5
5
const glob = require ( 'glob' ) ;
6
6
7
7
function sleep ( milliseconds ) {
8
- return new Promise ( resolve => setTimeout ( resolve , milliseconds ) )
8
+ return new Promise ( resolve => setTimeout ( resolve , milliseconds ) ) ;
9
9
}
10
10
11
11
async function runOnce ( ) {
@@ -20,9 +20,8 @@ async function runOnce() {
20
20
21
21
core . info ( `files: ${ files } ` ) ;
22
22
core . info ( `name: ${ name } ` ) ;
23
- core . info ( `token: ${ token } ` ) ;
24
23
25
- const octokit = new github . GitHub ( token ) ;
24
+ const octokit = github . getOctokit ( token ) ;
26
25
27
26
// Delete the previous release since we can't overwrite one. This may happen
28
27
// due to retrying an upload or it may happen because we're doing the dev
@@ -34,24 +33,24 @@ async function runOnce() {
34
33
}
35
34
const release_id = release . id ;
36
35
core . info ( `deleting release ${ release_id } ` ) ;
37
- await octokit . repos . deleteRelease ( { owner, repo, release_id } ) ;
36
+ await octokit . rest . repos . deleteRelease ( { owner, repo, release_id } ) ;
38
37
}
39
38
40
39
// We also need to update the `dev` tag while we're at it on the `dev` branch.
41
40
if ( name == 'nightly' ) {
42
41
try {
43
42
core . info ( `updating nightly tag` ) ;
44
- await octokit . git . updateRef ( {
45
- owner,
46
- repo,
47
- ref : 'tags/nightly' ,
48
- sha,
49
- force : true ,
43
+ await octokit . rest . git . updateRef ( {
44
+ owner,
45
+ repo,
46
+ ref : 'tags/nightly' ,
47
+ sha,
48
+ force : true ,
50
49
} ) ;
51
50
} catch ( e ) {
52
- console . log ( "ERROR: " , JSON . stringify ( e , null , 2 ) ) ;
51
+ core . error ( e ) ;
53
52
core . info ( `creating nightly tag` ) ;
54
- await octokit . git . createTag ( {
53
+ await octokit . rest . git . createTag ( {
55
54
owner,
56
55
repo,
57
56
tag : 'nightly' ,
@@ -65,55 +64,76 @@ async function runOnce() {
65
64
// Creates an official GitHub release for this `tag`, and if this is `dev`
66
65
// then we know that from the previous block this should be a fresh release.
67
66
core . info ( `creating a release` ) ;
68
- const release = await octokit . repos . createRelease ( {
67
+ const release = await octokit . rest . repos . createRelease ( {
69
68
owner,
70
69
repo,
71
70
name,
72
71
tag_name : name ,
73
72
target_commitish : sha ,
74
73
prerelease : name === 'nightly' ,
75
74
} ) ;
75
+ const release_id = release . data . id ;
76
76
77
77
// Upload all the relevant assets for this release as just general blobs.
78
78
for ( const file of glob . sync ( files ) ) {
79
79
const size = fs . statSync ( file ) . size ;
80
- core . info ( `upload ${ file } ` ) ;
81
- await octokit . repos . uploadReleaseAsset ( {
82
- data : fs . createReadStream ( file ) ,
83
- headers : { 'content-length' : size , 'content-type' : 'application/octet-stream' } ,
84
- name : path . basename ( file ) ,
85
- url : release . data . upload_url ,
80
+ const name = path . basename ( file ) ;
81
+
82
+ await runWithRetry ( async function ( ) {
83
+ // We can't overwrite assets, so remove existing ones from a previous try.
84
+ let assets = await octokit . rest . repos . listReleaseAssets ( {
85
+ owner,
86
+ repo,
87
+ release_id
88
+ } ) ;
89
+ for ( const asset of assets . data ) {
90
+ if ( asset . name === name ) {
91
+ core . info ( `delete asset ${ name } ` ) ;
92
+ const asset_id = asset . id ;
93
+ await octokit . rest . repos . deleteReleaseAsset ( { owner, repo, asset_id } ) ;
94
+ }
95
+ }
96
+
97
+ core . info ( `upload ${ file } ` ) ;
98
+ const headers = { 'content-length' : size , 'content-type' : 'application/octet-stream' } ;
99
+ const data = fs . createReadStream ( file ) ;
100
+ await octokit . rest . repos . uploadReleaseAsset ( {
101
+ data,
102
+ headers,
103
+ name,
104
+ url : release . data . upload_url ,
105
+ } ) ;
86
106
} ) ;
87
107
}
88
108
}
89
109
90
- async function run ( ) {
110
+ async function runWithRetry ( f ) {
91
111
const retries = 10 ;
112
+ const maxDelay = 4000 ;
113
+ let delay = 1000 ;
114
+
92
115
for ( let i = 0 ; i < retries ; i ++ ) {
93
116
try {
94
- await runOnce ( ) ;
117
+ await f ( ) ;
95
118
break ;
96
119
} catch ( e ) {
97
120
if ( i === retries - 1 )
98
121
throw e ;
99
- logError ( e ) ;
100
- console . log ( "RETRYING after 10s" ) ;
101
- await sleep ( 10000 )
122
+
123
+ core . error ( e ) ;
124
+ const currentDelay = Math . round ( Math . random ( ) * delay ) ;
125
+ core . info ( `sleeping ${ currentDelay } ms` ) ;
126
+ await sleep ( currentDelay ) ;
127
+ delay = Math . min ( delay * 2 , maxDelay ) ;
102
128
}
103
129
}
104
130
}
105
131
106
- function logError ( e ) {
107
- console . log ( "ERROR: " , e . message ) ;
108
- try {
109
- console . log ( JSON . stringify ( e , null , 2 ) ) ;
110
- } catch ( e ) {
111
- // ignore json errors for now
112
- }
113
- console . log ( e . stack ) ;
132
+ async function run ( ) {
133
+ await runWithRetry ( runOnce ) ;
114
134
}
115
135
116
136
run ( ) . catch ( err => {
117
- logError ( err ) ;
137
+ core . error ( err ) ;
118
138
core . setFailed ( err . message ) ;
119
139
} ) ;
0 commit comments