release-helper.mjs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { readdir, readFile } from 'fs/promises';
  2. import { join } from 'path';
  3. import github from '@actions/github';
  4. const { VERSION, ASSETS_DIR, GITHUB_TOKEN } = process.env;
  5. const tag = `v${VERSION}`;
  6. let octokit;
  7. function getOctokit() {
  8. octokit ||= github.getOctokit(GITHUB_TOKEN);
  9. return octokit;
  10. }
  11. export async function getRelease() {
  12. try {
  13. const result = await getOctokit().rest.repos.getReleaseByTag({
  14. ...github.context.repo,
  15. tag,
  16. });
  17. console.info('Found release:', tag);
  18. return result.data;
  19. } catch (err) {
  20. if (err.status !== 404) throw err;
  21. }
  22. }
  23. export async function createRelease() {
  24. console.info('Create release:', tag);
  25. const result = await getOctokit().rest.repos.createRelease({
  26. ...github.context.repo,
  27. tag_name: tag,
  28. name: process.env.RELEASE_NAME,
  29. body: process.env.RELEASE_NOTE,
  30. prerelease: process.env.PRERELEASE == 'true',
  31. });
  32. return result.data;
  33. }
  34. export async function ensureRelease() {
  35. const release = await getRelease() || await createRelease();
  36. return release;
  37. }
  38. export async function hasAsset(fileName) {
  39. const release = await getRelease();
  40. return release?.assets.some(asset => asset.name === fileName);
  41. }
  42. export async function uploadAssets() {
  43. const release = await ensureRelease();
  44. let assets = await readdir(ASSETS_DIR);
  45. assets = assets.filter(asset => release.assets.every(({ name }) => name !== asset));
  46. for (const asset of assets) {
  47. console.info(`> Upload asset: ${asset}`);
  48. await getOctokit().rest.repos.uploadReleaseAsset({
  49. ...github.context.repo,
  50. release_id: release.id,
  51. name: asset,
  52. data: await readFile(join(ASSETS_DIR, asset)),
  53. });
  54. }
  55. if (assets.length) console.info('Done');
  56. else console.info('No asset to upload');
  57. }
  58. export async function notifyReleaseStatus({ title, description, success = true }) {
  59. const { DISCORD_WEBHOOK_RELEASE } = process.env;
  60. if (!DISCORD_WEBHOOK_RELEASE) {
  61. console.warn('DISCORD_WEBHOOK_RELEASE is not available!');
  62. return;
  63. }
  64. const res = await fetch(DISCORD_WEBHOOK_RELEASE, {
  65. method: 'POST',
  66. headers: {
  67. 'Content-Type': 'application/json',
  68. },
  69. body: JSON.stringify({
  70. embeds: [
  71. {
  72. title,
  73. description,
  74. color: success ? 0x00ff00 : 0xff0000,
  75. },
  76. ],
  77. }),
  78. });
  79. if (!res.ok) console.error(res);
  80. }