about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2021-12-22 19:34:12 +0000
committerGitHub <noreply@github.com>2021-12-22 19:34:12 +0000
commit4ea1f58bf6b3fd5bb59ed583f2ac432e237e1e1e (patch)
tree655dcdea0a2be69111d871552c5def06ae61fef0
parent45f907ea6fa091d839349ff20117d29dddb078f0 (diff)
parent45d22629637664a83ad477ffa94c9c411f150bf1 (diff)
downloadrust-4ea1f58bf6b3fd5bb59ed583f2ac432e237e1e1e.tar.gz
rust-4ea1f58bf6b3fd5bb59ed583f2ac432e237e1e1e.zip
Merge #11103
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>
-rw-r--r--.github/actions/github-release/main.js86
-rw-r--r--.github/actions/github-release/package.json4
-rw-r--r--.github/workflows/ci.yaml3
-rw-r--r--.github/workflows/metrics.yaml1
-rw-r--r--.github/workflows/release.yaml8
-rw-r--r--.github/workflows/rustdoc.yaml1
6 files changed, 64 insertions, 39 deletions
diff --git a/.github/actions/github-release/main.js b/.github/actions/github-release/main.js
index a08e59a91ac..c8145f63c2b 100644
--- a/.github/actions/github-release/main.js
+++ b/.github/actions/github-release/main.js
@@ -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);
 });
diff --git a/.github/actions/github-release/package.json b/.github/actions/github-release/package.json
index abfc55f6ff2..af4bf074d2d 100644
--- a/.github/actions/github-release/package.json
+++ b/.github/actions/github-release/package.json
@@ -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"
   }
 }
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 192ef11be37..baefd8bc1f0 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -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
diff --git a/.github/workflows/metrics.yaml b/.github/workflows/metrics.yaml
index d189ce9c901..f4412ef6570 100644
--- a/.github/workflows/metrics.yaml
+++ b/.github/workflows/metrics.yaml
@@ -12,6 +12,7 @@ env:
 
 jobs:
   metrics:
+    if: github.repository == 'rust-analyzer/rust-analyzer'
     runs-on: ubuntu-latest
 
     steps:
diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
index 2693e08cd47..4a1c70ebd39 100644
--- a/.github/workflows/release.yaml
+++ b/.github/workflows/release.yaml
@@ -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
diff --git a/.github/workflows/rustdoc.yaml b/.github/workflows/rustdoc.yaml
index 897f64df04b..ac69adb9477 100644
--- a/.github/workflows/rustdoc.yaml
+++ b/.github/workflows/rustdoc.yaml
@@ -12,6 +12,7 @@ env:
 
 jobs:
   rustdoc:
+    if: github.repository == 'rust-analyzer/rust-analyzer'
     runs-on: ubuntu-latest
 
     steps: