diff options
Diffstat (limited to '.github/actions/github-release/main.js')
-rw-r--r-- | .github/actions/github-release/main.js | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/.github/actions/github-release/main.js b/.github/actions/github-release/main.js new file mode 100644 index 000000000..295c02626 --- /dev/null +++ b/.github/actions/github-release/main.js | |||
@@ -0,0 +1,117 @@ | |||
1 | const core = require('@actions/core'); | ||
2 | const path = require("path"); | ||
3 | const fs = require("fs"); | ||
4 | const github = require('@actions/github'); | ||
5 | const glob = require('glob'); | ||
6 | |||
7 | function sleep(milliseconds) { | ||
8 | return new Promise(resolve => setTimeout(resolve, milliseconds)) | ||
9 | } | ||
10 | |||
11 | async function runOnce() { | ||
12 | // Load all our inputs and env vars. Note that `getInput` reads from `INPUT_*` | ||
13 | const files = core.getInput('files'); | ||
14 | const name = core.getInput('name'); | ||
15 | const token = core.getInput('token'); | ||
16 | const slug = process.env.GITHUB_REPOSITORY; | ||
17 | const owner = slug.split('/')[0]; | ||
18 | const repo = slug.split('/')[1]; | ||
19 | const sha = process.env.GITHUB_SHA; | ||
20 | |||
21 | core.info(`files: ${files}`); | ||
22 | core.info(`name: ${name}`); | ||
23 | core.info(`token: ${token}`); | ||
24 | |||
25 | const octokit = new github.GitHub(token); | ||
26 | |||
27 | // Delete the previous release since we can't overwrite one. This may happen | ||
28 | // due to retrying an upload or it may happen because we're doing the dev | ||
29 | // release. | ||
30 | const releases = await octokit.paginate("GET /repos/:owner/:repo/releases", { owner, repo }); | ||
31 | for (const release of releases) { | ||
32 | if (release.tag_name !== name) { | ||
33 | continue; | ||
34 | } | ||
35 | const release_id = release.id; | ||
36 | core.info(`deleting release ${release_id}`); | ||
37 | await octokit.repos.deleteRelease({ owner, repo, release_id }); | ||
38 | } | ||
39 | |||
40 | // We also need to update the `dev` tag while we're at it on the `dev` branch. | ||
41 | if (name == 'nightly') { | ||
42 | try { | ||
43 | core.info(`updating nightly tag`); | ||
44 | await octokit.git.updateRef({ | ||
45 | owner, | ||
46 | repo, | ||
47 | ref: 'tags/nightly', | ||
48 | sha, | ||
49 | force: true, | ||
50 | }); | ||
51 | } catch (e) { | ||
52 | console.log("ERROR: ", JSON.stringify(e, null, 2)); | ||
53 | core.info(`creating nightly tag`); | ||
54 | await octokit.git.createTag({ | ||
55 | owner, | ||
56 | repo, | ||
57 | tag: 'nightly', | ||
58 | message: 'nightly release', | ||
59 | object: sha, | ||
60 | type: 'commit', | ||
61 | }); | ||
62 | } | ||
63 | } | ||
64 | |||
65 | // Creates an official GitHub release for this `tag`, and if this is `dev` | ||
66 | // then we know that from the previous block this should be a fresh release. | ||
67 | core.info(`creating a release`); | ||
68 | const release = await octokit.repos.createRelease({ | ||
69 | owner, | ||
70 | repo, | ||
71 | tag_name: name, | ||
72 | prerelease: name === 'nightly', | ||
73 | }); | ||
74 | |||
75 | // Upload all the relevant assets for this release as just general blobs. | ||
76 | for (const file of glob.sync(files)) { | ||
77 | const size = fs.statSync(file).size; | ||
78 | core.info(`upload ${file}`); | ||
79 | await octokit.repos.uploadReleaseAsset({ | ||
80 | data: fs.createReadStream(file), | ||
81 | headers: { 'content-length': size, 'content-type': 'application/octet-stream' }, | ||
82 | name: path.basename(file), | ||
83 | url: release.data.upload_url, | ||
84 | }); | ||
85 | } | ||
86 | } | ||
87 | |||
88 | async function run() { | ||
89 | const retries = 10; | ||
90 | for (let i = 0; i < retries; i++) { | ||
91 | try { | ||
92 | await runOnce(); | ||
93 | break; | ||
94 | } catch (e) { | ||
95 | if (i === retries - 1) | ||
96 | throw e; | ||
97 | logError(e); | ||
98 | console.log("RETRYING after 10s"); | ||
99 | await sleep(10000) | ||
100 | } | ||
101 | } | ||
102 | } | ||
103 | |||
104 | function logError(e) { | ||
105 | console.log("ERROR: ", e.message); | ||
106 | try { | ||
107 | console.log(JSON.stringify(e, null, 2)); | ||
108 | } catch (e) { | ||
109 | // ignore json errors for now | ||
110 | } | ||
111 | console.log(e.stack); | ||
112 | } | ||
113 | |||
114 | run().catch(err => { | ||
115 | logError(err); | ||
116 | core.setFailed(err.message); | ||
117 | }); | ||