Skip to content

Commit 484cb26

Browse files
RihanArfanatinux
andauthored
feat: apply migrations during deployment (#44)
Co-authored-by: Sébastien Chopin <[email protected]>
1 parent 4c4e592 commit 484cb26

File tree

1 file changed

+34
-19
lines changed

1 file changed

+34
-19
lines changed

src/commands/deploy.mjs

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ export default defineCommand({
128128
}
129129
// #endregion
130130

131-
// #region Deploy
131+
// #region Prepare deployment
132132
const distDir = join(cwd, 'dist')
133133
const storage = await getStorage(distDir).catch((err) => {
134134
consola.error(err.message.includes('directory not found') ? `${err.message}, please make sure that you have built your project.` : err.message)
@@ -147,7 +147,7 @@ export default defineCommand({
147147
spinnerColorIndex = (spinnerColorIndex + 1) % spinnerColors.length
148148
}, 2500)
149149

150-
let deployment
150+
let deploymentKey, serverFiles, metaFiles
151151
try {
152152
const publicFiles = await getPublicFiles(storage, pathsToDeploy)
153153

@@ -170,7 +170,8 @@ export default defineCommand({
170170
}
171171
})
172172
spinner.succeed(`${colors.blueBright(linkedProject.slug)} ready to deploy.`)
173-
const { deploymentKey, missingPublicHashes, cloudflareUploadJwt } = deploymentInfo
173+
const { missingPublicHashes, cloudflareUploadJwt } = deploymentInfo
174+
deploymentKey = deploymentInfo.deploymentKey
174175
const publicFilesToUpload = publicFiles.filter(file => missingPublicHashes.includes(file.hash))
175176

176177
if (publicFilesToUpload.length) {
@@ -189,21 +190,11 @@ export default defineCommand({
189190
consola.info(`${colors.blueBright(formatNumber(publicFiles.length))} static assets (${colors.blueBright(prettyBytes(totalSize))} / ${colors.blueBright(prettyBytes(totalGzipSize))} gzip)`)
190191
}
191192

192-
const metaFiles = await Promise.all(pathsToDeploy.filter(isMetaPath).map(p => getFile(storage, p, 'base64')))
193-
const serverFiles = await Promise.all(pathsToDeploy.filter(isServerPath).map(p => getFile(storage, p, 'base64')))
193+
metaFiles = await Promise.all(pathsToDeploy.filter(isMetaPath).map(p => getFile(storage, p, 'base64')))
194+
serverFiles = await Promise.all(pathsToDeploy.filter(isServerPath).map(p => getFile(storage, p, 'base64')))
194195
const serverFilesSize = serverFiles.reduce((acc, file) => acc + file.size, 0)
195196
const serverFilesGzipSize = serverFiles.reduce((acc, file) => acc + file.gzipSize, 0)
196197
consola.info(`${colors.blueBright(formatNumber(serverFiles.length))} server files (${colors.blueBright(prettyBytes(serverFilesSize))} / ${colors.blueBright(prettyBytes(serverFilesGzipSize))} gzip)...`)
197-
spinner = ora(`Deploying ${colors.blueBright(linkedProject.slug)} to ${deployEnvColored}...`).start()
198-
deployment = await $api(`/teams/${linkedProject.teamSlug}/projects/${linkedProject.slug}/${deployEnv}/deploy/complete`, {
199-
method: 'POST',
200-
body: {
201-
deploymentKey,
202-
git,
203-
serverFiles,
204-
metaFiles
205-
},
206-
})
207198
} catch (err) {
208199
spinner.fail(`Failed to deploy ${colors.blueBright(linkedProject.slug)} to ${deployEnvColored}.`)
209200
consola.debug(err, err.data)
@@ -217,8 +208,6 @@ export default defineCommand({
217208
process.exit(1)
218209
}
219210

220-
spinner.succeed(`Deployed ${colors.blueBright(linkedProject.slug)} to ${deployEnvColored}...`)
221-
222211
if (config.database) {
223212
// #region Database migrations
224213
const remoteMigrationsSpinner = ora(`Retrieving database migrations on ${deployEnvColored} for ${colors.blueBright(linkedProject.slug)}...`).start()
@@ -268,14 +257,15 @@ export default defineCommand({
268257
migrationSpinner.succeed(`Applied database migration ${colors.blueBright(migration)}.`)
269258
}
270259
// #endregion
260+
271261
// #region Database queries
272262
const localQueries = fileKeys
273263
.filter(fileKey => fileKey.startsWith('database:queries:') && fileKey.endsWith('.sql'))
274264
.map(fileKey => fileKey.replace('database:queries:', '').replace('.sql', ''))
275265

276266

277267
if (localQueries.length) {
278-
const querySpinner = ora(`Applying ${colors.blueBright(formatNumber(localQueries.length))} database queries...`).start()
268+
const querySpinner = ora(`Applying ${colors.blueBright(formatNumber(localQueries.length))} database ${localQueries.length === 1 ? 'query' : 'queries'}...`).start()
279269
for (const queryName of localQueries) {
280270
const query = await storage.getItem(`database/queries/${queryName}.sql`)
281271

@@ -289,11 +279,36 @@ export default defineCommand({
289279
}
290280

291281
}
292-
querySpinner.succeed(`Applied ${colors.blueBright(formatNumber(localQueries.length))} database queries.`)
282+
querySpinner.succeed(`Applied ${colors.blueBright(formatNumber(localQueries.length))} database ${localQueries.length === 1 ? 'query' : 'queries'}.`)
293283
}
294284
// #endregion
295285
}
296286

287+
// #region Complete deployment
288+
spinner = ora(`Deploying ${colors.blueBright(linkedProject.slug)} to ${deployEnvColored}...`).start()
289+
const deployment = await $api(`/teams/${linkedProject.teamSlug}/projects/${linkedProject.slug}/${deployEnv}/deploy/complete`, {
290+
method: 'POST',
291+
body: {
292+
deploymentKey,
293+
git,
294+
serverFiles,
295+
metaFiles
296+
},
297+
}).catch((err) => {
298+
spinner.fail(`Failed to deploy ${colors.blueBright(linkedProject.slug)} to ${deployEnvColored}.`)
299+
// Error with workers size limit
300+
if (err.data?.data?.name === 'ZodError') {
301+
consola.error(err.data.data.issues)
302+
}
303+
else if (err.message.includes('Error: ')) {
304+
consola.error(err.message.split('Error: ')[1])
305+
} else {
306+
consola.error(err.message.split(' - ')[1] || err.message)
307+
}
308+
process.exit(1)
309+
})
310+
spinner.succeed(`Deployed ${colors.blueBright(linkedProject.slug)} to ${deployEnvColored}...`)
311+
297312
// Check DNS & ready url for first deployment
298313
consola.success(`Deployment is ready at ${colors.cyanBright(deployment.primaryUrl || deployment.url)}`)
299314
if (deployment.isFirstDeploy) {

0 commit comments

Comments
 (0)