Skip to content

Commit a67abae

Browse files
authored
Ingest repo versions (#17)
* Alert that no versions have been ingested yet. * Ingest repository versions * Move types to development deps * Fix typo * Update database indexes * Let us know which ones
1 parent 56bc7d0 commit a67abae

File tree

14 files changed

+226
-21
lines changed

14 files changed

+226
-21
lines changed

firestore.indexes.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"indexes": [
33
{
4-
"collectionGroup": "repoVersions",
4+
"collectionGroup": "editorVersions",
55
"queryScope": "COLLECTION",
66
"fields": [
77
{
@@ -19,7 +19,7 @@
1919
]
2020
},
2121
{
22-
"collectionGroup": "unityVersions",
22+
"collectionGroup": "repoVersions",
2323
"queryScope": "COLLECTION",
2424
"fields": [
2525
{

functions/package-lock.json

Lines changed: 33 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

functions/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,14 @@
2424
"httpie": "^1.1.2",
2525
"jsdom": "^16.4.0",
2626
"lodash": "^4.17.20",
27-
"node-fetch": "^2.6.1"
27+
"node-fetch": "^2.6.1",
28+
"semver": "^7.3.2"
2829
},
2930
"devDependencies": {
3031
"@types/jsdom": "^16.2.4",
3132
"@types/node": "^14.11.5",
3233
"@types/node-fetch": "^2.5.7",
34+
"@types/semver": "^7.3.4",
3335
"@typescript-eslint/eslint-plugin": "^3.9.1",
3436
"@typescript-eslint/parser": "^3.8.0",
3537
"eslint": "^7.6.0",

functions/src/api/repoVerions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
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 { RepoVersionInfo } from '../model/repoVersions';
4+
import { RepoVersionInfo } from '../model/repoVersionInfo';
55

66
export const repoVersions = functions.https.onRequest(
77
async (request: Request, response: Response) => {

functions/src/api/reportNewBuild.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { BuildInfo, CiBuilds, ImageType } from '../model/ciBuilds';
66
import { CiJobs } from '../model/ciJobs';
77
import { Discord } from '../config/discord';
88
import { EditorVersionInfo } from '../model/editorVersionInfo';
9-
import { RepoVersionInfo } from '../model/repoVersions';
9+
import { RepoVersionInfo } from '../model/repoVersionInfo';
1010

1111
export const reportNewBuild = functions.https.onRequest(async (req: Request, res: Response) => {
1212
try {

functions/src/cron/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { EventContext } from 'firebase-functions';
22
import { firebase, functions } from '../config/firebase';
33
import { Discord } from '../config/discord';
44
import { ingestUnityVersions } from '../logic/ingestUnityVersions';
5+
import { ingestRepoVersions } from '../logic/ingestRepoVersions';
56

67
/**
78
* CPU-time for pubSub is not part of the free quota, so we'll keep it light weight.
@@ -24,5 +25,6 @@ export const trigger = functions.pubsub
2425
});
2526

2627
const routineTasks = async () => {
28+
await ingestRepoVersions();
2729
await ingestUnityVersions();
2830
};
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { firebase } from '../../config/firebase';
2+
import { Discord } from '../../config/discord';
3+
import { scrapeVersions } from './scrapeVersions';
4+
import { updateDatabase } from './updateDatabase';
5+
6+
export const ingestRepoVersions = async () => {
7+
try {
8+
const scrapedInfoList = await scrapeVersions();
9+
firebase.logger.info('Found versions', scrapedInfoList);
10+
11+
await updateDatabase(scrapedInfoList);
12+
} catch (err) {
13+
const message = `
14+
Something went wrong while importing repository versions for unity-ci/docker:
15+
${err.message} (${err.status})\n${err.stackTrace}
16+
`;
17+
18+
firebase.logger.error(message);
19+
await Discord.sendAlert(message);
20+
}
21+
};
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import semver from 'semver';
2+
import { RepoVersionInfo } from '../../model/repoVersionInfo';
3+
import { GitHub } from '../../config/github';
4+
5+
export const scrapeVersions = async (): Promise<RepoVersionInfo[]> => {
6+
const gitHub = await GitHub.init();
7+
8+
const releases = await gitHub.repos.listReleases({
9+
owner: 'unity-ci',
10+
repo: 'docker',
11+
});
12+
13+
const versions = releases.data.map((release) => {
14+
const {
15+
id,
16+
url,
17+
name,
18+
body: description,
19+
tag_name: tagName,
20+
author: { login: author },
21+
target_commitish: commitIsh,
22+
} = release;
23+
24+
const version = semver.valid(semver.coerce(tagName));
25+
if (!version) {
26+
throw new Error("Assumed versions to always be parsable, but they're not.");
27+
}
28+
const major = semver.major(version);
29+
const minor = semver.major(version);
30+
const patch = semver.major(version);
31+
32+
return {
33+
version,
34+
major,
35+
minor,
36+
patch,
37+
id,
38+
name,
39+
description,
40+
author,
41+
commitIsh,
42+
url,
43+
};
44+
});
45+
46+
return versions;
47+
};
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { isMatch } from 'lodash';
2+
import { RepoVersionInfo } from '../../model/repoVersionInfo';
3+
import { firebase } from '../../config/firebase';
4+
import { Discord } from '../../config/discord';
5+
6+
const plural = (amount: number) => {
7+
return amount === 1 ? 'version' : 'versions';
8+
};
9+
10+
export const updateDatabase = async (ingestedInfoList: RepoVersionInfo[]): Promise<void> => {
11+
const existingInfoList = await RepoVersionInfo.getAll();
12+
13+
const newVersions: RepoVersionInfo[] = [];
14+
const updatedVersions: RepoVersionInfo[] = [];
15+
16+
ingestedInfoList.forEach((ingestedInfo: RepoVersionInfo) => {
17+
const { version } = ingestedInfo;
18+
const existingVersion = existingInfoList.find((info) => info.version === version);
19+
20+
if (!existingVersion) {
21+
newVersions.push(ingestedInfo);
22+
return;
23+
}
24+
25+
if (!isMatch(existingVersion, ingestedInfo)) {
26+
updatedVersions.push(ingestedInfo);
27+
return;
28+
}
29+
});
30+
31+
let message = '';
32+
33+
if (newVersions.length >= 1) {
34+
await RepoVersionInfo.createMany(newVersions);
35+
message += `
36+
${newVersions.length} new repository ${plural(newVersions.length)} detected.
37+
(${newVersions.map((version) => version.version).join(', ')}`;
38+
}
39+
40+
if (updatedVersions.length >= 1) {
41+
await RepoVersionInfo.updateMany(updatedVersions);
42+
message += `
43+
${updatedVersions.length} updated repository ${plural(updatedVersions.length)} detected.
44+
(${updatedVersions.map((version) => version.version).join(', ')})`;
45+
}
46+
47+
message = message.trimEnd();
48+
if (message.length >= 1) {
49+
firebase.logger.info(message);
50+
await Discord.sendMessageToMaintainers(message);
51+
} else {
52+
firebase.logger.info('Database is up-to-date. (no updated repo versions found)');
53+
}
54+
};

functions/src/logic/ingestUnityVersions/updateDatabase.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { EditorVersionInfo } from '../../model/editorVersionInfo';
21
import { isMatch } from 'lodash';
32
import { firebase } from '../../config/firebase';
43
import { Discord } from '../../config/discord';
4+
import { EditorVersionInfo } from '../../model/editorVersionInfo';
55

66
const plural = (amount: number) => {
77
return amount === 1 ? 'version' : 'versions';
@@ -32,12 +32,16 @@ export const updateDatabase = async (ingestedInfoList: EditorVersionInfo[]): Pro
3232

3333
if (newVersions.length >= 1) {
3434
await EditorVersionInfo.createMany(newVersions);
35-
message += `${newVersions.length} new ${plural(newVersions.length)} detected. `;
35+
message += `
36+
${newVersions.length} new Unity editor ${plural(newVersions.length)} detected.
37+
(${newVersions.map((version) => version.version).join(', ')}`;
3638
}
3739

3840
if (updatedVersions.length >= 1) {
3941
await EditorVersionInfo.updateMany(updatedVersions);
40-
message += `${updatedVersions.length} updated ${plural(updatedVersions.length)} detected. `;
42+
message += `
43+
${updatedVersions.length} updated Unity editor ${plural(updatedVersions.length)} detected.
44+
(${updatedVersions.map((version) => version.version).join(', ')})`;
4145
}
4246

4347
message = message.trimEnd();

0 commit comments

Comments
 (0)