Skip to content

Commit 391f21f

Browse files
committed
Merge remote-tracking branch 'upstream/main'
2 parents 1922e5e + fdce709 commit 391f21f

31 files changed

+234
-149
lines changed

.github/workflows/production-release.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,4 @@ jobs:
3434
- uses: sarisia/actions-status-discord@v1
3535
if: always()
3636
with:
37-
webhook: ${{ secrets.DISCORD_WEBHOOK_DEV_CHANNEL }}
37+
webhook: ${{ secrets.DISCORD_WEBHOOK_PROD_RELEASE_CHANNEL }}

.github/workflows/staging-release.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,4 @@ jobs:
3232
- uses: sarisia/actions-status-discord@v1
3333
if: always()
3434
with:
35-
webhook: ${{ secrets.DISCORD_WEBHOOK_DEV_CHANNEL }}
35+
webhook: ${{ secrets.DISCORD_WEBHOOK_DEV_RELEASE_CHANNEL }}

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ dist
1111
client
1212
apps/api/db/*.db
1313
local-serve
14-
apps/api/db/migration.db-journal
14+
apps/api/db/migration.db-journal
15+
apps/api/core*

apps/api/src/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ async function initServer() {
161161
} catch (error) { }
162162
try {
163163
const isOlder = compareVersions('3.8.1', version);
164-
if (isOlder === -1) {
164+
if (isOlder === 1) {
165165
await prisma.build.updateMany({ where: { status: { in: ['running', 'queued'] } }, data: { status: 'failed' } });
166166
}
167167
} catch (error) { }

apps/api/src/jobs/deployApplication.ts

+71-65
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import fs from 'fs/promises';
44
import yaml from 'js-yaml';
55

66
import { copyBaseConfigurationFiles, makeLabelForStandaloneApplication, saveBuildLog, setDefaultConfiguration } from '../lib/buildPacks/common';
7-
import { createDirectories, decrypt, defaultComposeConfiguration, executeDockerCmd, getDomain, prisma } from '../lib/common';
7+
import { createDirectories, decrypt, defaultComposeConfiguration, executeDockerCmd, getDomain, prisma, decryptApplication } from '../lib/common';
88
import * as importers from '../lib/importers';
99
import * as buildpacks from '../lib/buildPacks';
1010

@@ -27,7 +27,7 @@ import * as buildpacks from '../lib/buildPacks';
2727

2828
const th = throttle(async () => {
2929
try {
30-
const queuedBuilds = await prisma.build.findMany({ where: { status: 'queued' }, orderBy: { createdAt: 'asc' } });
30+
const queuedBuilds = await prisma.build.findMany({ where: { status: { in: ['queued', 'running'] } }, orderBy: { createdAt: 'asc' } });
3131
const { concurrentBuilds } = await prisma.setting.findFirst({})
3232
if (queuedBuilds.length > 0) {
3333
parentPort.postMessage({ deploying: true });
@@ -37,68 +37,72 @@ import * as buildpacks from '../lib/buildPacks';
3737

3838
for (const queueBuild of queuedBuilds) {
3939
actions.push(async () => {
40-
const application = await prisma.application.findUnique({ where: { id: queueBuild.applicationId }, include: { destinationDocker: true, gitSource: { include: { githubApp: true, gitlabApp: true } }, persistentStorage: true, secrets: true, settings: true, teams: true } })
41-
const { id: buildId, type, sourceBranch = null, pullmergeRequestId = null, forceRebuild } = queueBuild
42-
const {
43-
id: applicationId,
44-
repository,
45-
name,
46-
destinationDocker,
47-
destinationDockerId,
48-
gitSource,
49-
configHash,
50-
fqdn,
51-
projectId,
52-
secrets,
53-
phpModules,
54-
settings,
55-
persistentStorage,
56-
pythonWSGI,
57-
pythonModule,
58-
pythonVariable,
59-
denoOptions,
60-
exposePort,
61-
baseImage,
62-
baseBuildImage,
63-
deploymentType,
64-
} = application
65-
let {
66-
branch,
67-
buildPack,
68-
port,
69-
installCommand,
70-
buildCommand,
71-
startCommand,
72-
baseDirectory,
73-
publishDirectory,
74-
dockerFileLocation,
75-
denoMainFile
76-
} = application
77-
const currentHash = crypto
78-
.createHash('sha256')
79-
.update(
80-
JSON.stringify({
81-
pythonWSGI,
82-
pythonModule,
83-
pythonVariable,
84-
deploymentType,
85-
denoOptions,
86-
baseImage,
87-
baseBuildImage,
88-
buildPack,
89-
port,
90-
exposePort,
91-
installCommand,
92-
buildCommand,
93-
startCommand,
94-
secrets,
95-
branch,
96-
repository,
97-
fqdn
98-
})
99-
)
100-
.digest('hex');
40+
let application = await prisma.application.findUnique({ where: { id: queueBuild.applicationId }, include: { destinationDocker: true, gitSource: { include: { githubApp: true, gitlabApp: true } }, persistentStorage: true, secrets: true, settings: true, teams: true } })
41+
let { id: buildId, type, sourceBranch = null, pullmergeRequestId = null, forceRebuild } = queueBuild
42+
application = decryptApplication(application)
10143
try {
44+
if (queueBuild.status === 'running') {
45+
await saveBuildLog({ line: 'Building halted, restarting...', buildId, applicationId: application.id });
46+
}
47+
const {
48+
id: applicationId,
49+
repository,
50+
name,
51+
destinationDocker,
52+
destinationDockerId,
53+
gitSource,
54+
configHash,
55+
fqdn,
56+
projectId,
57+
secrets,
58+
phpModules,
59+
settings,
60+
persistentStorage,
61+
pythonWSGI,
62+
pythonModule,
63+
pythonVariable,
64+
denoOptions,
65+
exposePort,
66+
baseImage,
67+
baseBuildImage,
68+
deploymentType,
69+
} = application
70+
let {
71+
branch,
72+
buildPack,
73+
port,
74+
installCommand,
75+
buildCommand,
76+
startCommand,
77+
baseDirectory,
78+
publishDirectory,
79+
dockerFileLocation,
80+
denoMainFile
81+
} = application
82+
const currentHash = crypto
83+
.createHash('sha256')
84+
.update(
85+
JSON.stringify({
86+
pythonWSGI,
87+
pythonModule,
88+
pythonVariable,
89+
deploymentType,
90+
denoOptions,
91+
baseImage,
92+
baseBuildImage,
93+
buildPack,
94+
port,
95+
exposePort,
96+
installCommand,
97+
buildCommand,
98+
startCommand,
99+
secrets,
100+
branch,
101+
repository,
102+
fqdn
103+
})
104+
)
105+
.digest('hex');
102106
const { debug } = settings;
103107
if (concurrency === 1) {
104108
await prisma.build.updateMany({
@@ -258,7 +262,6 @@ import * as buildpacks from '../lib/buildPacks';
258262
];
259263
if (secrets.length > 0) {
260264
secrets.forEach((secret) => {
261-
secret.value = decrypt(secret.value)
262265
if (pullmergeRequestId) {
263266
if (secret.isPRMRSecret) {
264267
envs.push(`${secret.name}=${secret.value}`);
@@ -353,13 +356,16 @@ import * as buildpacks from '../lib/buildPacks';
353356
where: { id: buildId, status: { in: ['queued', 'running'] } },
354357
data: { status: 'failed' }
355358
});
356-
await saveBuildLog({ line: error, buildId, applicationId });
359+
await saveBuildLog({ line: error, buildId, applicationId: application.id });
357360
}
358361
});
362+
359363
}
364+
360365
await pAll.default(actions, { concurrency })
361366
}
362367
} catch (error) {
368+
console.log(error)
363369
} finally {
364370
}
365371
})

apps/api/src/lib/buildPacks/common.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -671,11 +671,10 @@ export async function buildCacheImageWithNode(data, imageForBuild) {
671671
if (isPnpm) {
672672
Dockerfile.push('RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm@7');
673673
}
674+
Dockerfile.push(`COPY .${baseDirectory || ''} ./`);
674675
if (installCommand) {
675-
Dockerfile.push(`COPY .${baseDirectory || ''}/package.json ./`);
676676
Dockerfile.push(`RUN ${installCommand}`);
677677
}
678-
Dockerfile.push(`COPY .${baseDirectory || ''} ./`);
679678
Dockerfile.push(`RUN ${buildCommand}`);
680679
await fs.writeFile(`${workdir}/Dockerfile-cache`, Dockerfile.join('\n'));
681680
await buildImage({ ...data, isCache: true });

apps/api/src/lib/common.ts

+31-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import * as serviceFields from './serviceFields'
1919
import { saveBuildLog } from './buildPacks/common';
2020
import { scheduler } from './scheduler';
2121

22-
export const version = '3.8.3';
22+
export const version = '3.8.5';
2323
export const isDev = process.env.NODE_ENV === 'development';
2424

2525
const algorithm = 'aes-256-ctr';
@@ -1977,6 +1977,12 @@ export async function cleanupDockerStorage(dockerId, lowDiskSpace, force) {
19771977
} catch (error) {
19781978
//console.log(error);
19791979
}
1980+
// Cleanup build caches
1981+
try {
1982+
await executeDockerCmd({ dockerId, command: `docker builder prune -a -f` })
1983+
} catch (error) {
1984+
//console.log(error);
1985+
}
19801986
}
19811987
}
19821988

@@ -2022,3 +2028,27 @@ export function defaultComposeConfiguration(network: string): any {
20222028
}
20232029
}
20242030
}
2031+
export function decryptApplication(application: any) {
2032+
if (application) {
2033+
if (application?.gitSource?.githubApp?.clientSecret) {
2034+
application.gitSource.githubApp.clientSecret = decrypt(application.gitSource.githubApp.clientSecret) || null;
2035+
}
2036+
if (application?.gitSource?.githubApp?.webhookSecret) {
2037+
application.gitSource.githubApp.webhookSecret = decrypt(application.gitSource.githubApp.webhookSecret) || null;
2038+
}
2039+
if (application?.gitSource?.githubApp?.privateKey) {
2040+
application.gitSource.githubApp.privateKey = decrypt(application.gitSource.githubApp.privateKey) || null;
2041+
}
2042+
if (application?.gitSource?.gitlabApp?.appSecret) {
2043+
application.gitSource.gitlabApp.appSecret = decrypt(application.gitSource.gitlabApp.appSecret) || null;
2044+
}
2045+
if (application?.secrets.length > 0) {
2046+
application.secrets = application.secrets.map((s: any) => {
2047+
s.value = decrypt(s.value) || null
2048+
return s;
2049+
});
2050+
}
2051+
2052+
return application;
2053+
}
2054+
}

apps/api/src/routes/api/v1/applications/handlers.ts

+3-4
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export async function getImages(request: FastifyRequest<GetImages>) {
3434
const { buildPack, deploymentType } = request.body
3535
let publishDirectory = undefined;
3636
let port = undefined
37-
const { baseImage, baseBuildImage, baseBuildImages, baseImages, } = setDefaultBaseImage(
37+
const { baseImage, baseBuildImage, baseBuildImages, baseImages } = setDefaultBaseImage(
3838
buildPack, deploymentType
3939
);
4040
if (buildPack === 'nextjs') {
@@ -56,8 +56,7 @@ export async function getImages(request: FastifyRequest<GetImages>) {
5656
}
5757
}
5858

59-
60-
return { baseBuildImage, baseBuildImages, publishDirectory, port }
59+
return { baseImage, baseImages, baseBuildImage, baseBuildImages, publishDirectory, port }
6160
} catch ({ status, message }) {
6261
return errorHandler({ status, message })
6362
}
@@ -232,7 +231,6 @@ export async function saveApplication(request: FastifyRequest<SaveApplication>,
232231
baseBuildImage,
233232
deploymentType
234233
} = request.body
235-
236234
if (port) port = Number(port);
237235
if (exposePort) {
238236
exposePort = Number(exposePort);
@@ -451,6 +449,7 @@ export async function deployApplication(request: FastifyRequest<DeployApplicatio
451449
data: {
452450
id: buildId,
453451
applicationId: id,
452+
sourceBranch: branch,
454453
branch: application.branch,
455454
pullmergeRequestId,
456455
forceRebuild,

apps/api/src/routes/api/v1/iam/handlers.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,11 @@ export async function getTeam(request: FastifyRequest<OnlyId>, reply: FastifyRep
158158
});
159159
const team = await prisma.team.findUnique({ where: { id }, include: { permissions: true } });
160160
const invitations = await prisma.teamInvitation.findMany({ where: { teamId: team.id } });
161+
const { teams } = await prisma.user.findUnique({ where: { id: userId }, include: { teams: true } })
161162
return {
163+
currentTeam: teamId,
162164
team,
165+
teams,
163166
permissions,
164167
invitations
165168
};
@@ -275,10 +278,10 @@ export async function inviteToTeam(request: FastifyRequest<InviteToTeam>, reply:
275278
if (!userFound) {
276279
throw {
277280
message: `No user found with '${email}' email address.`
278-
};
281+
};
279282
}
280283
const uid = userFound.id;
281-
if (uid === userId) {
284+
if (uid === userId) {
282285
throw {
283286
message: `Invitation to yourself? Whaaaaat?`
284287
};

apps/api/src/routes/api/v1/sources/handlers.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export async function listSources(request: FastifyRequest) {
99
try {
1010
const teamId = request.user?.teamId;
1111
const sources = await prisma.gitSource.findMany({
12-
where: { teams: { some: { id: teamId === '0' ? undefined : teamId } } },
12+
where: { teams: { some: { id: teamId === '0' ? undefined : teamId } }, githubApp: { gitSource: { forPublic: false } } },
1313
include: { teams: true, githubApp: true, gitlabApp: true }
1414
});
1515
return {

apps/api/src/routes/webhooks/github/handlers.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ export async function gitHubEvents(request: FastifyRequest<GitHubEvents>): Promi
146146
message: 'Queued. Thank you!'
147147
};
148148
} else if (githubEvent === 'pull_request') {
149-
const pullmergeRequestId = body.number;
149+
const pullmergeRequestId = body.number.toString();
150150
const pullmergeRequestAction = body.action;
151151
const sourceBranch = body.pull_request.head.ref.includes('/') ? body.pull_request.head.ref.split('/')[2] : body.pull_request.head.ref;
152152
if (!allowedActions.includes(pullmergeRequestAction)) {

0 commit comments

Comments
 (0)