Skip to content

Commit

Permalink
Merge pull request #1802 from intuit/upload-assets-canary
Browse files Browse the repository at this point in the history
Don't create "Canary Release Assets" during non-canary builds + Change that releases tag to valid semver
  • Loading branch information
hipstersmoothie committed Feb 11, 2021
2 parents 978d6b5 + 9809ccf commit 8367182
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 16 deletions.
13 changes: 6 additions & 7 deletions plugins/upload-assets/__tests__/upload-assets-ci.test.ts
Expand Up @@ -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,
Expand Down
23 changes: 18 additions & 5 deletions plugins/upload-assets/__tests__/upload-assets.test.ts
Expand Up @@ -34,6 +34,7 @@ describe("Upload Assets Plugin", () => {
plugin.apply(({
hooks,
logger: dummyLog(),
prefixRelease: (v) => v,
git: {
options,
github: {
Expand Down Expand Up @@ -64,6 +65,7 @@ describe("Upload Assets Plugin", () => {
plugin.apply(({
hooks,
logger: dummyLog(),
prefixRelease: (v) => v,
git: {
options,
github: {
Expand Down Expand Up @@ -93,6 +95,7 @@ describe("Upload Assets Plugin", () => {
release_id: "123",
})
);
expect(createRelease).not.toHaveBeenCalled();
});

test("should upload a single canary asset", async () => {
Expand All @@ -110,6 +113,7 @@ describe("Upload Assets Plugin", () => {
plugin.apply(({
hooks,
logger: dummyLog(),
prefixRelease: (v) => v,
git: {
options,
github: {
Expand Down Expand Up @@ -147,6 +151,7 @@ describe("Upload Assets Plugin", () => {
plugin.apply(({
hooks,
logger: dummyLog(),
prefixRelease: (v) => v,
git: {
options,
github: {
Expand Down Expand Up @@ -184,6 +189,7 @@ describe("Upload Assets Plugin", () => {
plugin.apply(({
hooks,
logger: dummyLog(),
prefixRelease: (v) => v,
git: {
options,
github: {
Expand All @@ -196,7 +202,7 @@ describe("Upload Assets Plugin", () => {
await hooks.canary.promise({
canaryIdentifier: "canary.123",
bump: SEMVER.patch,
dryRun: true
dryRun: true,
});

expect(uploadReleaseAsset).not.toHaveBeenCalled();
Expand All @@ -217,6 +223,7 @@ describe("Upload Assets Plugin", () => {
plugin.apply(({
hooks,
logger: dummyLog(),
prefixRelease: (v) => v,
git: {
options,
github: {
Expand Down Expand Up @@ -250,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: {
Expand Down Expand Up @@ -296,6 +304,7 @@ describe("Upload Assets Plugin", () => {
plugin.apply(({
hooks,
logger: dummyLog(),
prefixRelease: (v) => v,
git: {
options,
github: {
Expand Down Expand Up @@ -329,6 +338,7 @@ describe("Upload Assets Plugin", () => {
plugin.apply(({
hooks,
logger: dummyLog(),
prefixRelease: (v) => v,
git: {
options,
github: {
Expand Down Expand Up @@ -372,6 +382,7 @@ describe("Upload Assets Plugin", () => {
plugin.apply(({
hooks,
logger: dummyLog(),
prefixRelease: (v) => v,
git: {
options,
github: {
Expand Down Expand Up @@ -404,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({})),
},
},
Expand Down Expand Up @@ -442,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({})),
},
},
Expand Down
24 changes: 20 additions & 4 deletions plugins/upload-assets/src/index.ts
Expand Up @@ -15,9 +15,11 @@ 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);
const canaryTag = "0.0.0-canary";

const requiredPluginOptions = t.interface({
/** Paths to assets to upload */
Expand Down Expand Up @@ -80,7 +82,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"
Expand Down Expand Up @@ -233,21 +235,30 @@ export default class UploadAssetsPlugin implements IPlugin {
.reduce((acc, item) => [...acc, ...item], []);
}

// prettier-ignore
private async getCanaryGitHubRelease(auto: Auto): Promise<GitHubRelease | undefined>
// prettier-ignore
private async getCanaryGitHubRelease(auto: Auto, create: true): Promise<GitHubRelease>
// prettier-ignore
/** Get the release all the canaries are stored in */
private async getCanaryGitHubRelease(auto: Auto) {
private async getCanaryGitHubRelease(auto: Auto, create = false): Promise<GitHubRelease | undefined> {
try {
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;
} catch (error) {
if (!create) {
return;
}

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.`,
Expand All @@ -260,6 +271,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,
{
Expand Down

0 comments on commit 8367182

Please sign in to comment.