|  | 
|  | 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 == 'dev') { | 
|  | 42 | +    try { | 
|  | 43 | +      core.info(`updating dev tag`); | 
|  | 44 | +      await octokit.git.updateRef({ | 
|  | 45 | +          owner, | 
|  | 46 | +          repo, | 
|  | 47 | +          ref: 'tags/dev', | 
|  | 48 | +          sha, | 
|  | 49 | +          force: true, | 
|  | 50 | +      }); | 
|  | 51 | +    } catch (e) { | 
|  | 52 | +      console.log("ERROR: ", JSON.stringify(e, null, 2)); | 
|  | 53 | +      core.info(`creating dev tag`); | 
|  | 54 | +      await octokit.git.createTag({ | 
|  | 55 | +        owner, | 
|  | 56 | +        repo, | 
|  | 57 | +        tag: 'dev', | 
|  | 58 | +        message: 'dev 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 === 'dev', | 
|  | 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 | +}); | 
0 commit comments