Skip to content

Commit

Permalink
[cli][client] Add step for checks (vercel#6889)
Browse files Browse the repository at this point in the history
* [cli][client] Add step for checks

* Update output

* Remove skipped message

* Correctly use `finishedEvents`

* Update packages/cli/src/commands/deploy/index.ts

Co-authored-by: Chris <7249920+chriswdmr@users.noreply.github.com>

* Add back deleted files

Co-authored-by: Chris <7249920+chriswdmr@users.noreply.github.com>
  • Loading branch information
AndyBitz and chriswdmr authored Oct 27, 2021
1 parent 2bf060c commit 28e71ff
Show file tree
Hide file tree
Showing 5 changed files with 121 additions and 1 deletion.
15 changes: 15 additions & 0 deletions packages/cli/src/commands/deploy/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ import { getCommandName } from '../../util/pkg-name';
import { getPreferredPreviewURL } from '../../util/deploy/get-preferred-preview-url';
import { Output } from '../../util/output';
import { help } from './args';
import { getDeploymentChecks } from '../../util/deploy/get-deployment-checks';

export default async (client: Client) => {
const { output } = client;
Expand Down Expand Up @@ -529,6 +530,20 @@ export default async (client: Client) => {
return 1;
}

if (deployment.checksConclusion === 'failed') {
const { checks } = await getDeploymentChecks(client, deployment.id);
const counters = new Map<string, number>();
checks.forEach(c => {
counters.set(c.conclusion, (counters.get(c.conclusion) ?? 0) + 1);
});

const counterList = Array.from(counters)
.map(([name, no]) => `${no} ${name}`)
.join(', ');
output.error(`Running Checks: ${counterList}`);
return 1;
}

const deploymentResponse = await getDeploymentByIdOrHost(
client,
contextName,
Expand Down
37 changes: 37 additions & 0 deletions packages/cli/src/util/deploy/get-deployment-checks.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import Client from '../client';

type CheckStatus = 'registered' | 'running' | 'completed';
type CheckConclusion =
| 'canceled'
| 'failed'
| 'neutral'
| 'succeeded'
| 'skipped'
| 'stale';

export interface DeploymentCheck {
id: string;
status: CheckStatus;
conclusion: CheckConclusion;
name: string;
startedAt: number;
completedAt: number;
createdAt: number;
updatedAt: number;
integrationId: string;
rerequestable: boolean;
}

export interface DeploymentChecksResponse {
checks: DeploymentCheck[];
}

export async function getDeploymentChecks(
client: Client,
deploymentId: string
) {
const checksResponse = await client.fetch<DeploymentChecksResponse>(
`/v1/deployments/${encodeURIComponent(deploymentId)}/checks`
);
return checksResponse;
}
18 changes: 17 additions & 1 deletion packages/cli/src/util/deploy/process-deployment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -182,10 +182,26 @@ export default async function processDeployment({
return event.payload;
}

if (event.type === 'ready') {
// If `checksState` is present, we can only continue to "Completing" if the checks finished,
// otherwise we might show "Completing" before "Running Checks".
if (
event.type === 'ready' &&
(event.payload.checksState
? event.payload.checksState === 'completed'
: true)
) {
output.spinner('Completing', 0);
}

if (event.type === 'checks-running') {
output.spinner('Running Checks', 0);
}

if (event.type === 'checks-conclusion-failed') {
output.stopSpinner();
return event.payload;
}

// Handle error events
if (event.type === 'error') {
output.stopSpinner();
Expand Down
44 changes: 44 additions & 0 deletions packages/client/src/check-deployment-status.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,50 @@ export async function* checkDeploymentStatus(
yield { type: 'ready', payload: deploymentUpdate };
}

if (deploymentUpdate.checksState !== undefined) {
if (
deploymentUpdate.checksState === 'completed' &&
!finishedEvents.has('checks-completed')
) {
finishedEvents.add('checks-completed');

if (deploymentUpdate.checksConclusion === 'succeeded') {
yield {
type: 'checks-conclusion-succeeded',
payload: deploymentUpdate,
};
} else if (deploymentUpdate.checksConclusion === 'failed') {
yield { type: 'checks-conclusion-failed', payload: deploymentUpdate };
} else if (deploymentUpdate.checksConclusion === 'skipped') {
yield {
type: 'checks-conclusion-skipped',
payload: deploymentUpdate,
};
} else if (deploymentUpdate.checksConclusion === 'canceled') {
yield {
type: 'checks-conclusion-canceled',
payload: deploymentUpdate,
};
}
}

if (
deploymentUpdate.checksState === 'registered' &&
!finishedEvents.has('checks-registered')
) {
finishedEvents.add('checks-registered');
yield { type: 'checks-registered', payload: deploymentUpdate };
}

if (
deploymentUpdate.checksState === 'running' &&
!finishedEvents.has('checks-running')
) {
finishedEvents.add('checks-running');
yield { type: 'checks-running', payload: deploymentUpdate };
}
}

if (isAliasAssigned(deploymentUpdate)) {
debug('Deployment alias assigned');
return yield { type: 'alias-assigned', payload: deploymentUpdate };
Expand Down
8 changes: 8 additions & 0 deletions packages/client/src/utils/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,14 @@ const EVENTS_ARRAY = [
'notice',
'tip',
'canceled',
// Checks events
'checks-registered',
'checks-completed',
'checks-running',
'checks-conclusion-succeeded',
'checks-conclusion-failed',
'checks-conclusion-skipped',
'checks-conclusion-canceled',
] as const;

export type DeploymentEventType = typeof EVENTS_ARRAY[number];
Expand Down

0 comments on commit 28e71ff

Please sign in to comment.