Skip to content

Commit 5f582b6

Browse files
committed
feat: prune caches on version change
1 parent 10b136a commit 5f582b6

File tree

3 files changed

+63
-4
lines changed

3 files changed

+63
-4
lines changed

lib/db/index.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,16 @@ export interface UploadPartsTable {
3030
e_tag: string | null
3131
}
3232

33+
export interface MetaTable {
34+
key: 'version'
35+
value: string
36+
}
37+
3338
export interface Database {
3439
cache_keys: CacheKeysTable
3540
uploads: UploadsTable
3641
upload_parts: UploadPartsTable
42+
meta: MetaTable
3743
}
3844

3945
let _db: Kysely<Database>
@@ -238,3 +244,18 @@ export async function uploadExists(db: DB, { key, version }: { key: string; vers
238244
.executeTakeFirst()
239245
return !!row
240246
}
247+
248+
export async function upsertVersion(db: DB, version: string) {
249+
const existing = await db
250+
.selectFrom('meta')
251+
.where('key', '=', 'version')
252+
.select('value')
253+
.executeTakeFirst()
254+
if (existing) {
255+
await db.updateTable('meta').set('value', version).where('key', '=', 'version').execute()
256+
} else {
257+
await db.insertInto('meta').values({ key: 'version', value: version }).execute()
258+
}
259+
260+
return version !== existing?.value
261+
}

lib/db/migrations.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type { DatabaseDriverName } from '~/lib/db/drivers'
44

55
export function migrations(dbType: DatabaseDriverName) {
66
return {
7-
cache_keys_table: {
7+
$0_cache_keys_table: {
88
async up(db) {
99
let query = db.schema
1010
.createTable('cache_keys')
@@ -22,7 +22,7 @@ export function migrations(dbType: DatabaseDriverName) {
2222
await db.schema.dropTable('cache_keys').ifExists().execute()
2323
},
2424
},
25-
uploads_and_upload_parts_tables: {
25+
$1_uploads_and_upload_parts_tables: {
2626
async up(db) {
2727
await db.schema
2828
.createTable('uploads')
@@ -56,5 +56,18 @@ export function migrations(dbType: DatabaseDriverName) {
5656
await db.schema.dropTable('upload_parts').ifExists().execute()
5757
},
5858
},
59+
$2_meta_table: {
60+
async up(db) {
61+
await db.schema
62+
.createTable('meta')
63+
.addColumn('key', dbType === 'mysql' ? 'varchar(255)' : 'text', (c) => c.primaryKey())
64+
.addColumn('value', 'text')
65+
.ifNotExists()
66+
.execute()
67+
},
68+
async down(db) {
69+
await db.schema.dropTable('meta').ifExists().execute()
70+
},
71+
},
5972
} satisfies Record<string, Migration>
6073
}

plugins/setup.ts

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { H3Error } from 'h3'
22

3-
import { initializeDatabase } from '~/lib/db'
3+
import { initializeDatabase, useDB } from '~/lib/db'
44
import { ENV } from '~/lib/env'
55
import { logger } from '~/lib/logger'
6-
import { initializeStorage } from '~/lib/storage'
6+
import { initializeStorage, useStorageAdapter } from '~/lib/storage'
77

88
export default defineNitroPlugin(async (nitro) => {
99
logger.info(`🚀 Starting GitHub Actions Cache Server (${useRuntimeConfig().version})`)
@@ -34,6 +34,31 @@ export default defineNitroPlugin(async (nitro) => {
3434
})
3535
}
3636

37+
const version = useRuntimeConfig().version
38+
if (version) {
39+
const db = useDB()
40+
const existing = await db
41+
.selectFrom('meta')
42+
.where('key', '=', 'version')
43+
.select('value')
44+
.executeTakeFirst()
45+
46+
if (!existing || existing.value !== version) {
47+
logger.info(
48+
`Version changed from ${existing?.value ?? '[no version, first install]'} to ${version}. Pruning cache...`,
49+
)
50+
await useStorageAdapter().pruneCaches()
51+
}
52+
53+
if (existing) {
54+
await db.updateTable('meta').set('value', version).where('key', '=', 'version').execute()
55+
} else {
56+
await db.insertInto('meta').values({ key: 'version', value: version }).execute()
57+
}
58+
} else {
59+
logger.warn('No version found in runtime config')
60+
}
61+
3762
if (process.send) process.send('nitro:ready')
3863
})
3964

0 commit comments

Comments
 (0)