Putting a better startup process in place for app migrations and adding them to bullboard as well.

This commit is contained in:
mike12345567 2024-06-10 21:37:01 +01:00
parent 26c2904f51
commit 739ac5d03c
4 changed files with 42 additions and 19 deletions

View File

@ -1,4 +1,4 @@
import queue from "./queue" import { getAppMigrationQueue } from "./queue"
import { Next } from "koa" import { Next } from "koa"
import { getAppMigrationVersion } from "./appMigrationMetadata" import { getAppMigrationVersion } from "./appMigrationMetadata"
import { MIGRATIONS } from "./migrations" import { MIGRATIONS } from "./migrations"
@ -37,8 +37,10 @@ export async function checkMissingMigrations(
) { ) {
const currentVersion = await getAppMigrationVersion(appId) const currentVersion = await getAppMigrationVersion(appId)
const latestMigration = getLatestEnabledMigrationId() const latestMigration = getLatestEnabledMigrationId()
const queue = getAppMigrationQueue()
if ( if (
queue &&
latestMigration && latestMigration &&
getTimestamp(currentVersion) < getTimestamp(latestMigration) getTimestamp(currentVersion) < getTimestamp(latestMigration)
) { ) {

View File

@ -4,9 +4,22 @@ import { MIGRATIONS } from "./migrations"
import { processMigrations } from "./migrationsProcessor" import { processMigrations } from "./migrationsProcessor"
import { apiEnabled } from "../features" import { apiEnabled } from "../features"
const MAX_ATTEMPTS = 3 const MAX_ATTEMPTS = 1
const appMigrationQueue = queue.createQueue(queue.JobQueue.APP_MIGRATION, { export type AppMigrationJob = {
appId: string
}
let appMigrationQueue: queue.Queue<AppMigrationJob> | undefined
export function init() {
// only run app migrations in main API services
if (!apiEnabled()) {
return
}
const appMigrationQueue = queue.createQueue<AppMigrationJob>(
queue.JobQueue.APP_MIGRATION,
{
jobOptions: { jobOptions: {
attempts: MAX_ATTEMPTS, attempts: MAX_ATTEMPTS,
removeOnComplete: true, removeOnComplete: true,
@ -18,11 +31,10 @@ const appMigrationQueue = queue.createQueue(queue.JobQueue.APP_MIGRATION, {
`App migration failed, queue job ID: ${job.id} - reason: ${job.failedReason}` `App migration failed, queue job ID: ${job.id} - reason: ${job.failedReason}`
) )
}, },
}) }
)
// only run app migrations in main API services return appMigrationQueue.process(processMessage)
if (apiEnabled()) {
appMigrationQueue.process(processMessage)
} }
async function processMessage(job: Job) { async function processMessage(job: Job) {
@ -31,4 +43,6 @@ async function processMessage(job: Job) {
await processMigrations(appId, MIGRATIONS) await processMigrations(appId, MIGRATIONS)
} }
export default appMigrationQueue export function getAppMigrationQueue() {
return appMigrationQueue
}

View File

@ -3,6 +3,7 @@ import { KoaAdapter } from "@bull-board/koa"
import { queue } from "@budibase/backend-core" import { queue } from "@budibase/backend-core"
import * as automation from "../threads/automation" import * as automation from "../threads/automation"
import { backups } from "@budibase/pro" import { backups } from "@budibase/pro"
import { getAppMigrationQueue } from "../appMigrations/queue"
import { createBullBoard } from "@bull-board/api" import { createBullBoard } from "@bull-board/api"
import BullQueue from "bull" import BullQueue from "bull"
@ -16,10 +17,14 @@ const PATH_PREFIX = "/bulladmin"
export async function init() { export async function init() {
// Set up queues for bull board admin // Set up queues for bull board admin
const backupQueue = backups.getBackupQueue() const backupQueue = backups.getBackupQueue()
const appMigrationQueue = getAppMigrationQueue()
const queues = [automationQueue] const queues = [automationQueue]
if (backupQueue) { if (backupQueue) {
queues.push(backupQueue) queues.push(backupQueue)
} }
if (appMigrationQueue) {
queues.push(appMigrationQueue)
}
const adapters = [] const adapters = []
const serverAdapter: any = new KoaAdapter() const serverAdapter: any = new KoaAdapter()
for (let queue of queues) { for (let queue of queues) {

View File

@ -15,6 +15,7 @@ import * as fileSystem from "../utilities/fileSystem"
import { default as eventEmitter, init as eventInit } from "../events" import { default as eventEmitter, init as eventInit } from "../events"
import * as migrations from "../migrations" import * as migrations from "../migrations"
import * as bullboard from "../automations/bullboard" import * as bullboard from "../automations/bullboard"
import * as appMigrations from "../appMigrations/queue"
import * as pro from "@budibase/pro" import * as pro from "@budibase/pro"
import * as api from "../api" import * as api from "../api"
import sdk from "../sdk" import sdk from "../sdk"
@ -114,6 +115,7 @@ export async function startup(
// configure events to use the pro audit log write // configure events to use the pro audit log write
// can't integrate directly into backend-core due to cyclic issues // can't integrate directly into backend-core due to cyclic issues
queuePromises.push(events.processors.init(pro.sdk.auditLogs.write)) queuePromises.push(events.processors.init(pro.sdk.auditLogs.write))
queuePromises.push(appMigrations.init())
if (automationsEnabled()) { if (automationsEnabled()) {
queuePromises.push(automations.init()) queuePromises.push(automations.init())
} }