diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index 9a79441a2..a5983012a 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -272,7 +272,7 @@ async function initServer() { } catch (error) { } try { console.log('[003] Cleaning up old build sources under /tmp/build-sources/...'); - await fs.rm('/tmp/build-sources', { recursive: true, force: true }) + if (!isDev) await fs.rm('/tmp/build-sources', { recursive: true, force: true }) } catch (error) { console.log(error) } diff --git a/apps/api/src/jobs/deployApplication.ts b/apps/api/src/jobs/deployApplication.ts index 7dc9cd24a..b8f23b6fc 100644 --- a/apps/api/src/jobs/deployApplication.ts +++ b/apps/api/src/jobs/deployApplication.ts @@ -198,7 +198,7 @@ import * as buildpacks from '../lib/buildPacks'; if (configHash !== currentHash) { deployNeeded = true; if (configHash) { - await saveBuildLog({ line: 'Configuration changed.', buildId, applicationId }); + await saveBuildLog({ line: 'Configuration changed', buildId, applicationId }); } } else { deployNeeded = false; diff --git a/apps/api/src/lib/buildPacks/compose.ts b/apps/api/src/lib/buildPacks/compose.ts index 2bee70c3f..432447f99 100644 --- a/apps/api/src/lib/buildPacks/compose.ts +++ b/apps/api/src/lib/buildPacks/compose.ts @@ -109,7 +109,7 @@ export default async function (data) { dockerComposeYaml['networks'] = Object.assign({ ...networks }, { [network]: { external: true } }) await fs.writeFile(fileYaml, yaml.dump(dockerComposeYaml)); await executeDockerCmd({ debug, buildId, applicationId, dockerId, command: `docker compose --project-directory ${workdir} pull` }) - await saveBuildLog({ line: 'Pulling images from Compose file.', buildId, applicationId }); + await saveBuildLog({ line: 'Pulling images from Compose file', buildId, applicationId }); await executeDockerCmd({ debug, buildId, applicationId, dockerId, command: `docker compose --project-directory ${workdir} build --progress plain` }) - await saveBuildLog({ line: 'Building images from Compose file.', buildId, applicationId }); + await saveBuildLog({ line: 'Building images from Compose file', buildId, applicationId }); } diff --git a/apps/api/src/routes/api/v1/applications/handlers.ts b/apps/api/src/routes/api/v1/applications/handlers.ts index f81a41850..99e5a8616 100644 --- a/apps/api/src/routes/api/v1/applications/handlers.ts +++ b/apps/api/src/routes/api/v1/applications/handlers.ts @@ -692,30 +692,39 @@ export async function getDockerImages(request) { const { id } = request.params const teamId = request.user?.teamId; const application: any = await getApplicationFromDB(id, teamId); - const { stdout } = await executeDockerCmd({ dockerId: application.destinationDocker.id, command: `docker images --format '{{.Repository}}#{{.Tag}}#{{.CreatedAt}}' | grep -i ${id} | grep -v cache` }); - const { stdout: runningImage } = await executeDockerCmd({ dockerId: application.destinationDocker.id, command: `docker ps -a --filter 'label=com.docker.compose.service=${id}' --format {{.Image}}` }); - const images = stdout.trim().split('\n'); let imagesAvailables = []; - for (const image of images) { - const [repository, tag, createdAt] = image.split('#'); - if (tag.includes('-')) { - continue; + try { + const { stdout } = await executeDockerCmd({ dockerId: application.destinationDocker.id, command: `docker images --format '{{.Repository}}#{{.Tag}}#{{.CreatedAt}}' | grep -i ${id} | grep -v cache` }); + const { stdout: runningImage } = await executeDockerCmd({ dockerId: application.destinationDocker.id, command: `docker ps -a --filter 'label=com.docker.compose.service=${id}' --format {{.Image}}` }); + const images = stdout.trim().split('\n'); + + for (const image of images) { + const [repository, tag, createdAt] = image.split('#'); + if (tag.includes('-')) { + continue; + } + const [year, time] = createdAt.split(' '); + imagesAvailables.push({ + repository, + tag, + createdAt: day(year + time).unix() + }) + } + + imagesAvailables = imagesAvailables.sort((a, b) => b.tag - a.tag); + + return { + imagesAvailables, + runningImage + } + } catch (error) { + return { + imagesAvailables, } - const [year, time] = createdAt.split(' '); - imagesAvailables.push({ - repository, - tag, - createdAt: day(year + time).unix() - }) } - imagesAvailables = imagesAvailables.sort((a, b) => b.tag - a.tag); - - return { - imagesAvailables, - runningImage - } } catch ({ status, message }) { + return errorHandler({ status, message }) } } diff --git a/apps/api/src/routes/api/v1/applications/index.ts b/apps/api/src/routes/api/v1/applications/index.ts index 546c5596e..9943dcee6 100644 --- a/apps/api/src/routes/api/v1/applications/index.ts +++ b/apps/api/src/routes/api/v1/applications/index.ts @@ -45,7 +45,6 @@ const root: FastifyPluginAsync = async (fastify): Promise => { fastify.get('/:id/previews/:pullmergeRequestId/status', async (request) => await getPreviewStatus(request)); fastify.post('/:id/previews/:pullmergeRequestId/restart', async (request, reply) => await restartPreview(request, reply)); - // fastify.get('/:id/logs', async (request) => await getApplicationLogs(request)); fastify.get('/:id/logs/:containerId', async (request) => await getApplicationLogs(request)); fastify.get('/:id/logs/build', async (request) => await getBuilds(request)); fastify.get('/:id/logs/build/:buildId', async (request) => await getBuildIdLogs(request)); diff --git a/apps/ui/src/routes/applications/[id]/__layout.svelte b/apps/ui/src/routes/applications/[id]/__layout.svelte index b347a14b0..9698b49d1 100644 --- a/apps/ui/src/routes/applications/[id]/__layout.svelte +++ b/apps/ui/src/routes/applications/[id]/__layout.svelte @@ -179,24 +179,40 @@ if ($status.application.statuses.length === 0) { $status.application.overallStatus = 'stopped'; } else { - if ($status.application.statuses.length !== numberOfApplications) { - $status.application.overallStatus = 'degraded'; - } else { - for (const oneStatus of $status.application.statuses) { - if (oneStatus.status.isExited || oneStatus.status.isRestarting) { - $status.application.overallStatus = 'degraded'; - break; - } - if (oneStatus.status.isRunning) { - $status.application.overallStatus = 'healthy'; - } - if ( - !oneStatus.status.isExited && - !oneStatus.status.isRestarting && - !oneStatus.status.isRunning - ) { - $status.application.overallStatus = 'stopped'; - } + // if ($status.application.statuses.length !== numberOfApplications) { + // $status.application.overallStatus = 'degraded'; + // } else { + // for (const oneStatus of $status.application.statuses) { + // if (oneStatus.status.isExited || oneStatus.status.isRestarting) { + // $status.application.overallStatus = 'degraded'; + // break; + // } + // if (oneStatus.status.isRunning) { + // $status.application.overallStatus = 'healthy'; + // } + // if ( + // !oneStatus.status.isExited && + // !oneStatus.status.isRestarting && + // !oneStatus.status.isRunning + // ) { + // $status.application.overallStatus = 'stopped'; + // } + // } + // } + for (const oneStatus of $status.application.statuses) { + if (oneStatus.status.isExited || oneStatus.status.isRestarting) { + $status.application.overallStatus = 'degraded'; + break; + } + if (oneStatus.status.isRunning) { + $status.application.overallStatus = 'healthy'; + } + if ( + !oneStatus.status.isExited && + !oneStatus.status.isRestarting && + !oneStatus.status.isRunning + ) { + $status.application.overallStatus = 'stopped'; } } } diff --git a/apps/ui/src/routes/applications/[id]/configuration/buildpack.svelte b/apps/ui/src/routes/applications/[id]/configuration/buildpack.svelte index 37e18a24d..0e450b0a4 100644 --- a/apps/ui/src/routes/applications/[id]/configuration/buildpack.svelte +++ b/apps/ui/src/routes/applications/[id]/configuration/buildpack.svelte @@ -312,30 +312,6 @@ await getGitlabToken(); } scanRepository(isPublicRepository); - // let htmlUrl = application.gitSource.htmlUrl; - // const left = screen.width / 2 - 1020 / 2; - // const top = screen.height / 2 - 618 / 2; - // const newWindow = open( - // `${htmlUrl}/oauth/authorize?client_id=${ - // application.gitSource.gitlabApp.appId - // }&redirect_uri=${getAPIUrl()}/webhooks/gitlab&response_type=code&scope=api+email+read_repository&state=${ - // $page.params.id - // }`, - // 'GitLab', - // 'resizable=1, scrollbars=1, fullscreen=0, height=618, width=1020,top=' + - // top + - // ', left=' + - // left + - // ', toolbar=0, menubar=0, status=0' - // ); - // const timer = setInterval(() => { - // if (newWindow?.closed) { - // clearInterval(timer); - // $appSession.tokens.gitlab = localStorage.getItem('gitLabToken'); - // // localStorage.removeItem('gitLabToken' ); - - // } - // }, 100); } } else if (error.message === 'Bad credentials') { const { token } = await get(`/applications/${id}/configuration/githubToken`); diff --git a/apps/ui/src/routes/applications/[id]/revert.svelte b/apps/ui/src/routes/applications/[id]/revert.svelte index 4cc6d7285..de891d561 100644 --- a/apps/ui/src/routes/applications/[id]/revert.svelte +++ b/apps/ui/src/routes/applications/[id]/revert.svelte @@ -54,7 +54,7 @@
-
Revert Application
+
Revert
You can revert application to a previously built image. Currently only locally stored images @@ -67,53 +67,60 @@ > feature here.
-
- {#each imagesAvailables as image} -
-
-
- {image.tag} -
-
- - + {#if image.repository + ':' + image.tag !== runningImage} + - - - - {#if image.repository + ':' + image.tag !== runningImage} - - {:else} - - {/if} + {:else} + + {/if} +
-
- {/each} -
+ {/each} +
+ {:else} +
+
No images available
+
+ {/if} diff --git a/apps/ui/src/routes/applications/[id]/storages.svelte b/apps/ui/src/routes/applications/[id]/storages.svelte index 192538401..59101780a 100644 --- a/apps/ui/src/routes/applications/[id]/storages.svelte +++ b/apps/ui/src/routes/applications/[id]/storages.svelte @@ -35,6 +35,9 @@ if (service?.volumes) { for (const [_, volumeName] of Object.entries(service.volumes)) { let [volume, target] = volumeName.split(':'); + if (volume === '.') { + volume = target; + } if (!target) { target = volume; volume = `${application.id}${volume.replace(/\//gi, '-').replace(/\./gi, '')}`;