release-artifact-cleanup.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #!/usr/bin/env node
  2. if (!process.env.CI) require('dotenv-safe').load();
  3. const args = require('minimist')(process.argv.slice(2), {
  4. string: ['tag', 'releaseID'],
  5. default: { releaseID: '' }
  6. });
  7. const { Octokit } = require('@octokit/rest');
  8. const chalk = require('chalk');
  9. const { createGitHubTokenStrategy } = require('./github-token');
  10. const pass = chalk.green('✓');
  11. const fail = chalk.red('✗');
  12. async function deleteDraft (releaseId, targetRepo) {
  13. const octokit = new Octokit({
  14. authStrategy: createGitHubTokenStrategy(targetRepo)
  15. });
  16. try {
  17. const result = await octokit.repos.getRelease({
  18. owner: 'electron',
  19. repo: targetRepo,
  20. release_id: parseInt(releaseId, 10)
  21. });
  22. if (!result.data.draft) {
  23. console.log(`${fail} published releases cannot be deleted.`);
  24. return false;
  25. } else {
  26. await octokit.repos.deleteRelease({
  27. owner: 'electron',
  28. repo: targetRepo,
  29. release_id: result.data.id
  30. });
  31. }
  32. console.log(`${pass} successfully deleted draft with id ${releaseId} from ${targetRepo}`);
  33. return true;
  34. } catch (err) {
  35. console.error(`${fail} couldn't delete draft with id ${releaseId} from ${targetRepo}: `, err);
  36. return false;
  37. }
  38. }
  39. async function deleteTag (tag, targetRepo) {
  40. const octokit = new Octokit({
  41. authStrategy: createGitHubTokenStrategy(targetRepo)
  42. });
  43. try {
  44. await octokit.git.deleteRef({
  45. owner: 'electron',
  46. repo: targetRepo,
  47. ref: `tags/${tag}`
  48. });
  49. console.log(`${pass} successfully deleted tag ${tag} from ${targetRepo}`);
  50. } catch (err) {
  51. console.log(`${fail} couldn't delete tag ${tag} from ${targetRepo}: `, err);
  52. }
  53. }
  54. async function cleanReleaseArtifacts () {
  55. const releaseId = args.releaseID.length > 0 ? args.releaseID : null;
  56. const isNightly = args.tag.includes('nightly');
  57. if (releaseId) {
  58. if (isNightly) {
  59. await deleteDraft(releaseId, 'nightlies');
  60. // We only need to delete the Electron tag since the
  61. // nightly tag is only created at publish-time.
  62. await deleteTag(args.tag, 'electron');
  63. } else {
  64. const deletedElectronDraft = await deleteDraft(releaseId, 'electron');
  65. // don't delete tag unless draft deleted successfully
  66. if (deletedElectronDraft) {
  67. await deleteTag(args.tag, 'electron');
  68. }
  69. }
  70. } else {
  71. await Promise.all([
  72. deleteTag(args.tag, 'electron'),
  73. deleteTag(args.tag, 'nightlies')
  74. ]);
  75. }
  76. console.log(`${pass} failed release artifact cleanup complete`);
  77. }
  78. cleanReleaseArtifacts();