From 00cab67e7363da40c1488e562084f0b5c6ed06fd Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Mon, 2 May 2022 14:15:50 +0200 Subject: [PATCH] feat: Cancel builds! --- src/lib/buildPacks/deno.ts | 14 +++- src/lib/buildPacks/docker.ts | 2 + src/lib/buildPacks/gatsby.ts | 4 +- src/lib/buildPacks/laravel.ts | 4 +- src/lib/buildPacks/nestjs.ts | 4 +- src/lib/buildPacks/nextjs.ts | 3 +- src/lib/buildPacks/node.ts | 5 +- src/lib/buildPacks/nuxtjs.ts | 5 +- src/lib/buildPacks/php.ts | 4 +- src/lib/buildPacks/python.ts | 5 +- src/lib/buildPacks/react.ts | 4 +- src/lib/buildPacks/rust.ts | 4 +- src/lib/buildPacks/static.ts | 5 +- src/lib/buildPacks/svelte.ts | 4 +- src/lib/buildPacks/vuejs.ts | 4 +- src/lib/docker.ts | 6 +- src/lib/locales/en.json | 6 +- src/routes/applications/[id]/cancel.json.ts | 71 +++++++++++++++++++ src/routes/applications/[id]/deploy.json.ts | 24 ++++--- src/routes/applications/[id]/index.svelte | 3 + .../[id]/logs/build/_BuildLog.svelte | 27 ++++++- src/routes/webhooks/github/events.ts | 32 +++++---- src/routes/webhooks/gitlab/events.ts | 32 +++++---- 23 files changed, 207 insertions(+), 65 deletions(-) create mode 100644 src/routes/applications/[id]/cancel.json.ts diff --git a/src/lib/buildPacks/deno.ts b/src/lib/buildPacks/deno.ts index 8b7e30b5a..b593596f7 100644 --- a/src/lib/buildPacks/deno.ts +++ b/src/lib/buildPacks/deno.ts @@ -2,8 +2,16 @@ import { buildImage } from '$lib/docker'; import { promises as fs } from 'fs'; const createDockerfile = async (data, image): Promise => { - const { workdir, port, baseDirectory, secrets, pullmergeRequestId, denoMainFile, denoOptions } = - data; + const { + workdir, + port, + baseDirectory, + secrets, + pullmergeRequestId, + denoMainFile, + denoOptions, + buildId + } = data; const Dockerfile: Array = []; let depsFound = false; @@ -14,7 +22,7 @@ const createDockerfile = async (data, image): Promise => { Dockerfile.push(`FROM ${image}`); Dockerfile.push('WORKDIR /app'); - Dockerfile.push(`LABEL coolify.image=true`); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); if (secrets.length > 0) { secrets.forEach((secret) => { if (secret.isBuildSecret) { diff --git a/src/lib/buildPacks/docker.ts b/src/lib/buildPacks/docker.ts index 1ddf81a60..3b032fc4b 100644 --- a/src/lib/buildPacks/docker.ts +++ b/src/lib/buildPacks/docker.ts @@ -24,6 +24,7 @@ export default async function ({ .toString() .trim() .split('\n'); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); if (secrets.length > 0) { secrets.forEach((secret) => { if (secret.isBuildSecret) { @@ -42,6 +43,7 @@ export default async function ({ } }); } + await fs.writeFile(`${dockerFileOut}${dockerFileLocation}`, Dockerfile.join('\n')); await buildImage({ applicationId, tag, workdir, docker, buildId, debug, dockerFileLocation }); } catch (error) { diff --git a/src/lib/buildPacks/gatsby.ts b/src/lib/buildPacks/gatsby.ts index 0cba2a48d..cdf95f1dd 100644 --- a/src/lib/buildPacks/gatsby.ts +++ b/src/lib/buildPacks/gatsby.ts @@ -2,12 +2,12 @@ import { buildCacheImageWithNode, buildImage } from '$lib/docker'; import { promises as fs } from 'fs'; const createDockerfile = async (data, imageforBuild): Promise => { - const { applicationId, tag, workdir, publishDirectory, baseImage } = data; + const { applicationId, tag, workdir, publishDirectory, baseImage, buildId } = data; const Dockerfile: Array = []; Dockerfile.push(`FROM ${imageforBuild}`); Dockerfile.push('WORKDIR /app'); - Dockerfile.push(`LABEL coolify.image=true`); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); Dockerfile.push(`COPY --from=${applicationId}:${tag}-cache /app/${publishDirectory} ./`); if (baseImage.includes('nginx')) { Dockerfile.push(`COPY /nginx.conf /etc/nginx/nginx.conf`); diff --git a/src/lib/buildPacks/laravel.ts b/src/lib/buildPacks/laravel.ts index bf5fcc6a2..a83363dc0 100644 --- a/src/lib/buildPacks/laravel.ts +++ b/src/lib/buildPacks/laravel.ts @@ -2,11 +2,11 @@ import { buildCacheImageForLaravel, buildImage } from '$lib/docker'; import { promises as fs } from 'fs'; const createDockerfile = async (data, image): Promise => { - const { workdir, applicationId, tag, baseImage } = data; + const { workdir, applicationId, tag, buildId } = data; const Dockerfile: Array = []; Dockerfile.push(`FROM ${image}`); - Dockerfile.push(`LABEL coolify.image=true`); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); Dockerfile.push('WORKDIR /app'); Dockerfile.push(`ENV WEB_DOCUMENT_ROOT /app/public`); Dockerfile.push(`COPY --chown=application:application composer.* ./`); diff --git a/src/lib/buildPacks/nestjs.ts b/src/lib/buildPacks/nestjs.ts index f529d7645..b0bb6ba89 100644 --- a/src/lib/buildPacks/nestjs.ts +++ b/src/lib/buildPacks/nestjs.ts @@ -2,13 +2,13 @@ import { buildCacheImageWithNode, buildImage } from '$lib/docker'; import { promises as fs } from 'fs'; const createDockerfile = async (data, image): Promise => { - const { applicationId, tag, port, startCommand, workdir, baseDirectory } = data; + const { buildId, applicationId, tag, port, startCommand, workdir, baseDirectory } = data; const Dockerfile: Array = []; const isPnpm = startCommand.includes('pnpm'); Dockerfile.push(`FROM ${image}`); Dockerfile.push('WORKDIR /app'); - Dockerfile.push(`LABEL coolify.image=true`); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); if (isPnpm) { Dockerfile.push('RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm'); Dockerfile.push('RUN pnpm add -g pnpm'); diff --git a/src/lib/buildPacks/nextjs.ts b/src/lib/buildPacks/nextjs.ts index 59c50d7f1..77f5bc5f8 100644 --- a/src/lib/buildPacks/nextjs.ts +++ b/src/lib/buildPacks/nextjs.ts @@ -4,6 +4,7 @@ import { checkPnpm } from './common'; const createDockerfile = async (data, image): Promise => { const { + buildId, workdir, port, installCommand, @@ -17,7 +18,7 @@ const createDockerfile = async (data, image): Promise => { const isPnpm = checkPnpm(installCommand, buildCommand, startCommand); Dockerfile.push(`FROM ${image}`); Dockerfile.push('WORKDIR /app'); - Dockerfile.push(`LABEL coolify.image=true`); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); if (secrets.length > 0) { secrets.forEach((secret) => { if (secret.isBuildSecret) { diff --git a/src/lib/buildPacks/node.ts b/src/lib/buildPacks/node.ts index 1231892b2..9d8e643ef 100644 --- a/src/lib/buildPacks/node.ts +++ b/src/lib/buildPacks/node.ts @@ -11,14 +11,15 @@ const createDockerfile = async (data, image): Promise => { startCommand, baseDirectory, secrets, - pullmergeRequestId + pullmergeRequestId, + buildId } = data; const Dockerfile: Array = []; const isPnpm = checkPnpm(installCommand, buildCommand, startCommand); Dockerfile.push(`FROM ${image}`); Dockerfile.push('WORKDIR /app'); - Dockerfile.push(`LABEL coolify.image=true`); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); if (secrets.length > 0) { secrets.forEach((secret) => { if (secret.isBuildSecret) { diff --git a/src/lib/buildPacks/nuxtjs.ts b/src/lib/buildPacks/nuxtjs.ts index 9120b7d5c..9cd7e9674 100644 --- a/src/lib/buildPacks/nuxtjs.ts +++ b/src/lib/buildPacks/nuxtjs.ts @@ -11,13 +11,14 @@ const createDockerfile = async (data, image): Promise => { startCommand, baseDirectory, secrets, - pullmergeRequestId + pullmergeRequestId, + buildId } = data; const Dockerfile: Array = []; const isPnpm = checkPnpm(installCommand, buildCommand, startCommand); Dockerfile.push(`FROM ${image}`); Dockerfile.push('WORKDIR /app'); - Dockerfile.push(`LABEL coolify.image=true`); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); if (secrets.length > 0) { secrets.forEach((secret) => { if (secret.isBuildSecret) { diff --git a/src/lib/buildPacks/php.ts b/src/lib/buildPacks/php.ts index 4bdfaf923..b3c9651ce 100644 --- a/src/lib/buildPacks/php.ts +++ b/src/lib/buildPacks/php.ts @@ -2,7 +2,7 @@ import { buildImage } from '$lib/docker'; import { promises as fs } from 'fs'; const createDockerfile = async (data, image, htaccessFound): Promise => { - const { workdir, baseDirectory } = data; + const { workdir, baseDirectory, buildId } = data; const Dockerfile: Array = []; let composerFound = false; try { @@ -11,7 +11,7 @@ const createDockerfile = async (data, image, htaccessFound): Promise => { } catch (error) {} Dockerfile.push(`FROM ${image}`); - Dockerfile.push(`LABEL coolify.image=true`); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); Dockerfile.push('WORKDIR /app'); Dockerfile.push(`COPY .${baseDirectory || ''} /app`); if (htaccessFound) { diff --git a/src/lib/buildPacks/python.ts b/src/lib/buildPacks/python.ts index f13965cf0..fc5e8738b 100644 --- a/src/lib/buildPacks/python.ts +++ b/src/lib/buildPacks/python.ts @@ -10,12 +10,13 @@ const createDockerfile = async (data, image): Promise => { pullmergeRequestId, pythonWSGI, pythonModule, - pythonVariable + pythonVariable, + buildId } = data; const Dockerfile: Array = []; Dockerfile.push(`FROM ${image}`); Dockerfile.push('WORKDIR /app'); - Dockerfile.push(`LABEL coolify.image=true`); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); if (secrets.length > 0) { secrets.forEach((secret) => { if (secret.isBuildSecret) { diff --git a/src/lib/buildPacks/react.ts b/src/lib/buildPacks/react.ts index 4aca45621..3b55bfa23 100644 --- a/src/lib/buildPacks/react.ts +++ b/src/lib/buildPacks/react.ts @@ -2,11 +2,11 @@ import { buildCacheImageWithNode, buildImage } from '$lib/docker'; import { promises as fs } from 'fs'; const createDockerfile = async (data, image): Promise => { - const { applicationId, tag, workdir, publishDirectory, baseImage } = data; + const { applicationId, tag, workdir, publishDirectory, baseImage, buildId } = data; const Dockerfile: Array = []; Dockerfile.push(`FROM ${image}`); - Dockerfile.push(`LABEL coolify.image=true`); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); Dockerfile.push('WORKDIR /app'); Dockerfile.push(`COPY --from=${applicationId}:${tag}-cache /app/${publishDirectory} ./`); if (baseImage.includes('nginx')) { diff --git a/src/lib/buildPacks/rust.ts b/src/lib/buildPacks/rust.ts index 5db5ad9b5..72f0c6273 100644 --- a/src/lib/buildPacks/rust.ts +++ b/src/lib/buildPacks/rust.ts @@ -4,11 +4,11 @@ import { promises as fs } from 'fs'; import TOML from '@iarna/toml'; const createDockerfile = async (data, image, name): Promise => { - const { workdir, port, applicationId, tag } = data; + const { workdir, port, applicationId, tag, buildId } = data; const Dockerfile: Array = []; Dockerfile.push(`FROM ${image}`); Dockerfile.push('WORKDIR /app'); - Dockerfile.push(`LABEL coolify.image=true`); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); Dockerfile.push(`COPY --from=${applicationId}:${tag}-cache /app/target target`); Dockerfile.push(`COPY --from=${applicationId}:${tag}-cache /usr/local/cargo /usr/local/cargo`); Dockerfile.push(`COPY . .`); diff --git a/src/lib/buildPacks/static.ts b/src/lib/buildPacks/static.ts index 20afefbba..8f3c2c7d4 100644 --- a/src/lib/buildPacks/static.ts +++ b/src/lib/buildPacks/static.ts @@ -11,13 +11,14 @@ const createDockerfile = async (data, image): Promise => { publishDirectory, secrets, pullmergeRequestId, - baseImage + baseImage, + buildId } = data; const Dockerfile: Array = []; Dockerfile.push(`FROM ${image}`); Dockerfile.push('WORKDIR /app'); - Dockerfile.push(`LABEL coolify.image=true`); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); if (secrets.length > 0) { secrets.forEach((secret) => { if (secret.isBuildSecret) { diff --git a/src/lib/buildPacks/svelte.ts b/src/lib/buildPacks/svelte.ts index b63560a5d..5604e7ed6 100644 --- a/src/lib/buildPacks/svelte.ts +++ b/src/lib/buildPacks/svelte.ts @@ -2,12 +2,12 @@ import { buildCacheImageWithNode, buildImage } from '$lib/docker'; import { promises as fs } from 'fs'; const createDockerfile = async (data, image): Promise => { - const { applicationId, tag, workdir, publishDirectory, baseImage } = data; + const { applicationId, tag, workdir, publishDirectory, baseImage, buildId } = data; const Dockerfile: Array = []; Dockerfile.push(`FROM ${image}`); Dockerfile.push('WORKDIR /app'); - Dockerfile.push(`LABEL coolify.image=true`); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); Dockerfile.push(`COPY --from=${applicationId}:${tag}-cache /app/${publishDirectory} ./`); if (baseImage.includes('nginx')) { Dockerfile.push(`COPY /nginx.conf /etc/nginx/nginx.conf`); diff --git a/src/lib/buildPacks/vuejs.ts b/src/lib/buildPacks/vuejs.ts index b63560a5d..5604e7ed6 100644 --- a/src/lib/buildPacks/vuejs.ts +++ b/src/lib/buildPacks/vuejs.ts @@ -2,12 +2,12 @@ import { buildCacheImageWithNode, buildImage } from '$lib/docker'; import { promises as fs } from 'fs'; const createDockerfile = async (data, image): Promise => { - const { applicationId, tag, workdir, publishDirectory, baseImage } = data; + const { applicationId, tag, workdir, publishDirectory, baseImage, buildId } = data; const Dockerfile: Array = []; Dockerfile.push(`FROM ${image}`); Dockerfile.push('WORKDIR /app'); - Dockerfile.push(`LABEL coolify.image=true`); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); Dockerfile.push(`COPY --from=${applicationId}:${tag}-cache /app/${publishDirectory} ./`); if (baseImage.includes('nginx')) { Dockerfile.push(`COPY /nginx.conf /etc/nginx/nginx.conf`); diff --git a/src/lib/docker.ts b/src/lib/docker.ts index 478ae54fb..0b60a4ed9 100644 --- a/src/lib/docker.ts +++ b/src/lib/docker.ts @@ -8,7 +8,7 @@ export async function buildCacheImageForLaravel(data, imageForBuild) { const Dockerfile: Array = []; Dockerfile.push(`FROM ${imageForBuild}`); Dockerfile.push('WORKDIR /app'); - Dockerfile.push(`LABEL coolify.image=true`); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); if (secrets.length > 0) { secrets.forEach((secret) => { if (secret.isBuildSecret) { @@ -49,7 +49,7 @@ export async function buildCacheImageWithNode(data, imageForBuild) { const Dockerfile: Array = []; Dockerfile.push(`FROM ${imageForBuild}`); Dockerfile.push('WORKDIR /app'); - Dockerfile.push(`LABEL coolify.image=true`); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); if (secrets.length > 0) { secrets.forEach((secret) => { if (secret.isBuildSecret) { @@ -94,11 +94,13 @@ export async function buildCacheImageWithCargo(data, imageForBuild) { } = data; const Dockerfile: Array = []; Dockerfile.push(`FROM ${imageForBuild} as planner-${applicationId}`); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); Dockerfile.push('WORKDIR /app'); Dockerfile.push('RUN cargo install cargo-chef'); Dockerfile.push('COPY . .'); Dockerfile.push('RUN cargo chef prepare --recipe-path recipe.json'); Dockerfile.push(`FROM ${imageForBuild}`); + Dockerfile.push(`LABEL coolify.buildId=${buildId}`); Dockerfile.push('WORKDIR /app'); Dockerfile.push('RUN cargo install cargo-chef'); Dockerfile.push(`COPY --from=planner-${applicationId} /app/recipe.json recipe.json`); diff --git a/src/lib/locales/en.json b/src/lib/locales/en.json index f0107ba72..a7adfcef0 100644 --- a/src/lib/locales/en.json +++ b/src/lib/locales/en.json @@ -184,8 +184,10 @@ "git_source": "Git Source", "git_repository": "Git Repository", "build_pack": "Build Pack", - "base_image": "Base Image", - "base_build_image": "Base Build Image", + "base_image": "Deplyoment Image", + "base_image_explainer": "Image that will be used for the deployment.", + "base_build_image": "Build Image", + "base_build_image_explainer": "Image that will be used during the build process.", "destination": "Destination", "application": "Application", "url_fqdn": "URL (FQDN)", diff --git a/src/routes/applications/[id]/cancel.json.ts b/src/routes/applications/[id]/cancel.json.ts new file mode 100644 index 000000000..ce1082a33 --- /dev/null +++ b/src/routes/applications/[id]/cancel.json.ts @@ -0,0 +1,71 @@ +import { asyncExecShell, getEngine, removeDestinationDocker, saveBuildLog } from '$lib/common'; +import { buildQueue } from '$lib/queues'; +import type { RequestHandler } from '@sveltejs/kit'; +import * as db from '$lib/database'; + +export const post: RequestHandler = async (event) => { + const { buildId, applicationId } = await event.request.json(); + if (!buildId) { + return { + status: 500, + body: { + message: 'Build ID not found.' + } + }; + } + try { + let count = 0; + await new Promise(async (resolve, reject) => { + const job = await buildQueue.getJob(buildId); + const { + destinationDocker: { engine } + } = job.data; + const host = getEngine(engine); + let interval = setInterval(async () => { + console.log(`Checking build ${buildId}, try ${count}`); + if (count > 100) { + clearInterval(interval); + reject(new Error('Could not cancel build.')); + } + try { + const { stdout: buildContainers } = await asyncExecShell( + `DOCKER_HOST=${host} docker container ls --filter "label=coolify.buildId=${buildId}" --format '{{json .}}'` + ); + if (buildContainers) { + const containersArray = buildContainers.trim().split('\n'); + for (const container of containersArray) { + const containerObj = JSON.parse(container); + const id = containerObj.ID; + if (!containerObj.Names.startsWith(`${applicationId}`)) { + await removeDestinationDocker({ id, engine }); + clearInterval(interval); + await saveBuildLog({ + line: 'Canceled by user!', + buildId: job.data.build_id, + applicationId: job.data.id + }); + } + } + } + count++; + } catch (error) {} + }, 100); + + resolve('Canceled'); + }); + + return { + status: 200, + body: { + message: 'Build canceled.' + } + }; + } catch (error) { + return { + status: 500, + body: { + message: error.message + } + }; + } +}; diff --git a/src/routes/applications/[id]/deploy.json.ts b/src/routes/applications/[id]/deploy.json.ts index 3f645deb2..92311ae1f 100644 --- a/src/routes/applications/[id]/deploy.json.ts +++ b/src/routes/applications/[id]/deploy.json.ts @@ -45,15 +45,23 @@ export const post: RequestHandler = async (event) => { } }); if (pullmergeRequestId) { - await buildQueue.add(buildId, { - build_id: buildId, - type: 'manual', - ...applicationFound, - sourceBranch: branch, - pullmergeRequestId - }); + await buildQueue.add( + buildId, + { + build_id: buildId, + type: 'manual', + ...applicationFound, + sourceBranch: branch, + pullmergeRequestId + }, + { jobId: buildId } + ); } else { - await buildQueue.add(buildId, { build_id: buildId, type: 'manual', ...applicationFound }); + await buildQueue.add( + buildId, + { build_id: buildId, type: 'manual', ...applicationFound }, + { jobId: buildId } + ); } return { status: 200, diff --git a/src/routes/applications/[id]/index.svelte b/src/routes/applications/[id]/index.svelte index e9c558706..719b95b40 100644 --- a/src/routes/applications/[id]/index.svelte +++ b/src/routes/applications/[id]/index.svelte @@ -339,6 +339,7 @@ isClearable={false} /> + {#if application.buildCommand || application.buildPack === 'rust' || application.buildPack === 'laravel'}
@@ -360,6 +361,8 @@
{#if application.buildPack === 'laravel'} + {:else} + {/if} {/if} diff --git a/src/routes/applications/[id]/logs/build/_BuildLog.svelte b/src/routes/applications/[id]/logs/build/_BuildLog.svelte index 9a8dea4cc..4a761857d 100644 --- a/src/routes/applications/[id]/logs/build/_BuildLog.svelte +++ b/src/routes/applications/[id]/logs/build/_BuildLog.svelte @@ -8,7 +8,7 @@ import Loading from '$lib/components/Loading.svelte'; import LoadingLogs from '../_Loading.svelte'; - import { get } from '$lib/api'; + import { get, post } from '$lib/api'; import { errorNotification } from '$lib/form'; import { t } from '$lib/translations'; @@ -67,6 +67,12 @@ return errorNotification(error); } } + async function cancelBuild() { + return await post(`/applications/${id}/cancel.json`, { + buildId, + applicationId: id + }); + } onDestroy(() => { clearInterval(streamInterval); clearInterval(followingInterval); @@ -111,7 +117,26 @@ + {#if currentStatus === 'running'} + + {/if} +
{ type: 'webhook_commit' } }); - await buildQueue.add(buildId, { - build_id: buildId, - type: 'webhook_commit', - ...applicationFound - }); + await buildQueue.add( + buildId, + { + build_id: buildId, + type: 'webhook_commit', + ...applicationFound + }, + { jobId: buildId } + ); return { status: 200, body: { @@ -160,13 +164,17 @@ export const post: RequestHandler = async (event) => { type: 'webhook_pr' } }); - await buildQueue.add(buildId, { - build_id: buildId, - type: 'webhook_pr', - ...applicationFound, - sourceBranch, - pullmergeRequestId - }); + await buildQueue.add( + buildId, + { + build_id: buildId, + type: 'webhook_pr', + ...applicationFound, + sourceBranch, + pullmergeRequestId + }, + { jobId: buildId } + ); return { status: 200, body: { diff --git a/src/routes/webhooks/gitlab/events.ts b/src/routes/webhooks/gitlab/events.ts index f8bb54383..d84646088 100644 --- a/src/routes/webhooks/gitlab/events.ts +++ b/src/routes/webhooks/gitlab/events.ts @@ -73,11 +73,15 @@ export const post: RequestHandler = async (event) => { type: 'webhook_commit' } }); - await buildQueue.add(buildId, { - build_id: buildId, - type: 'webhook_commit', - ...applicationFound - }); + await buildQueue.add( + buildId, + { + build_id: buildId, + type: 'webhook_commit', + ...applicationFound + }, + { jobId: buildId } + ); return { status: 200, body: { @@ -156,13 +160,17 @@ export const post: RequestHandler = async (event) => { type: 'webhook_mr' } }); - await buildQueue.add(buildId, { - build_id: buildId, - type: 'webhook_mr', - ...applicationFound, - sourceBranch, - pullmergeRequestId - }); + await buildQueue.add( + buildId, + { + build_id: buildId, + type: 'webhook_mr', + ...applicationFound, + sourceBranch, + pullmergeRequestId + }, + { jobId: buildId } + ); return { status: 200, body: {