diff --git a/apps/api/src/jobs/deployApplication.ts b/apps/api/src/jobs/deployApplication.ts index 19899d900..93d358fe3 100644 --- a/apps/api/src/jobs/deployApplication.ts +++ b/apps/api/src/jobs/deployApplication.ts @@ -334,8 +334,8 @@ import * as buildpacks from '../lib/buildPacks'; await saveBuildLog({ line: 'Deployment successful!', buildId, applicationId }); } catch (error) { await saveBuildLog({ line: error, buildId, applicationId }); - await prisma.build.update({ - where: { id: message.build_id }, + await prisma.build.updateMany({ + where: { id: message.build_id, status: { in: ['queued', 'running'] } }, data: { status: 'failed' } }); throw new Error(error); @@ -350,8 +350,8 @@ import * as buildpacks from '../lib/buildPacks'; } catch (error) { - await prisma.build.update({ - where: { id: message.build_id }, + await prisma.build.updateMany({ + where: { id: message.build_id, status: { in: ['queued', 'running'] } }, data: { status: 'failed' } }); await saveBuildLog({ line: error, buildId, applicationId }); diff --git a/apps/api/src/lib/buildPacks/common.ts b/apps/api/src/lib/buildPacks/common.ts index be907ee7e..b463a91db 100644 --- a/apps/api/src/lib/buildPacks/common.ts +++ b/apps/api/src/lib/buildPacks/common.ts @@ -551,6 +551,10 @@ export async function buildImage({ const dockerFile = isCache ? `${dockerFileLocation}-cache` : `${dockerFileLocation}` const cache = `${applicationId}:${tag}${isCache ? '-cache' : ''}` await executeDockerCmd({ debug, buildId, applicationId, dockerId, command: `docker build --progress plain -f ${workdir}/${dockerFile} -t ${cache} ${workdir}` }) + const { status } = await prisma.build.findUnique({ where: { id: buildId } }) + if (status === 'canceled') { + throw new Error('Build canceled.') + } if (isCache) { await saveBuildLog({ line: `Building cache image successful.`, buildId, applicationId }); } else { diff --git a/apps/api/src/lib/common.ts b/apps/api/src/lib/common.ts index 379f79a34..e77dc995c 100644 --- a/apps/api/src/lib/common.ts +++ b/apps/api/src/lib/common.ts @@ -1874,11 +1874,11 @@ export async function stopBuild(buildId, applicationId) { const { engine, id: dockerId } = await prisma.destinationDocker.findFirst({ where: { id: destinationDockerId } }); const interval = setInterval(async () => { try { - if (status === 'failed') { + if (status === 'failed' || status === 'canceled') { clearInterval(interval); return resolve(); } - if (count > 50) { + if (count > 15) { clearInterval(interval); if (scheduler.workers.has('deployApplication')) { scheduler.workers.get('deployApplication').postMessage("action:flushQueue") @@ -1894,8 +1894,11 @@ export async function stopBuild(buildId, applicationId) { const id = containerObj.ID; if (!containerObj.Names.startsWith(`${applicationId} `)) { await removeContainer({ id, dockerId }); - clearInterval(interval); + if (scheduler.workers.has('deployApplication')) { + scheduler.workers.get('deployApplication').postMessage("action:flushQueue") + } + await cleanupDB(buildId); return resolve(); } } @@ -1909,7 +1912,7 @@ export async function stopBuild(buildId, applicationId) { async function cleanupDB(buildId: string) { const data = await prisma.build.findUnique({ where: { id: buildId } }); if (data?.status === 'queued' || data?.status === 'running') { - await prisma.build.update({ where: { id: buildId }, data: { status: 'failed' } }); + await prisma.build.update({ where: { id: buildId }, data: { status: 'canceled' } }); } } diff --git a/apps/ui/src/routes/applications/[id]/logs/build.svelte b/apps/ui/src/routes/applications/[id]/logs/build.svelte index 7e2f6ff81..571aaa1a5 100644 --- a/apps/ui/src/routes/applications/[id]/logs/build.svelte +++ b/apps/ui/src/routes/applications/[id]/logs/build.svelte @@ -146,6 +146,7 @@ class="tooltip tooltip-primary tooltip-top flex cursor-pointer items-center justify-center border-l-2 py-4 no-underline transition-all duration-100 hover:bg-coolgray-400 hover:shadow-xl" class:bg-coolgray-400={buildId === build.id} class:border-red-500={build.status === 'failed'} + class:border-orange-500={build.status === 'canceled'} class:border-green-500={build.status === 'success'} class:border-yellow-500={build.status === 'running'} >