From fede298c49d941e317cb8012f8e565fc4baf821f Mon Sep 17 00:00:00 2001 From: Andrew Lisowski Date: Thu, 11 Feb 2021 13:21:24 -0800 Subject: [PATCH 1/4] add test --- plugins/upload-assets/__tests__/upload-assets.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/upload-assets/__tests__/upload-assets.test.ts b/plugins/upload-assets/__tests__/upload-assets.test.ts index 18f3e9624..2125a5701 100644 --- a/plugins/upload-assets/__tests__/upload-assets.test.ts +++ b/plugins/upload-assets/__tests__/upload-assets.test.ts @@ -93,6 +93,7 @@ describe("Upload Assets Plugin", () => { release_id: "123", }) ); + expect(createRelease).not.toHaveBeenCalled(); }); test("should upload a single canary asset", async () => { @@ -196,7 +197,7 @@ describe("Upload Assets Plugin", () => { await hooks.canary.promise({ canaryIdentifier: "canary.123", bump: SEMVER.patch, - dryRun: true + dryRun: true, }); expect(uploadReleaseAsset).not.toHaveBeenCalled(); From 7e796d8e70f7b3ea6b81c7d6880db67f979b3588 Mon Sep 17 00:00:00 2001 From: Andrew Lisowski Date: Thu, 11 Feb 2021 13:22:11 -0800 Subject: [PATCH 2/4] do not create the canary release if not ran from a canary --- plugins/upload-assets/src/index.ts | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/plugins/upload-assets/src/index.ts b/plugins/upload-assets/src/index.ts index 9683eb5e5..a50cf0d31 100644 --- a/plugins/upload-assets/src/index.ts +++ b/plugins/upload-assets/src/index.ts @@ -15,6 +15,7 @@ import link from "terminal-link"; import * as t from "io-ts"; type AssetResponse = RestEndpointMethodTypes["repos"]["uploadReleaseAsset"]["response"]["data"]; +type GitHubRelease = RestEndpointMethodTypes["repos"]["getReleaseByTag"]["response"]["data"]; const stat = promisify(fs.stat); const readFile = promisify(fs.readFile); @@ -80,7 +81,7 @@ export default class UploadAssetsPlugin implements IPlugin { auto.hooks.canary.tapPromise( this.name, async ({ canaryIdentifier, dryRun }) => { - const canaryRelease = await this.getCanaryGitHubRelease(auto); + const canaryRelease = await this.getCanaryGitHubRelease(auto, true); auto.logger.log.info(endent`${ dryRun ? "Would update" : "Updating" @@ -233,8 +234,13 @@ export default class UploadAssetsPlugin implements IPlugin { .reduce((acc, item) => [...acc, ...item], []); } + // prettier-ignore + private async getCanaryGitHubRelease(auto: Auto): Promise + // prettier-ignore + private async getCanaryGitHubRelease(auto: Auto, create: true): Promise + // prettier-ignore /** Get the release all the canaries are stored in */ - private async getCanaryGitHubRelease(auto: Auto) { + private async getCanaryGitHubRelease(auto: Auto, create = false): Promise { try { const canaryRelease = await auto.git!.github.repos.getReleaseByTag({ repo: auto.git!.options.repo, @@ -244,6 +250,10 @@ export default class UploadAssetsPlugin implements IPlugin { return canaryRelease.data; } catch (error) { + if (!create) { + return; + } + const canaryRelease = await auto.git!.github.repos.createRelease({ repo: auto.git!.options.repo, owner: auto.git!.options.owner, @@ -260,6 +270,11 @@ export default class UploadAssetsPlugin implements IPlugin { /** Delete old canary asset */ private async cleanupCanaryAssets(auto: Auto) { const canaryRelease = await this.getCanaryGitHubRelease(auto); + + if (!canaryRelease) { + return; + } + const canaryReleaseAssets = await auto.git!.github.paginate( auto.git!.github.repos.listReleaseAssets, { From 84af1b38d43d103887953d05817949bd190e0ed7 Mon Sep 17 00:00:00 2001 From: Andrew Lisowski Date: Thu, 11 Feb 2021 13:31:28 -0800 Subject: [PATCH 3/4] make canary release tag a valid SEMVER version --- plugins/upload-assets/src/index.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/upload-assets/src/index.ts b/plugins/upload-assets/src/index.ts index a50cf0d31..e332e39ef 100644 --- a/plugins/upload-assets/src/index.ts +++ b/plugins/upload-assets/src/index.ts @@ -19,6 +19,7 @@ type GitHubRelease = RestEndpointMethodTypes["repos"]["getReleaseByTag"]["respon const stat = promisify(fs.stat); const readFile = promisify(fs.readFile); +const canaryTag = "0.0.0-canary"; const requiredPluginOptions = t.interface({ /** Paths to assets to upload */ @@ -245,7 +246,7 @@ export default class UploadAssetsPlugin implements IPlugin { const canaryRelease = await auto.git!.github.repos.getReleaseByTag({ repo: auto.git!.options.repo, owner: auto.git!.options.owner, - tag: "canary", + tag: auto.prefixRelease(canaryTag), }); return canaryRelease.data; @@ -257,7 +258,7 @@ export default class UploadAssetsPlugin implements IPlugin { const canaryRelease = await auto.git!.github.repos.createRelease({ repo: auto.git!.options.repo, owner: auto.git!.options.owner, - tag_name: "canary", + tag_name: auto.prefixRelease(canaryTag), name: "Canary Assets", prerelease: true, body: `This release contains preview assets of Pull Requests.`, From 9809ccfd47d727f8885b9db4cfc142cc0f25c50c Mon Sep 17 00:00:00 2001 From: Andrew Lisowski Date: Thu, 11 Feb 2021 13:40:18 -0800 Subject: [PATCH 4/4] update test mocks to include prefixRelease + modify afterRelease tests to only check for existing tag --- .../__tests__/upload-assets-ci.test.ts | 13 ++++++------ .../__tests__/upload-assets.test.ts | 20 +++++++++++++++---- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/plugins/upload-assets/__tests__/upload-assets-ci.test.ts b/plugins/upload-assets/__tests__/upload-assets-ci.test.ts index 18dbb7d6f..9ed9685a5 100644 --- a/plugins/upload-assets/__tests__/upload-assets-ci.test.ts +++ b/plugins/upload-assets/__tests__/upload-assets-ci.test.ts @@ -29,19 +29,18 @@ describe("Upload Assets Plugin", () => { path.join(__dirname, "./test-assets/macos"), ]); const hooks = makeHooks(); - const uploadReleaseAsset = jest - .fn() - .mockImplementation(({ name }) => - Promise.resolve({ - data: { id: 2, name, browser_download_url: `http://${name}` }, - }) - ); + const uploadReleaseAsset = jest.fn().mockImplementation(({ name }) => + Promise.resolve({ + data: { id: 2, name, browser_download_url: `http://${name}` }, + }) + ); const createRelease = jest.fn().mockResolvedValue({ data: { id: 1 } }); const addToPrBody = jest.fn(); plugin.apply(({ hooks, logger: dummyLog(), + prefixRelease: (v) => v, git: { options, addToPrBody, diff --git a/plugins/upload-assets/__tests__/upload-assets.test.ts b/plugins/upload-assets/__tests__/upload-assets.test.ts index 2125a5701..5e6fbbecb 100644 --- a/plugins/upload-assets/__tests__/upload-assets.test.ts +++ b/plugins/upload-assets/__tests__/upload-assets.test.ts @@ -34,6 +34,7 @@ describe("Upload Assets Plugin", () => { plugin.apply(({ hooks, logger: dummyLog(), + prefixRelease: (v) => v, git: { options, github: { @@ -64,6 +65,7 @@ describe("Upload Assets Plugin", () => { plugin.apply(({ hooks, logger: dummyLog(), + prefixRelease: (v) => v, git: { options, github: { @@ -111,6 +113,7 @@ describe("Upload Assets Plugin", () => { plugin.apply(({ hooks, logger: dummyLog(), + prefixRelease: (v) => v, git: { options, github: { @@ -148,6 +151,7 @@ describe("Upload Assets Plugin", () => { plugin.apply(({ hooks, logger: dummyLog(), + prefixRelease: (v) => v, git: { options, github: { @@ -185,6 +189,7 @@ describe("Upload Assets Plugin", () => { plugin.apply(({ hooks, logger: dummyLog(), + prefixRelease: (v) => v, git: { options, github: { @@ -218,6 +223,7 @@ describe("Upload Assets Plugin", () => { plugin.apply(({ hooks, logger: dummyLog(), + prefixRelease: (v) => v, git: { options, github: { @@ -251,6 +257,7 @@ describe("Upload Assets Plugin", () => { plugin.apply(({ hooks, logger: dummyLog(), + prefixRelease: (v) => v, git: { options: { ...options, baseUrl: "https://github.my.com/api/v3" }, github: { @@ -297,6 +304,7 @@ describe("Upload Assets Plugin", () => { plugin.apply(({ hooks, logger: dummyLog(), + prefixRelease: (v) => v, git: { options, github: { @@ -330,6 +338,7 @@ describe("Upload Assets Plugin", () => { plugin.apply(({ hooks, logger: dummyLog(), + prefixRelease: (v) => v, git: { options, github: { @@ -373,6 +382,7 @@ describe("Upload Assets Plugin", () => { plugin.apply(({ hooks, logger: dummyLog(), + prefixRelease: (v) => v, git: { options, github: { @@ -405,15 +415,16 @@ describe("Upload Assets Plugin", () => { const hooks = makeHooks(); const deleteReleaseAsset = jest.fn(); const uploadReleaseAsset = jest.fn().mockResolvedValue({}); - const createRelease = jest.fn().mockResolvedValue({ data: { id: 1 } }); + const getReleaseByTag = jest.fn().mockResolvedValue({ data: { id: 1 } }); plugin.apply(({ hooks, logger: dummyLog(), + prefixRelease: (v) => v, git: { options, github: { - repos: { uploadReleaseAsset, createRelease, deleteReleaseAsset }, + repos: { uploadReleaseAsset, getReleaseByTag, deleteReleaseAsset }, paginate: jest.fn().mockResolvedValue(new Array(303).fill({})), }, }, @@ -443,15 +454,16 @@ describe("Upload Assets Plugin", () => { const hooks = makeHooks(); const deleteReleaseAsset = jest.fn(); const uploadReleaseAsset = jest.fn().mockResolvedValue({}); - const createRelease = jest.fn().mockResolvedValue({ data: { id: 1 } }); + const getReleaseByTag = jest.fn().mockResolvedValue({ data: { id: 1 } }); plugin.apply(({ hooks, logger: dummyLog(), + prefixRelease: (v) => v, git: { options, github: { - repos: { uploadReleaseAsset, createRelease, deleteReleaseAsset }, + repos: { uploadReleaseAsset, getReleaseByTag, deleteReleaseAsset }, paginate: jest.fn().mockResolvedValue(new Array(300).fill({})), }, },