release.mjs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import fetch from "node-fetch";
  2. import { getOctokit, context } from "@actions/github";
  3. const UPDATE_TAG_NAME = "updater";
  4. const UPDATE_JSON_FILE = "update.json";
  5. /// generate update.json
  6. /// upload to update tag's release asset
  7. async function resolveRelease() {
  8. if (process.env.GITHUB_TOKEN === undefined) {
  9. throw new Error("GITHUB_TOKEN is required");
  10. }
  11. const options = { owner: context.repo.owner, repo: context.repo.repo };
  12. const github = getOctokit(process.env.GITHUB_TOKEN);
  13. const { data: tags } = await github.rest.repos.listTags({
  14. ...options,
  15. per_page: 10,
  16. page: 1,
  17. });
  18. // get the latest publish tag
  19. const tag = tags.find((t) => t.name.startsWith("v"));
  20. console.log(tag);
  21. console.log();
  22. const { data: latestRelease } = await github.rest.repos.getReleaseByTag({
  23. ...options,
  24. tag: tag.name,
  25. });
  26. const updateData = {
  27. name: tag.name,
  28. notes: latestRelease.body, // use the release body directly
  29. pub_date: new Date().toISOString(),
  30. platforms: {
  31. win64: { signature: "", url: "" },
  32. darwin: { signature: "", url: "" },
  33. },
  34. };
  35. const promises = latestRelease.assets.map(async (asset) => {
  36. const { name, browser_download_url } = asset;
  37. // win64 url
  38. if (/\.msi\.zip$/.test(name)) {
  39. updateData.platforms.win64.url = browser_download_url;
  40. }
  41. // darwin url
  42. if (/\.app\.tar\.gz$/.test(name)) {
  43. updateData.platforms.darwin.url = browser_download_url;
  44. }
  45. // win64 signature
  46. if (/\.msi\.zip\.sig$/.test(name)) {
  47. updateData.platforms.win64.signature = await getSignature(
  48. browser_download_url
  49. );
  50. }
  51. // darwin signature
  52. if (/\.app\.tar\.gz\.sig$/.test(name)) {
  53. updateData.platforms.darwin.signature = await getSignature(
  54. browser_download_url
  55. );
  56. }
  57. });
  58. await Promise.allSettled(promises);
  59. console.log(updateData);
  60. // maybe should test the signature as well
  61. const { darwin, win64 } = updateData.platforms;
  62. if (!darwin.url) {
  63. console.log(`[Error]: failed to parse release for darwin`);
  64. delete updateData.platforms.darwin;
  65. }
  66. if (!win64.url) {
  67. console.log(`[Error]: failed to parse release for win64`);
  68. delete updateData.platforms.win64;
  69. }
  70. // update the update.json
  71. const { data: updateRelease } = await github.rest.repos.getReleaseByTag({
  72. ...options,
  73. tag: UPDATE_TAG_NAME,
  74. });
  75. for (let asset of updateRelease.assets) {
  76. if (asset.name === UPDATE_JSON_FILE) {
  77. await github.rest.repos.deleteReleaseAsset({
  78. ...options,
  79. asset_id: asset.id,
  80. });
  81. break;
  82. }
  83. }
  84. await github.rest.repos.uploadReleaseAsset({
  85. ...options,
  86. release_id: updateRelease.id,
  87. name: UPDATE_JSON_FILE,
  88. data: JSON.stringify(updateData, null, 2),
  89. });
  90. }
  91. // get the signature file content
  92. async function getSignature(url) {
  93. const response = await fetch(url, {
  94. method: "GET",
  95. headers: { "Content-Type": "application/octet-stream" },
  96. });
  97. return response.text();
  98. }
  99. resolveRelease().catch(console.error);