11103: internal: Improve `github-release` action r=lnicola a=lnicola

Upgrade ``@actions/github`` to get `listReleaseAssets` and retry individual uploads in addition to the whole thing.

Also disables `ci`, `metrics` and `rustdoc` on forks to save some CPU time.

CC #11056

Co-authored-by: Laurențiu Nicola <lnicola@dend.ro>
This commit is contained in:
bors[bot] 2021-12-22 19:34:12 +00:00 committed by GitHub
commit 4ea1f58bf6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 64 additions and 39 deletions

View file

@ -5,7 +5,7 @@ const github = require('@actions/github');
const glob = require('glob');
function sleep(milliseconds) {
return new Promise(resolve => setTimeout(resolve, milliseconds))
return new Promise(resolve => setTimeout(resolve, milliseconds));
}
async function runOnce() {
@ -20,9 +20,8 @@ async function runOnce() {
core.info(`files: ${files}`);
core.info(`name: ${name}`);
core.info(`token: ${token}`);
const octokit = new github.GitHub(token);
const octokit = github.getOctokit(token);
// 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
@ -34,24 +33,24 @@ async function runOnce() {
}
const release_id = release.id;
core.info(`deleting release ${release_id}`);
await octokit.repos.deleteRelease({ owner, repo, 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.git.updateRef({
owner,
repo,
ref: 'tags/nightly',
sha,
force: true,
await octokit.rest.git.updateRef({
owner,
repo,
ref: 'tags/nightly',
sha,
force: true,
});
} catch (e) {
console.log("ERROR: ", JSON.stringify(e, null, 2));
core.error(e);
core.info(`creating nightly tag`);
await octokit.git.createTag({
await octokit.rest.git.createTag({
owner,
repo,
tag: 'nightly',
@ -65,7 +64,7 @@ async function runOnce() {
// 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.repos.createRelease({
const release = await octokit.rest.repos.createRelease({
owner,
repo,
name,
@ -73,47 +72,68 @@ async function runOnce() {
target_commitish: sha,
prerelease: name === 'nightly',
});
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;
core.info(`upload ${file}`);
await octokit.repos.uploadReleaseAsset({
data: fs.createReadStream(file),
headers: { 'content-length': size, 'content-type': 'application/octet-stream' },
name: path.basename(file),
url: release.data.upload_url,
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 run() {
async function runWithRetry(f) {
const retries = 10;
const maxDelay = 4000;
let delay = 1000;
for (let i = 0; i < retries; i++) {
try {
await runOnce();
await f();
break;
} catch (e) {
if (i === retries - 1)
throw e;
logError(e);
console.log("RETRYING after 10s");
await sleep(10000)
core.error(e);
const currentDelay = Math.round(Math.random() * delay);
core.info(`sleeping ${currentDelay} ms`);
await sleep(currentDelay);
delay = Math.min(delay * 2, maxDelay);
}
}
}
function logError(e) {
console.log("ERROR: ", e.message);
try {
console.log(JSON.stringify(e, null, 2));
} catch (e) {
// ignore json errors for now
}
console.log(e.stack);
async function run() {
await runWithRetry(runOnce);
}
run().catch(err => {
logError(err);
core.error(err);
core.setFailed(err.message);
});

View file

@ -3,8 +3,8 @@
"version": "0.0.0",
"main": "main.js",
"dependencies": {
"@actions/core": "^1.0.0",
"@actions/github": "^1.0.0",
"@actions/core": "^1.6",
"@actions/github": "^5.0",
"glob": "^7.1.5"
}
}

View file

@ -17,6 +17,7 @@ env:
jobs:
rust:
if: github.repository == 'rust-analyzer/rust-analyzer'
name: Rust
runs-on: ${{ matrix.os }}
env:
@ -61,6 +62,7 @@ jobs:
# Weird targets to catch non-portable code
rust-cross:
if: github.repository == 'rust-analyzer/rust-analyzer'
name: Rust Cross
runs-on: ubuntu-latest
@ -97,6 +99,7 @@ jobs:
done
typescript:
if: github.repository == 'rust-analyzer/rust-analyzer'
name: TypeScript
strategy:
fail-fast: false

View file

@ -12,6 +12,7 @@ env:
jobs:
metrics:
if: github.repository == 'rust-analyzer/rust-analyzer'
runs-on: ubuntu-latest
steps:

View file

@ -162,12 +162,12 @@ jobs:
- run: npm ci
working-directory: editors/code
- name: Publish Extension (release)
- name: Package Extension (release)
if: github.ref == 'refs/heads/release'
run: npx vsce package -o "../../dist/rust-analyzer-alpine-x64.vsix" --target alpine-x64
working-directory: editors/code
- name: Publish Extension (nightly)
- name: Package Extension (nightly)
if: github.ref != 'refs/heads/release'
run: npx vsce package -o "../../dist/rust-analyzer-alpine-x64.vsix" --target alpine-x64 --pre-release
working-directory: editors/code
@ -247,12 +247,12 @@ jobs:
working-directory: ./editors/code
- name: Publish Extension (release)
if: github.ref == 'refs/heads/release'
if: github.ref == 'refs/heads/release' && github.repository == 'rust-analyzer/rust-analyzer'
working-directory: ./editors/code
# token from https://dev.azure.com/rust-analyzer/
run: npx vsce publish --pat ${{ secrets.MARKETPLACE_TOKEN }} --packagePath ../../dist/rust-analyzer-*.vsix
- name: Publish Extension (nightly)
if: github.ref != 'refs/heads/release'
if: github.ref != 'refs/heads/release' && github.repository == 'rust-analyzer/rust-analyzer'
working-directory: ./editors/code
run: npx vsce publish --pat ${{ secrets.MARKETPLACE_TOKEN }} --packagePath ../../dist/rust-analyzer-*.vsix --pre-release

View file

@ -12,6 +12,7 @@ env:
jobs:
rustdoc:
if: github.repository == 'rust-analyzer/rust-analyzer'
runs-on: ubuntu-latest
steps: