Skip to content

Commit 56bc7d0

Browse files
authored
populate reporting endpoints (#16)
* populate reporting endpoints * Create dryRun functionality * Add new index * Wait longer for discord * Always disconnect discord
1 parent b795c3c commit 56bc7d0

File tree

15 files changed

+268
-122
lines changed

15 files changed

+268
-122
lines changed

firestore.indexes.json

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,23 @@
11
{
22
"indexes": [
3+
{
4+
"collectionGroup": "repoVersions",
5+
"queryScope": "COLLECTION",
6+
"fields": [
7+
{
8+
"fieldPath": "major",
9+
"order": "DESCENDING"
10+
},
11+
{
12+
"fieldPath": "minor",
13+
"order": "DESCENDING"
14+
},
15+
{
16+
"fieldPath": "patch",
17+
"order": "DESCENDING"
18+
}
19+
]
20+
},
321
{
422
"collectionGroup": "unityVersions",
523
"queryScope": "COLLECTION",

functions/src/api/reportBuildFailure.ts

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,34 @@ import { firebase, functions } from '../config/firebase';
22
import { Request } from 'firebase-functions/lib/providers/https';
33
import { Response } from 'express-serve-static-core';
44
import { Token } from '../config/token';
5+
import { BuildFailure, CiBuilds } from '../model/ciBuilds';
6+
import { CiJobs } from '../model/ciJobs';
7+
import { Discord } from '../config/discord';
58

69
export const reportBuildFailure = functions.https.onRequest(async (req: Request, res: Response) => {
7-
if (!Token.isValid(req.header('Authorisation'))) {
8-
firebase.logger.warn('unauthorised request', req);
9-
res.status(403).send('Unauthorized');
10-
return;
11-
}
10+
try {
11+
if (!Token.isValid(req.header('authorization'))) {
12+
firebase.logger.warn('unauthorised request', req.headers);
13+
res.status(403).send('Unauthorized');
14+
return;
15+
}
16+
17+
const { body } = req;
18+
const { jobId, buildId, reason } = body;
19+
const failure: BuildFailure = { reason };
1220

13-
firebase.logger.info('Build failure reported.', req);
21+
await CiJobs.markFailureForJob(jobId);
22+
await CiBuilds.markBuildAsFailed(buildId, failure);
1423

15-
res.status(200).send('OK');
24+
firebase.logger.info('Build failure reported.', body);
25+
res.status(200).send('OK');
26+
} catch (err) {
27+
const message = `
28+
Something went wrong while wrong while reporting a build failure
29+
${err.message} (${err.status})\n${err.stackTrace}
30+
`;
31+
firebase.logger.error(message);
32+
await Discord.sendAlert(message);
33+
res.status(500).send('Something went wrong');
34+
}
1635
});

functions/src/api/reportNewBuild.ts

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,56 @@ import { firebase, functions } from '../config/firebase';
22
import { Request } from 'firebase-functions/lib/providers/https';
33
import { Response } from 'express-serve-static-core';
44
import { Token } from '../config/token';
5+
import { BuildInfo, CiBuilds, ImageType } from '../model/ciBuilds';
6+
import { CiJobs } from '../model/ciJobs';
7+
import { Discord } from '../config/discord';
8+
import { EditorVersionInfo } from '../model/editorVersionInfo';
9+
import { RepoVersionInfo } from '../model/repoVersions';
510

611
export const reportNewBuild = functions.https.onRequest(async (req: Request, res: Response) => {
7-
if (!Token.isValid(req.header('Authorisation'))) {
8-
firebase.logger.warn('unauthorised request', req);
9-
res.status(403).send('Unauthorized');
10-
return;
11-
}
12+
try {
13+
if (!Token.isValid(req.header('authorization'))) {
14+
firebase.logger.warn('unauthorised request', req.headers);
15+
res.status(403).send('Unauthorized');
16+
return;
17+
}
18+
19+
const { body } = req;
20+
const { buildId, jobId, imageType, baseOs, repoVersion, editorVersion, targetPlatform } = body;
21+
const buildInfo: BuildInfo = {
22+
baseOs,
23+
repoVersion,
24+
editorVersion,
25+
targetPlatform,
26+
};
1227

13-
firebase.logger.info('new build reported', req);
28+
if (jobId === 'dryRun') {
29+
await createDryRunJob(imageType, editorVersion);
30+
}
1431

15-
res.status(200).send('OK');
32+
await CiJobs.markJobAsInProgress(jobId);
33+
await CiBuilds.registerNewBuild(buildId, jobId, imageType, buildInfo);
34+
35+
firebase.logger.info('new build reported', body);
36+
res.status(200).send('OK');
37+
} catch (err) {
38+
const message = `
39+
Something went wrong while wrong while reporting a new build.
40+
${err.message} (${err.status})\n${err.stackTrace}
41+
`;
42+
firebase.logger.error(message);
43+
await Discord.sendAlert(message);
44+
res.status(500).send('Something went wrong');
45+
}
1646
});
47+
48+
const createDryRunJob = async (imageType: ImageType, editorVersion: string) => {
49+
const repoVersionInfo = await RepoVersionInfo.getLatest();
50+
51+
if (imageType === 'editor') {
52+
const editorVersionInfo = await EditorVersionInfo.get(editorVersion);
53+
await CiJobs.create(imageType, repoVersionInfo, editorVersionInfo);
54+
} else {
55+
await CiJobs.create(imageType, repoVersionInfo);
56+
}
57+
};

functions/src/api/reportPublication.ts

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,41 @@ import { firebase, functions } from '../config/firebase';
22
import { Request } from 'firebase-functions/lib/providers/https';
33
import { Response } from 'express-serve-static-core';
44
import { Token } from '../config/token';
5+
import { CiBuilds, DockerInfo } from '../model/ciBuilds';
6+
import { CiJobs } from '../model/ciJobs';
7+
import { Discord } from '../config/discord';
58

69
export const reportPublication = functions.https.onRequest(async (req: Request, res: Response) => {
7-
if (!Token.isValid(req.header('Authorisation'))) {
8-
firebase.logger.warn('unauthorised request', req);
9-
res.status(403).send('Unauthorized');
10-
return;
11-
}
10+
try {
11+
if (!Token.isValid(req.header('authorization'))) {
12+
firebase.logger.warn('unauthorised request', req.headers);
13+
res.status(403).send('Unauthorized');
14+
return;
15+
}
16+
17+
const { body } = req;
18+
const { jobId, buildId, imageRepo, imageName, friendlyTag, specificTag, digest } = body;
19+
const dockerInfo: DockerInfo = { imageRepo, imageName, friendlyTag, specificTag, digest };
1220

13-
firebase.logger.info('Publication reported.', req);
21+
await CiBuilds.markBuildAsPublished(buildId, dockerInfo);
22+
const jobHasCompleted = await CiBuilds.haveAllBuildsForJobBeenPublished(jobId);
23+
firebase.logger.info('Publication reported.', body);
1424

15-
res.status(200).send('OK');
25+
if (jobHasCompleted) {
26+
await CiJobs.markJobAsCompleted(jobId);
27+
const message = `Job completed for ${jobId}.`;
28+
firebase.logger.info(message);
29+
await Discord.sendMessageToMaintainers(message);
30+
}
31+
32+
res.status(200).send('OK');
33+
} catch (err) {
34+
const message = `
35+
Something went wrong while wrong while reporting a new publication
36+
${err.message} (${err.status})\n${err.stackTrace}
37+
`;
38+
firebase.logger.error(message);
39+
await Discord.sendAlert(message);
40+
res.status(500).send('Something went wrong');
41+
}
1642
});

functions/src/api/unityVersions.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { Request } from 'firebase-functions/lib/providers/https';
22
import { Response } from 'express-serve-static-core';
33
import { firebase, functions } from '../config/firebase';
4-
import { UnityVersionInfo } from '../model/unityVersionInfo';
4+
import { EditorVersionInfo } from '../model/editorVersionInfo';
55

66
export const unityVersions = functions.https.onRequest(
77
async (request: Request, response: Response) => {
88
try {
9-
const versions = await UnityVersionInfo.getAllIds();
9+
const versions = await EditorVersionInfo.getAllIds();
1010

1111
response.send(versions);
1212
} catch (err) {

functions/src/config/discord.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ export class Discord {
3737
const i = await this.getInstance();
3838

3939
// Todo - retry mechanism
40-
4140
await i.createMessage(channelId, message, files);
41+
await this.disconnect();
4242
return true;
4343
} catch (err) {
4444
firebase.logger.error('An error occurred while trying to send a message to discord.', err);
@@ -72,7 +72,7 @@ export class Discord {
7272
await new Promise((resolve) => setTimeout(resolve, 1000));
7373
secondsWaited += 1;
7474

75-
if (secondsWaited >= 8) {
75+
if (secondsWaited >= 15) {
7676
throw new Error('Bot never became ready');
7777
}
7878
}

functions/src/cron/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ export const trigger = functions.pubsub
2020

2121
firebase.logger.error(message);
2222
await Discord.sendAlert(message);
23-
} finally {
24-
await Discord.disconnect();
2523
}
2624
});
2725

functions/src/logic/buildQueue/generateBuildQueueFromNewVersionInfo.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { UnityVersionInfo } from '../../model/unityVersionInfo';
1+
import { EditorVersionInfo } from '../../model/editorVersionInfo';
22
import { db } from '../../config/firebase';
33

44
export const generateBuildQueueFromNewVersionInfoList = async (
5-
versionInfoList: UnityVersionInfo[],
5+
versionInfoList: EditorVersionInfo[],
66
) => {
77
const batch = db.batch();
88

functions/src/logic/ingestUnityVersions/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,5 @@ export const ingestUnityVersions = async () => {
1515

1616
firebase.logger.error(message);
1717
await Discord.sendAlert(message);
18-
} finally {
19-
await Discord.disconnect();
2018
}
2119
};

functions/src/logic/ingestUnityVersions/scrapeVersions.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { getDocumentFromUrl } from '../utils/get-document-from-url';
2-
import { UnityVersionInfo } from '../../model/unityVersionInfo';
2+
import { EditorVersionInfo } from '../../model/editorVersionInfo';
33

44
const UNITY_ARCHIVE_URL = 'https://unity3d.com/get-unity/download/archive';
55

66
/**
77
* Based on https://github.com/BLaZeKiLL/unity-scraper
88
*/
9-
export const scrapeVersions = async (): Promise<UnityVersionInfo[]> => {
9+
export const scrapeVersions = async (): Promise<EditorVersionInfo[]> => {
1010
const document = await getDocumentFromUrl(UNITY_ARCHIVE_URL);
1111

1212
const links = Array.from(document.querySelectorAll('a.unityhub[href]'));

0 commit comments

Comments
 (0)