Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions src/lib/prisma/migrations/02_cache_app_version/migration.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
-- CreateTable
CREATE TABLE "public"."appVersion" (
"appName" TEXT NOT NULL,
"version" TEXT NOT NULL,
"imageHash" TEXT NOT NULL,
"created" TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated" TIMESTAMP(6),

CONSTRAINT "appVersion_pkey" PRIMARY KEY ("appName")
);
8 changes: 8 additions & 0 deletions src/lib/prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -104,3 +104,11 @@ model release {

@@index([build_id], map: "idx_release_build_id")
}

model appVersion {
appName String @id
version String
imageHash String
created DateTime @default(now()) @db.Timestamp(6)
updated DateTime? @updatedAt @db.Timestamp(6)
}
35 changes: 34 additions & 1 deletion src/lib/server/bullmq/BullWorker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export abstract class BullWorker<T extends BullMQ.Job> {
abstract run(job: Job<T>): Promise<unknown>;
}

export class SystemStartup<J extends BullMQ.SystemJob> extends BullWorker<J> {
export class SystemStartup<J extends BullMQ.StartupJob> extends BullWorker<J> {
private jobsLeft = 0;
constructor() {
super(BullMQ.QueueName.System_Startup);
Expand All @@ -32,6 +32,12 @@ export class SystemStartup<J extends BullMQ.SystemJob> extends BullWorker<J> {
{
type: BullMQ.JobType.System_CreateCodeBuildProject
}
],
[
'Refresh AppVersions (Startup)',
{
type: BullMQ.JobType.System_RefreshAppVersions
}
]
] as const;
startupJobs.forEach(([name, data]) => {
Expand All @@ -49,6 +55,33 @@ export class SystemStartup<J extends BullMQ.SystemJob> extends BullWorker<J> {
return Executor.System.createCodeBuildProject(
job as Job<BullMQ.System.CreateCodeBuildProject>
);
case BullMQ.JobType.System_RefreshAppVersions:
return Executor.System.refreshAppVersions(job as Job<BullMQ.System.RefreshAppVersions>);
}
}
}

export class SystemRecurring<J extends BullMQ.RecurringJob> extends BullWorker<J> {
constructor() {
super(BullMQ.QueueName.System_Recurring);
getQueues().SystemRecurring.upsertJobScheduler(
BullMQ.JobSchedulerId.RefreshAppVersions,
{
pattern: '@hourly',
immediately: false
},
{
name: 'Refresh AppVersions',
data: {
type: BullMQ.JobType.System_RefreshAppVersions
}
}
);
}
async run(job: Job<J>) {
switch (job.data.type) {
case BullMQ.JobType.System_RefreshAppVersions:
return Executor.System.refreshAppVersions(job as Job<BullMQ.System.RefreshAppVersions>);
}
}
}
Expand Down
17 changes: 14 additions & 3 deletions src/lib/server/bullmq/queues.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
import { Queue } from 'bullmq';
import { Redis } from 'ioredis';
import type { BuildJob, PollJob, ProjectJob, PublishJob, S3Job, SystemJob } from './types';
import type {
BuildJob,
PollJob,
ProjectJob,
PublishJob,
RecurringJob,
S3Job,
StartupJob
} from './types';
import { QueueName } from './types';
import { env } from '$env/dynamic/private';

Expand Down Expand Up @@ -98,14 +106,17 @@ function createQueues() {
/** Queue for jobs that poll BuildEngine, such as checking the status of a build */
const Polling = new Queue<PollJob>(QueueName.Polling, getQueueConfig());
/** Queue for jobs that run on startup, such as creating the CodeBuild project */
const SystemStartup = new Queue<SystemJob>(QueueName.System_Startup, getQueueConfig());
const SystemStartup = new Queue<StartupJob>(QueueName.System_Startup, getQueueConfig());
/** Queue for default recurring jobs such as refreshing the cached AppVersions */
const SystemRecurring = new Queue<RecurringJob>(QueueName.System_Recurring, getQueueConfig());
return {
Builds,
S3,
Projects,
Releases,
Polling,
SystemStartup
SystemStartup,
SystemRecurring
};
}
export function getQueues() {
Expand Down
19 changes: 16 additions & 3 deletions src/lib/server/bullmq/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ export enum QueueName {
Projects = 'Projects',
Releases = 'Releases',
Polling = 'Polling',
System_Startup = 'System (Startup)'
System_Startup = 'System (Startup)',
System_Recurring = 'System (Recurring)'
}

export enum JobType {
Expand All @@ -38,7 +39,12 @@ export enum JobType {
S3_CopyArtifacts = 'Copy Artifacts to S3',
S3_CopyError = 'Copy Errors to S3',
// System Jobs
System_CreateCodeBuildProject = 'Create CodeBuild Project'
System_CreateCodeBuildProject = 'Create CodeBuild Project',
System_RefreshAppVersions = 'Refresh AppVersions'
}

export enum JobSchedulerId {
RefreshAppVersions = 'RefreshAppVersions'
}

export namespace Build {
Expand Down Expand Up @@ -96,6 +102,9 @@ export namespace System {
export interface CreateCodeBuildProject {
type: JobType.System_CreateCodeBuildProject;
}
export interface RefreshAppVersions {
type: JobType.System_RefreshAppVersions;
}
}

export type Job = JobTypeMap[keyof JobTypeMap];
Expand All @@ -105,7 +114,10 @@ export type S3Job = JobTypeMap[JobType.S3_CopyArtifacts | JobType.S3_CopyError];
export type PublishJob = JobTypeMap[JobType.Release_Product];
export type PollJob = JobTypeMap[JobType.Poll_Build | JobType.Poll_Release];
export type ProjectJob = JobTypeMap[JobType.Project_Create];
export type SystemJob = JobTypeMap[JobType.System_CreateCodeBuildProject];
export type StartupJob = JobTypeMap[
| JobType.System_CreateCodeBuildProject
| JobType.System_RefreshAppVersions];
export type RecurringJob = JobTypeMap[JobType.System_RefreshAppVersions];

export type JobTypeMap = {
[JobType.Build_Product]: Build.Product;
Expand All @@ -116,5 +128,6 @@ export type JobTypeMap = {
[JobType.S3_CopyArtifacts]: S3.CopyArtifacts;
[JobType.S3_CopyError]: S3.CopyErrors;
[JobType.System_CreateCodeBuildProject]: System.CreateCodeBuildProject;
[JobType.System_RefreshAppVersions]: System.RefreshAppVersions;
// Add more mappings here as needed
};
Loading