aboutsummaryrefslogtreecommitdiff
path: root/.github/actions/github-release/main.js
diff options
context:
space:
mode:
Diffstat (limited to '.github/actions/github-release/main.js')
-rw-r--r--.github/actions/github-release/main.js117
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 @@
1const core = require('@actions/core');
2const path = require("path");
3const fs = require("fs");
4const github = require('@actions/github');
5const glob = require('glob');
6
7function sleep(milliseconds) {
8 return new Promise(resolve => setTimeout(resolve, milliseconds))
9}
10
11async 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
88async 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
104function 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
114run().catch(err => {
115 logError(err);
116 core.setFailed(err.message);
117});