upload-to-github.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. if (!process.env.CI) require('dotenv-safe').load()
  2. const fs = require('fs')
  3. const octokit = require('@octokit/rest')()
  4. octokit.authenticate({ type: 'token', token: process.env.ELECTRON_GITHUB_TOKEN })
  5. if (process.argv.length < 6) {
  6. console.log('Usage: upload-to-github filePath fileName releaseId')
  7. process.exit(1)
  8. }
  9. const filePath = process.argv[2]
  10. const fileName = process.argv[3]
  11. const releaseId = process.argv[4]
  12. const releaseVersion = process.argv[5]
  13. const getHeaders = (filePath, fileName) => {
  14. const extension = fileName.split('.').pop()
  15. const size = fs.statSync(filePath).size
  16. const options = {
  17. 'json': 'text/json',
  18. 'zip': 'application/zip',
  19. 'txt': 'text/plain',
  20. 'ts': 'application/typescript'
  21. }
  22. return {
  23. 'content-type': options[extension],
  24. 'content-length': size
  25. }
  26. }
  27. const targetRepo = releaseVersion.indexOf('nightly') > 0 ? 'nightlies' : 'electron'
  28. const uploadUrl = `https://uploads.github.com/repos/electron/${targetRepo}/releases/${releaseId}/assets{?name,label}`
  29. let retry = 0
  30. function uploadToGitHub () {
  31. octokit.repos.uploadReleaseAsset({
  32. url: uploadUrl,
  33. headers: getHeaders(filePath, fileName),
  34. file: fs.createReadStream(filePath),
  35. name: fileName
  36. }).then(() => {
  37. console.log(`Successfully uploaded ${fileName} to GitHub.`)
  38. process.exit()
  39. }).catch((err) => {
  40. if (retry < 4) {
  41. console.log(`Error uploading ${fileName} to GitHub, will retry. Error was:`, err)
  42. retry++
  43. octokit.repos.listAssetsForRelease({
  44. owner: 'electron',
  45. repo: targetRepo,
  46. release_id: releaseId,
  47. per_page: 100
  48. }).then(assets => {
  49. console.log('Got list of assets for existing release:')
  50. console.log(JSON.stringify(assets.data, null, ' '))
  51. const existingAssets = assets.data.filter(asset => asset.name === fileName)
  52. if (existingAssets.length > 0) {
  53. console.log(`${fileName} already exists; will delete before retrying upload.`)
  54. octokit.repos.deleteReleaseAsset({
  55. owner: 'electron',
  56. repo: targetRepo,
  57. asset_id: existingAssets[0].id
  58. }).catch((deleteErr) => {
  59. console.log(`Failed to delete existing asset ${fileName}. Error was:`, deleteErr)
  60. }).then(uploadToGitHub)
  61. } else {
  62. console.log(`Current asset ${fileName} not found in existing assets; retrying upload.`)
  63. uploadToGitHub()
  64. }
  65. }).catch((getReleaseErr) => {
  66. console.log(`Fatal: Unable to get current release assets via getRelease! Error was:`, getReleaseErr)
  67. })
  68. } else {
  69. console.log(`Error retrying uploading ${fileName} to GitHub:`, err)
  70. process.exitCode = 1
  71. }
  72. })
  73. }
  74. uploadToGitHub()