Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Don't create "Canary Release Assets" during non-canary builds + Change that releases tag to valid semver #1802

Merged
merged 4 commits into from Feb 11, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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