release.mjs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  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. linux: { signature: "", url: "" },
  33. darwin: { signature: "", url: "" },
  34. },
  35. };
  36. const promises = latestRelease.assets.map(async (asset) => {
  37. const { name, browser_download_url } = asset;
  38. // win64 url
  39. if (/\.msi\.zip$/.test(name)) {
  40. updateData.platforms.win64.url = browser_download_url;
  41. }
  42. // win64 signature
  43. if (/\.msi\.zip\.sig$/.test(name)) {
  44. updateData.platforms.win64.signature = await getSignature(
  45. browser_download_url
  46. );
  47. }
  48. // darwin url
  49. if (/\.app\.tar\.gz$/.test(name)) {
  50. updateData.platforms.darwin.url = browser_download_url;
  51. }
  52. // darwin signature
  53. if (/\.app\.tar\.gz\.sig$/.test(name)) {
  54. updateData.platforms.darwin.signature = await getSignature(
  55. browser_download_url
  56. );
  57. }
  58. // linux url
  59. if (/\.AppImage\.tar\.gz$/.test(name)) {
  60. updateData.platforms.linux.url = browser_download_url;
  61. }
  62. // linux signature
  63. if (/\.AppImage\.tar\.gz\.sig$/.test(name)) {
  64. updateData.platforms.linux.signature = await getSignature(
  65. browser_download_url
  66. );
  67. }
  68. });
  69. await Promise.allSettled(promises);
  70. console.log(updateData);
  71. // maybe should test the signature as well
  72. const { darwin, win64 } = updateData.platforms;
  73. if (!darwin.url) {
  74. console.log(`[Error]: failed to parse release for darwin`);
  75. delete updateData.platforms.darwin;
  76. }
  77. if (!win64.url) {
  78. console.log(`[Error]: failed to parse release for win64`);
  79. delete updateData.platforms.win64;
  80. }
  81. // update the update.json
  82. const { data: updateRelease } = await github.rest.repos.getReleaseByTag({
  83. ...options,
  84. tag: UPDATE_TAG_NAME,
  85. });
  86. for (let asset of updateRelease.assets) {
  87. if (asset.name === UPDATE_JSON_FILE) {
  88. await github.rest.repos.deleteReleaseAsset({
  89. ...options,
  90. asset_id: asset.id,
  91. });
  92. break;
  93. }
  94. }
  95. await github.rest.repos.uploadReleaseAsset({
  96. ...options,
  97. release_id: updateRelease.id,
  98. name: UPDATE_JSON_FILE,
  99. data: JSON.stringify(updateData, null, 2),
  100. });
  101. }
  102. // get the signature file content
  103. async function getSignature(url) {
  104. const response = await fetch(url, {
  105. method: "GET",
  106. headers: { "Content-Type": "application/octet-stream" },
  107. });
  108. return response.text();
  109. }
  110. resolveRelease().catch(console.error);