diff --git a/node-packages/commons/src/api.ts b/node-packages/commons/src/api.ts index d89b67817e..aa458a0cfe 100644 --- a/node-packages/commons/src/api.ts +++ b/node-packages/commons/src/api.ts @@ -3,7 +3,7 @@ import { Transport } from './lokka-transport-http-retry'; import { replace, pipe, toLower } from 'ramda'; import { getConfigFromEnv } from './util/config'; -import { DeploymentSourceType, DeployType, TaskStatusType, TaskSourceType } from './types'; +import { DeploymentSourceType, DeploymentBuildType, DeployType, TaskStatusType, TaskSourceType } from './types'; export interface Project { autoIdle: number; @@ -1190,12 +1190,13 @@ export const addDeployment = ( bulkName: string | null = null, sourceUser: string | null = null, sourceType: DeploymentSourceType, + buildType: DeploymentBuildType, ): Promise => graphqlapi.mutate( ` ($name: String!, $status: DeploymentStatusType!, $created: String!, $environment: Int!, $id: Int, $remoteId: String, $started: String, $completed: String, $priority: Int, $bulkId: String, $bulkName: String, - $sourceUser: String, $sourceType: DeploymentSourceType) { + $sourceUser: String, $sourceType: DeploymentSourceType, $buildType: DeploymentBuildType) { addDeployment(input: { name: $name status: $status @@ -1210,6 +1211,7 @@ export const addDeployment = ( bulkName: $bulkName sourceUser: $sourceUser sourceType: $sourceType + buildType: $buildType }) { ...${deploymentFragment} } diff --git a/node-packages/commons/src/tasks.ts b/node-packages/commons/src/tasks.ts index ad1329920c..5e9d924a54 100644 --- a/node-packages/commons/src/tasks.ts +++ b/node-packages/commons/src/tasks.ts @@ -352,6 +352,7 @@ export const getControllerBuildData = async function(deployTarget: any, deployDa bulkId, bulkName, sourceType, + buildType, } = deployData; const buildVariables = deployData.buildVariables || []; @@ -543,6 +544,7 @@ export const getControllerBuildData = async function(deployTarget: any, deployDa bulkName, sourceUser, sourceType, + buildType, ); } catch (error) { logger.error(`Could not save deployment for project ${lagoonProjectData.id}. Message: ${error}`); diff --git a/node-packages/commons/src/types.ts b/node-packages/commons/src/types.ts index be1a898b7a..120ea0a527 100644 --- a/node-packages/commons/src/types.ts +++ b/node-packages/commons/src/types.ts @@ -17,6 +17,11 @@ export enum DeploymentSourceType { WEBHOOK = 'webhook' } +export enum DeploymentBuildType { + BUILD = 'build', + VARIABLES = 'variables' +} + export enum TaskStatusType { NEW = 'new', PENDING = 'pending', @@ -91,6 +96,7 @@ export interface DeployData { sha?: string, sourceType: DeploymentSourceType, sourceUser?: string, + buildType?: DeploymentBuildType, type: DeployType; } diff --git a/node-packages/commons/src/util/lagoon.ts b/node-packages/commons/src/util/lagoon.ts index cdbfc63717..830daac8a7 100644 --- a/node-packages/commons/src/util/lagoon.ts +++ b/node-packages/commons/src/util/lagoon.ts @@ -4,6 +4,9 @@ import { EnvKeyValue } from '../api'; export const generateBuildId = () => `lagoon-build-${Math.random().toString(36).substring(7)}`; +export const generateVariableOnlyBuildId = () => + `lagoon-variables-${Math.random().toString(36).substring(7)}`; + export const generateTaskName = () => `lagoon-task-${Math.random().toString(36).substring(7)}`; diff --git a/services/api/database/migrations/20251115000000_buildtype.js b/services/api/database/migrations/20251115000000_buildtype.js new file mode 100644 index 0000000000..a286fa2085 --- /dev/null +++ b/services/api/database/migrations/20251115000000_buildtype.js @@ -0,0 +1,24 @@ +/** + * @param { import("knex").Knex } knex + * @returns { Promise } + */ + exports.up = async function(knex) { + return knex.schema + .alterTable('deployment', (table) => { + table.enu('build_type',['build','variables']).notNullable().defaultTo('build');; + }) + // set all existing deployments to build + .raw("UPDATE deployment SET build_type='build'"); +}; + +/** +* @param { import("knex").Knex } knex +* @returns { Promise } +*/ +exports.down = async function(knex) { + // cant alter enums in place, so drop the column first :D + return knex.schema + .alterTable('deployment', (table) => { + table.dropColumn('build_type'); + }) +}; diff --git a/services/api/src/resolvers.js b/services/api/src/resolvers.js index d1ffeeb017..e4fa649f07 100644 --- a/services/api/src/resolvers.js +++ b/services/api/src/resolvers.js @@ -402,6 +402,10 @@ async function getResolvers() { API: 'api', WEBHOOK: 'webhook' }, + DeploymentBuildType: { + BUILD: 'build', + VARIABLES: 'variables' + }, TaskSourceType: { API: 'api', }, diff --git a/services/api/src/resources/deployment/resolvers.ts b/services/api/src/resources/deployment/resolvers.ts index 39b6156f2e..46613d3bc7 100644 --- a/services/api/src/resources/deployment/resolvers.ts +++ b/services/api/src/resources/deployment/resolvers.ts @@ -25,12 +25,12 @@ import { addTask } from '@lagoon/commons/dist/api'; import { Sql as environmentSql } from '../environment/sql'; const { S3Client, GetObjectCommand } = require('@aws-sdk/client-s3'); import sha1 from 'sha1'; -import { generateBuildId } from '@lagoon/commons/dist/util/lagoon'; +import { generateBuildId, generateVariableOnlyBuildId } from '@lagoon/commons/dist/util/lagoon'; import { jsonMerge } from '@lagoon/commons/dist/util/func'; import { logger } from '../../loggers/logger'; import { getUserProjectIdsFromRoleProjectIds } from '../../util/auth'; import uuid4 from 'uuid4'; -import { DeploymentSourceType, DeployType, TaskStatusType, TaskSourceType, DeployData, AuditType } from '@lagoon/commons/dist/types'; +import { DeploymentSourceType, DeployType, TaskStatusType, TaskSourceType, DeployData, AuditType, DeploymentBuildType } from '@lagoon/commons/dist/types'; import { AuditLog } from '../audit/types'; const accessKeyId = process.env.S3_FILES_ACCESS_KEY_ID || 'minio' @@ -780,6 +780,13 @@ export const deployEnvironmentLatest: ResolverFn = async ( } let buildName = generateBuildId(); + let buildType = DeploymentBuildType.BUILD + // change the buildname to a variables only name if the build variable for lagoon variables only is found + if (buildVariables && buildVariables.find(e => e.name === 'LAGOON_VARIABLES_ONLY' && e.value === "true")) { + buildName = generateVariableOnlyBuildId(); + buildType = DeploymentBuildType.VARIABLES + } + const sourceUser = await Helpers(sqlClientPool).getSourceUser(keycloakGrant, legacyGrant) let deployData: DeployData; let meta: { @@ -800,7 +807,8 @@ export const deployEnvironmentLatest: ResolverFn = async ( buildVariables: buildVariables, sourceType: DeploymentSourceType.API, sourceUser: sourceUser, - branchName: environment.deployBaseRef + branchName: environment.deployBaseRef, + buildType: buildType }; meta = { ...meta, diff --git a/services/api/src/typeDefs.js b/services/api/src/typeDefs.js index cc0aaef2b3..2acfb0a3d9 100644 --- a/services/api/src/typeDefs.js +++ b/services/api/src/typeDefs.js @@ -147,6 +147,11 @@ const typeDefs = gql` API } + enum DeploymentBuildType { + BUILD + VARIABLES + } + scalar SeverityScore type AdvancedTaskDefinitionArgument { @@ -1007,6 +1012,7 @@ const typeDefs = gql` The source of this task from the available deplyoment trigger types """ sourceType: DeploymentSourceType + buildType: DeploymentBuildType } type Insight { @@ -1999,6 +2005,7 @@ const typeDefs = gql` buildStep: String sourceUser: String sourceType: DeploymentSourceType + buildType: DeploymentBuildType } input DeleteDeploymentInput {