-
Notifications
You must be signed in to change notification settings - Fork 13
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Automatic release when pushing to develop branch #502
Closed
Closed
Changes from 2 commits
Commits
Show all changes
26 commits
Select commit
Hold shift + click to select a range
2003e6f
automatic release when pushing to develop branch
Nutomic 4428a99
add more release targets
Nutomic b19406e
add comment
Nutomic 2e1255a
Update .github/workflows/release.yml
Nutomic ca30737
cleanup artifact handling
Nutomic 907dfe0
remove tag condition
Nutomic 2387efa
fix env
Nutomic 6f225d6
fix read env
Nutomic 07d4641
remove armv7
Nutomic 97096c3
mkdir dist
Nutomic 7312a70
remove cache
Nutomic bce8dfb
upgrade download-artifact
Nutomic bf3771e
rename nightly to develop
Nutomic 31f2526
Merge branch 'develop' into felix/automatic-release
salman01zp 46dc8f3
debug
Nutomic 68db3ec
debug 2
Nutomic 3fc86d0
debug 3
Nutomic baf4831
checkout
Nutomic 306f924
ref name
Nutomic 24bd848
fix $
Nutomic 919f50f
on tag push
Nutomic 4bd24dd
name
Nutomic c716e2a
head sha
Nutomic 0ce61f1
rename
Nutomic 60e06b2
needs
Nutomic ecf5ade
fix asset upload
Nutomic File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
test.sh | ||
package-lock.json | ||
node_modules/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
FROM node:slim | ||
|
||
COPY . /action | ||
WORKDIR /action | ||
|
||
RUN npm install --production | ||
|
||
ENTRYPOINT ["node", "/action/main.js"] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
# github-release | ||
|
||
Copy-pasted from | ||
https://github.com/rust-lang/rust-analyzer/tree/master/.github/actions/github-release | ||
|
||
An action used to publish GitHub releases for `wasmtime`. | ||
|
||
As of the time of this writing there's a few actions floating around which | ||
perform github releases but they all tend to have their set of drawbacks. | ||
Additionally nothing handles deleting releases which we need for our rolling | ||
`dev` release. | ||
|
||
To handle all this, this action rolls its own implementation using the | ||
actions/toolkit repository and packages published there. These run in a Docker | ||
container and take various inputs to orchestrate the release from the build. | ||
|
||
More comments can be found in `main.js`. | ||
|
||
Testing this is really hard. If you want to try though run `npm install` and | ||
then `node main.js`. You'll have to configure a bunch of env vars though to get | ||
anything reasonably working. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
name: 'develop github releases' | ||
description: 'develop github releases' | ||
inputs: | ||
token: | ||
description: '' | ||
required: true | ||
name: | ||
description: '' | ||
required: true | ||
files: | ||
description: '' | ||
required: true | ||
runs: | ||
using: 'docker' | ||
image: 'Dockerfile' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,146 @@ | ||
const core = require('@actions/core'); | ||
const path = require("path"); | ||
const fs = require("fs"); | ||
const github = require('@actions/github'); | ||
const glob = require('glob'); | ||
|
||
function sleep(milliseconds) { | ||
return new Promise(resolve => setTimeout(resolve, milliseconds)); | ||
} | ||
|
||
async function runOnce() { | ||
// Load all our inputs and env vars. Note that `getInput` reads from `INPUT_*` | ||
const files = core.getInput('files'); | ||
const name = core.getInput('name'); | ||
const token = core.getInput('token'); | ||
const slug = process.env.GITHUB_REPOSITORY; | ||
const owner = slug.split('/')[0]; | ||
const repo = slug.split('/')[1]; | ||
const sha = process.env.HEAD_SHA; | ||
|
||
core.info(`files: ${files}`); | ||
core.info(`name: ${name}`); | ||
|
||
const options = { | ||
request: { | ||
timeout: 30000, | ||
} | ||
}; | ||
const octokit = github.getOctokit(token, options); | ||
|
||
// Delete the previous release since we can't overwrite one. This may happen | ||
// due to retrying an upload or it may happen because we're doing the dev | ||
// release. | ||
const releases = await octokit.paginate("GET /repos/:owner/:repo/releases", { owner, repo }); | ||
for (const release of releases) { | ||
if (release.tag_name !== name) { | ||
continue; | ||
} | ||
const release_id = release.id; | ||
core.info(`deleting release ${release_id}`); | ||
await octokit.rest.repos.deleteRelease({ owner, repo, release_id }); | ||
} | ||
|
||
// We also need to update the `dev` tag while we're at it on the `dev` branch. | ||
if (name == 'nightly') { | ||
try { | ||
core.info(`updating nightly tag`); | ||
await octokit.rest.git.updateRef({ | ||
owner, | ||
repo, | ||
ref: 'tags/nightly', | ||
sha, | ||
force: true, | ||
}); | ||
} catch (e) { | ||
core.error(e); | ||
core.info(`creating nightly tag`); | ||
await octokit.rest.git.createTag({ | ||
owner, | ||
repo, | ||
tag: 'nightly', | ||
message: 'nightly release', | ||
object: sha, | ||
type: 'commit', | ||
}); | ||
} | ||
} | ||
|
||
// Creates an official GitHub release for this `tag`, and if this is `dev` | ||
// then we know that from the previous block this should be a fresh release. | ||
core.info(`creating a release`); | ||
const release = await octokit.rest.repos.createRelease({ | ||
owner, | ||
repo, | ||
name, | ||
tag_name: name, | ||
target_commitish: sha, | ||
prerelease: name === 'nightly', | ||
// TODO: just for testing | ||
draft: true | ||
}); | ||
const release_id = release.data.id; | ||
|
||
// Upload all the relevant assets for this release as just general blobs. | ||
for (const file of glob.sync(files)) { | ||
const size = fs.statSync(file).size; | ||
const name = path.basename(file); | ||
|
||
await runWithRetry(async function () { | ||
// We can't overwrite assets, so remove existing ones from a previous try. | ||
let assets = await octokit.rest.repos.listReleaseAssets({ | ||
owner, | ||
repo, | ||
release_id | ||
}); | ||
for (const asset of assets.data) { | ||
if (asset.name === name) { | ||
core.info(`delete asset ${name}`); | ||
const asset_id = asset.id; | ||
await octokit.rest.repos.deleteReleaseAsset({ owner, repo, asset_id }); | ||
} | ||
} | ||
|
||
core.info(`upload ${file}`); | ||
const headers = { 'content-length': size, 'content-type': 'application/octet-stream' }; | ||
const data = fs.createReadStream(file); | ||
await octokit.rest.repos.uploadReleaseAsset({ | ||
data, | ||
headers, | ||
name, | ||
url: release.data.upload_url, | ||
}); | ||
}); | ||
} | ||
} | ||
|
||
async function runWithRetry(f) { | ||
const retries = 10; | ||
const maxDelay = 4000; | ||
let delay = 1000; | ||
|
||
for (let i = 0; i < retries; i++) { | ||
try { | ||
await f(); | ||
break; | ||
} catch (e) { | ||
if (i === retries - 1) | ||
throw e; | ||
|
||
core.error(e); | ||
const currentDelay = Math.round(Math.random() * delay); | ||
core.info(`sleeping ${currentDelay} ms`); | ||
await sleep(currentDelay); | ||
delay = Math.min(delay * 2, maxDelay); | ||
} | ||
} | ||
} | ||
|
||
async function run() { | ||
await runWithRetry(runOnce); | ||
} | ||
|
||
run().catch(err => { | ||
core.error(err); | ||
core.setFailed(err.message); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
{ | ||
"name": "wasmtime-github-release", | ||
"version": "0.0.0", | ||
"main": "main.js", | ||
"dependencies": { | ||
"@actions/core": "^1.6", | ||
"@actions/github": "^5.0", | ||
"glob": "^7.1.5" | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It seems that multiple
push
values are always combined with AND, so the workflow is only excecuted if the push is on branch develop AND it is a tag. So far I havent found a way to make an OR condition, other than executing unconditionally and then checking manually if it should continue or abort.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The if statement could be a job that execute first and the other one depends on it?
But your statement is not true as per docs here: https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#running-your-workflow-only-when-a-push-to-specific-branches-occurs
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There is also this option, where we it runs if a PR got merged: https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#running-your-pull_request_target-workflow-when-a-pull-request-merges
Since we can't just push to the
develop
branch without a PR, this could also be an option.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think that would still run on the PR branch so its probably not what we want. I will try running the workflow always on main and develop branches, then checking manually for tags on main.