diff options
Diffstat (limited to '.github/actions')
-rw-r--r-- | .github/actions/github-release/Dockerfile | 8 | ||||
-rw-r--r-- | .github/actions/github-release/README.md | 21 | ||||
-rw-r--r-- | .github/actions/github-release/action.yml | 15 | ||||
-rw-r--r-- | .github/actions/github-release/main.js | 117 | ||||
-rw-r--r-- | .github/actions/github-release/package.json | 10 |
5 files changed, 171 insertions, 0 deletions
diff --git a/.github/actions/github-release/Dockerfile b/.github/actions/github-release/Dockerfile new file mode 100644 index 000000000..5849eac7d --- /dev/null +++ b/.github/actions/github-release/Dockerfile | |||
@@ -0,0 +1,8 @@ | |||
1 | FROM node:slim | ||
2 | |||
3 | COPY . /action | ||
4 | WORKDIR /action | ||
5 | |||
6 | RUN npm install --production | ||
7 | |||
8 | ENTRYPOINT ["node", "/action/main.js"] | ||
diff --git a/.github/actions/github-release/README.md b/.github/actions/github-release/README.md new file mode 100644 index 000000000..7b50d0020 --- /dev/null +++ b/.github/actions/github-release/README.md | |||
@@ -0,0 +1,21 @@ | |||
1 | # github-release | ||
2 | |||
3 | Copy-pasted from | ||
4 | https://github.com/bytecodealliance/wasmtime/tree/8acfdbdd8aa550d1b84e0ce1e6222a6605d14e38/.github/actions/github-release | ||
5 | |||
6 | An action used to publish GitHub releases for `wasmtime`. | ||
7 | |||
8 | As of the time of this writing there's a few actions floating around which | ||
9 | perform github releases but they all tend to have their set of drawbacks. | ||
10 | Additionally nothing handles deleting releases which we need for our rolling | ||
11 | `dev` release. | ||
12 | |||
13 | To handle all this this action rolls-its-own implementation using the | ||
14 | actions/toolkit repository and packages published there. These run in a Docker | ||
15 | container and take various inputs to orchestrate the release from the build. | ||
16 | |||
17 | More comments can be found in `main.js`. | ||
18 | |||
19 | Testing this is really hard. If you want to try though run `npm install` and | ||
20 | then `node main.js`. You'll have to configure a bunch of env vars though to get | ||
21 | anything reasonably working. | ||
diff --git a/.github/actions/github-release/action.yml b/.github/actions/github-release/action.yml new file mode 100644 index 000000000..51a074adf --- /dev/null +++ b/.github/actions/github-release/action.yml | |||
@@ -0,0 +1,15 @@ | |||
1 | name: 'wasmtime github releases' | ||
2 | description: 'wasmtime github releases' | ||
3 | inputs: | ||
4 | token: | ||
5 | description: '' | ||
6 | required: true | ||
7 | name: | ||
8 | description: '' | ||
9 | required: true | ||
10 | files: | ||
11 | description: '' | ||
12 | required: true | ||
13 | runs: | ||
14 | using: 'docker' | ||
15 | image: 'Dockerfile' | ||
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 | }); | ||
diff --git a/.github/actions/github-release/package.json b/.github/actions/github-release/package.json new file mode 100644 index 000000000..abfc55f6f --- /dev/null +++ b/.github/actions/github-release/package.json | |||
@@ -0,0 +1,10 @@ | |||
1 | { | ||
2 | "name": "wasmtime-github-release", | ||
3 | "version": "0.0.0", | ||
4 | "main": "main.js", | ||
5 | "dependencies": { | ||
6 | "@actions/core": "^1.0.0", | ||
7 | "@actions/github": "^1.0.0", | ||
8 | "glob": "^7.1.5" | ||
9 | } | ||
10 | } | ||