1const core = require('@actions/core');2const path = require("path");3const fs = require("fs");4const github = require('@actions/github');5const glob = require('glob');67function sleep(milliseconds) {8 return new Promise(resolve => setTimeout(resolve, milliseconds));9}1011async 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.HEAD_SHA;2021 core.info(`files: ${files}`);22 core.info(`name: ${name}`);2324 const options = {25 request: {26 timeout: 30000,27 }28 };29 const octokit = github.getOctokit(token, options);3031 // Delete the previous release since we can't overwrite one. This may happen32 // due to retrying an upload or it may happen because we're doing the dev33 // release.34 const releases = await octokit.paginate("GET /repos/:owner/:repo/releases", { owner, repo });35 for (const release of releases) {36 if (release.tag_name !== name) {37 continue;38 }39 const release_id = release.id;40 core.info(`deleting release ${release_id}`);41 await octokit.rest.repos.deleteRelease({ owner, repo, release_id });42 }4344 // We also need to update the `dev` tag while we're at it on the `dev` branch.45 if (name == 'nightly') {46 try {47 core.info(`updating nightly tag`);48 await octokit.rest.git.updateRef({49 owner,50 repo,51 ref: 'tags/nightly',52 sha,53 force: true,54 });55 } catch (e) {56 core.error(e);57 core.info(`creating nightly tag`);58 await octokit.rest.git.createTag({59 owner,60 repo,61 tag: 'nightly',62 message: 'nightly release',63 object: sha,64 type: 'commit',65 });66 }67 }6869 // Creates an official GitHub release for this `tag`, and if this is `dev`70 // then we know that from the previous block this should be a fresh release.71 core.info(`creating a release`);72 const release = await octokit.rest.repos.createRelease({73 owner,74 repo,75 name,76 tag_name: name,77 target_commitish: sha,78 prerelease: name === 'nightly',79 });80 const release_id = release.data.id;8182 // Upload all the relevant assets for this release as just general blobs.83 for (const file of glob.sync(files)) {84 const size = fs.statSync(file).size;85 const name = path.basename(file);8687 await runWithRetry(async function () {88 // We can't overwrite assets, so remove existing ones from a previous try.89 let assets = await octokit.rest.repos.listReleaseAssets({90 owner,91 repo,92 release_id93 });94 for (const asset of assets.data) {95 if (asset.name === name) {96 core.info(`delete asset ${name}`);97 const asset_id = asset.id;98 await octokit.rest.repos.deleteReleaseAsset({ owner, repo, asset_id });99 }100 }101102 core.info(`upload ${file}`);103 const headers = { 'content-length': size, 'content-type': 'application/octet-stream' };104 const data = fs.createReadStream(file);105 await octokit.rest.repos.uploadReleaseAsset({106 data,107 headers,108 name,109 url: release.data.upload_url,110 });111 });112 }113}114115async function runWithRetry(f) {116 const retries = 10;117 const maxDelay = 4000;118 let delay = 1000;119120 for (let i = 0; i < retries; i++) {121 try {122 await f();123 break;124 } catch (e) {125 if (i === retries - 1)126 throw e;127128 core.error(e);129 const currentDelay = Math.round(Math.random() * delay);130 core.info(`sleeping ${currentDelay} ms`);131 await sleep(currentDelay);132 delay = Math.min(delay * 2, maxDelay);133 }134 }135}136137async function run() {138 await runWithRetry(runOnce);139}140141run().catch(err => {142 core.error(err);143 core.setFailed(err.message);144});
Findings
✓ No findings reported for this file.