Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,12 @@ services:
context: .
dockerfile: v6y-config/Dockerfile.migrations
environment:
- PSQL_DB_HOST=${PSQL_DB_HOST}
- PSQL_DB_HOST=v6y-database
- PSQL_DB_NAME=${PSQL_DB_NAME}
- PSQL_DB_USER=${PSQL_DB_USER}
- PSQL_DB_PASSWORD=${PSQL_DB_PASSWORD}
- PSQL_DB_PORT=${PSQL_DB_PORT}
- DATABASE_URL=postgresql://${PSQL_DB_USER}:${PSQL_DB_PASSWORD}@v6y-database:${PSQL_DB_PORT}/${PSQL_DB_NAME}
depends_on:
v6y-database:
condition: service_healthy
Expand Down Expand Up @@ -85,7 +86,11 @@ services:
- V6Y_MAIN_API_PATH=${V6Y_MAIN_API_PATH}
- V6Y_MAIN_API_PORT=${V6Y_MAIN_API_PORT}
- V6Y_STATIC_ANALYZER_API_PATH=${V6Y_STATIC_ANALYZER_API_PATH}
- V6Y_STATIC_ANALYZER_API_PORT=${V6Y_STATIC_ANALYZER_API_PORT}
- V6Y_DYNAMIC_ANALYZER_API_PATH=${V6Y_DYNAMIC_ANALYZER_API_PATH}
- V6Y_DYNAMIC_ANALYZER_API_PORT=${V6Y_DYNAMIC_ANALYZER_API_PORT}
- V6Y_DEVOPS_API_PATH=${V6Y_DEVOPS_API_PATH}
- V6Y_DEVOPS_API_PORT=${V6Y_DEVOPS_API_PORT}
depends_on:
v6y-migrate:
condition: service_completed_successfully
Expand Down
4 changes: 2 additions & 2 deletions env-template
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
PSQL_DB_HOST=x.x.x.x
PSQL_DB_HOST=localhost
PSQL_DB_NAME=x
PSQL_DB_USER=x
PSQL_DB_PASSWORD=x
PSQL_DB_PORT=
DATABASE_URL=postgresql://user:password@host:port/database
DATABASE_URL=postgresql://user:password@localhost:port/database

SUPERADMIN_USERNAME=x
SUPERADMIN_EMAIL=x
Expand Down
2 changes: 1 addition & 1 deletion v6y-apps/bfb-devops-auditor/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
"scripts": {
"build:tsc": "tsc --project ./tsconfig.json",
"check:tsc": "tsc --noEmit --project ./tsconfig.json",
"start:dev": "nodemon --exec node --env-file=./.env --loader ts-node/esm src/index.ts -- --dev",
"start:dev": "NODE_ENV=development nodemon --exec node --env-file=./.env --loader ts-node/esm src/index.ts -- --dev",
"start": "nodemon --exec node --env-file=./.env --loader ts-node/esm src/index.ts --",
"code:analyze": "es6-plato -r -d target/report src",
"lint": "eslint --config ./eslint.config.mjs --cache-location ./.eslintcache \"./**/*.ts\" --cache",
Expand Down
10 changes: 5 additions & 5 deletions v6y-apps/bfb-devops-auditor/src/auditors/DevOpsAuditorManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,25 @@
*/
import { AppLogger, WorkerHelper } from '@v6y/core-logic';

import ServerConfig from '../commons/ServerConfig.ts';
import { AuditCommonsType } from './types/AuditCommonsType.ts';

const { forkWorker } = WorkerHelper;
const { currentConfig } = ServerConfig;

/**
* Starts the DevOps audit process for a given application
* @param applicationId
* @param auditRunId
*/
const startDevOpsAudit = async ({ applicationId }: AuditCommonsType) => {
const startDevOpsAudit = async ({ applicationId, auditRunId }: AuditCommonsType) => {
try {
AppLogger.info('[DevOpsAuditorManager - startDevOpsAudit] applicationId: ', applicationId);
AppLogger.info('[DevOpsAuditorManager - startDevOpsAudit] auditRunId: ', auditRunId);

// Start audits in a worker thread to prevent blocking the main thread
const workerConfig = {
...currentConfig,
applicationId,
} as WorkerOptions;
auditRunId,
};

await forkWorker('./src/workers/DevOpsAnalysisWorker.ts', workerConfig);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,12 @@ const { analyseDoraMetrics } = DoraMetricsUtils;
* Starts the Dora Metrics auditor analysis.
* @param auditConfig
*/
const startAuditorAnalysis = async ({ applicationId }: DoraMetricsAuditConfigType) => {
const startAuditorAnalysis = async ({ applicationId, auditRunId }: DoraMetricsAuditConfigType) => {
try {
AppLogger.info(
`[DoraMetricsAuditor - startAuditorAnalysis] applicationId: ${applicationId}`,
);
AppLogger.info(`[DoraMetricsAuditor - startAuditorAnalysis] auditRunId: ${auditRunId}`);

if (applicationId === undefined) {
return false;
Expand Down Expand Up @@ -69,6 +70,15 @@ const startAuditorAnalysis = async ({ applicationId }: DoraMetricsAuditConfigTyp
auditReports.push(...reports);
}

// Add auditRunId to each report
if (auditRunId) {
const auditRunIdNum =
typeof auditRunId === 'string' ? parseInt(auditRunId, 10) : auditRunId;
auditReports.forEach((audit) => {
audit.auditRunId = auditRunIdNum;
});
}

await AuditProvider.insertAuditList(auditReports);

AppLogger.info(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ import { ApplicationType } from '@v6y/core-logic';
export interface AuditCommonsType {
applicationId?: number;
application?: ApplicationType;
auditRunId?: string;
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { MonitoringEventType, RepositoryType } from '@v6y/core-logic';

export interface DoraMetricsAuditConfigType {
applicationId?: number;
auditRunId?: string;
}

export interface startDoraMetricsAnalysisParamsType {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,11 @@ DevOpsAuditorRouter.post('/start-devops-auditor.json', async (request, response)
try {
AppLogger.debug('[DevOpsAuditorRouter] Entering service: [start-devops-auditor]');

const { applicationId } = request.body || {};
const { applicationId, auditRunId } = request.body || {};

// ********************************************** Input Validation ***********************************************
AppLogger.info(`[DevOpsAuditorRouter] applicationId: ${applicationId}`);
AppLogger.info(`[DevOpsAuditorRouter] auditRunId: ${auditRunId}`);

if (!applicationId) {
AppLogger.error(
Expand All @@ -32,6 +33,7 @@ DevOpsAuditorRouter.post('/start-devops-auditor.json', async (request, response)
// ********************************************** Start Audits ***********************************************
const auditsStartedSuccessfully = await DevOpsAuditorManager.startDevOpsAudit({
applicationId,
auditRunId,
}); // Wait for audits to potentially complete

// ********************************************** Server Response ***********************************************
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ import DoraMetricsAuditor from '../auditors/dora-metrics/DoraMetricsAuditor.ts';
AppLogger.info('******************** Starting background Audit **************************');

try {
const { applicationId } = workerData || {};
const { applicationId, auditRunId } = workerData || {};
AppLogger.info(`[DoraMetricsAnalysisWorker] applicationId: ${applicationId}`);
AppLogger.info(`[DoraMetricsAnalysisWorker] auditRunId: ${auditRunId}`);

// *********************************************** Database Configuration and Connection ***********************************************
await DataBaseManager.connect();
Expand All @@ -18,6 +19,7 @@ try {

const result = await DoraMetricsAuditor.startAuditorAnalysis({
applicationId,
auditRunId,
});

PerformancesUtils.endMeasure('DoraMetricsAnalysisWorker-startAuditorAnalysis');
Expand Down
2 changes: 1 addition & 1 deletion v6y-apps/bfb-dynamic-auditor/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
"scripts": {
"build:tsc": "tsc --project ./tsconfig.json",
"check:tsc": "tsc --noEmit --project ./tsconfig.json",
"start:dev": "nodemon --exec node --env-file=./.env --loader ts-node/esm src/index.ts -- --dev",
"start:dev": "NODE_ENV=development nodemon --exec node --env-file=./.env --loader ts-node/esm src/index.ts -- --dev",
"start": "nodemon --exec node --env-file=./.env --loader ts-node/esm src/index.ts --",
"code:analyze": "es6-plato -r -d target/report src",
"lint": "eslint --config ./eslint.config.mjs --cache-location ./.eslintcache \"./**/*.ts\" --cache",
Expand Down
69 changes: 46 additions & 23 deletions v6y-apps/bfb-dynamic-auditor/src/auditors/DynamicAuditorManager.ts
Original file line number Diff line number Diff line change
@@ -1,51 +1,74 @@
import { AppLogger, WorkerHelper } from '@v6y/core-logic';

import ServerConfig from '../commons/ServerConfig.ts';
import { AuditCommonsType } from './types/AuditCommonsType.ts';

const { forkWorker } = WorkerHelper;
const { currentConfig } = ServerConfig;

const startDynamicAudit = async ({ applicationId }: AuditCommonsType) => {
const startDynamicAudit = async ({ applicationId, auditRunId }: AuditCommonsType) => {
try {
AppLogger.info(
'[DynamicAuditorManager - startDynamicAudit] applicationId: ',
applicationId,
);
AppLogger.info('[DynamicAuditorManager - startDynamicAudit] auditRunId: ', auditRunId);

// Start audits in a worker thread to prevent blocking the main thread
const workerConfig = {
...currentConfig,
applicationId,
auditRunId,
};

// start Lighthouse analysis
await forkWorker(
'./src/workers/LighthouseAnalysisWorker.ts',
workerConfig as WorkerOptions,
);
AppLogger.info(
'[DynamicAuditorManager - startDynamicAudit] Lighthouse Audit have completed successfully.',
);
try {
await forkWorker(
'./src/workers/LighthouseAnalysisWorker.ts',
workerConfig as WorkerOptions,
);
AppLogger.info(
'[DynamicAuditorManager - startDynamicAudit] Lighthouse Audit have completed successfully.',
);
} catch (lighthouseError) {
AppLogger.error(
'[DynamicAuditorManager - startDynamicAudit] Lighthouse worker error:',
lighthouseError,
);
}

// start Green Hosting analysis
await forkWorker(
'./src/workers/GreenHostingAnalysisWorker.ts',
workerConfig as WorkerOptions,
);
AppLogger.info(
'[DynamicAuditorManager - startDynamicAudit] Green Hosting Audit have completed successfully.',
);
try {
await forkWorker(
'./src/workers/GreenHostingAnalysisWorker.ts',
workerConfig as WorkerOptions,
);
AppLogger.info(
'[DynamicAuditorManager - startDynamicAudit] Green Hosting Audit have completed successfully.',
);
} catch (greenError) {
AppLogger.error(
'[DynamicAuditorManager - startDynamicAudit] Green Hosting worker error:',
greenError,
);
}

// start SonarQube analysis
await forkWorker('./src/workers/SonarQubeAnalysisWorker.ts', workerConfig as WorkerOptions);
AppLogger.info(
'[DynamicAuditorManager - startDynamicAudit] SonarQube Audit have completed successfully.',
);
try {
await forkWorker(
'./src/workers/SonarQubeAnalysisWorker.ts',
workerConfig as WorkerOptions,
);
AppLogger.info(
'[DynamicAuditorManager - startDynamicAudit] SonarQube Audit have completed successfully.',
);
} catch (sonarError) {
AppLogger.error(
'[DynamicAuditorManager - startDynamicAudit] SonarQube worker error:',
sonarError,
);
}

return true; // Indicates successful initiation of audits
} catch (error) {
AppLogger.info(
AppLogger.error(
'[DynamicAuditorManager - startDynamicAudit] An exception occurred during the app audits: ',
error,
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,11 +149,17 @@ const fetchSonarQubeData = async (
* Fetches SonarQube metrics for an application and persists them as AuditType records in the DB.
* Follows the same batch auditor pattern as LighthouseAuditor.
*/
const startAuditorAnalysis = async ({ applicationId }: AuditCommonsType): Promise<boolean> => {
const startAuditorAnalysis = async ({
applicationId,
auditRunId,
}: AuditCommonsType): Promise<boolean> => {
try {
AppLogger.info(
`[SonarQubeAuditorManager - startAuditorAnalysis] applicationId: ${applicationId}`,
);
AppLogger.info(
`[SonarQubeAuditorManager - startAuditorAnalysis] auditRunId: ${auditRunId}`,
);

if (applicationId === undefined) {
return false;
Expand Down Expand Up @@ -236,6 +242,15 @@ const startAuditorAnalysis = async ({ applicationId }: AuditCommonsType): Promis
});
}

// Add auditRunId to each report
if (auditRunId) {
const auditRunIdNum =
typeof auditRunId === 'string' ? parseInt(auditRunId, 10) : auditRunId;
auditReports.forEach((audit) => {
audit.auditRunId = auditRunIdNum;
});
}

await AuditProvider.insertAuditList(auditReports);

AppLogger.info(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,14 @@ const { formatGreenHostingReports } = GreenHostingUtils;
* Iterates over production links and checks them against
* The Green Web Foundation API.
* @param applicationId
* @param auditRunId
*/
const startAuditorAnalysis = async ({ applicationId }: AuditCommonsType) => {
const startAuditorAnalysis = async ({ applicationId, auditRunId }: AuditCommonsType) => {
try {
AppLogger.info(
`[GreenHostingAuditor - startAuditorAnalysis] applicationId: ${applicationId}`,
);
AppLogger.info(`[GreenHostingAuditor - startAuditorAnalysis] auditRunId: ${auditRunId}`);

if (applicationId === undefined) {
AppLogger.warn(
Expand Down Expand Up @@ -68,6 +70,15 @@ const startAuditorAnalysis = async ({ applicationId }: AuditCommonsType) => {
return true;
}

// Add auditRunId to each report
if (auditRunId) {
const auditRunIdNum =
typeof auditRunId === 'string' ? parseInt(auditRunId, 10) : auditRunId;
greenHostingReports.forEach((audit) => {
audit.auditRunId = auditRunIdNum;
});
}

await AuditProvider.insertAuditList(greenHostingReports);

AppLogger.info(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,13 +75,19 @@ const startLighthouseAudit = async (auditConfig: LighthouseAuditConfigType) => {
/**
* Starts the Lighthouse audit for a given application.
* @param applicationId
* @param auditRunId
* @param browserPath
*/
const startAuditorAnalysis = async ({ applicationId, browserPath }: LighthouseAuditConfigType) => {
const startAuditorAnalysis = async ({
applicationId,
auditRunId,
browserPath,
}: LighthouseAuditConfigType) => {
try {
AppLogger.info(
`[LighthouseAuditor - startAuditorAnalysis] applicationId: ${applicationId}`,
);
AppLogger.info(`[LighthouseAuditor - startAuditorAnalysis] auditRunId: ${auditRunId}`);
AppLogger.info(`[LighthouseAuditor - startAuditorAnalysis] browserPath: ${browserPath}`);

if (applicationId === undefined) {
Expand Down Expand Up @@ -164,6 +170,15 @@ const startAuditorAnalysis = async ({ applicationId, browserPath }: LighthouseAu
`[LighthouseAuditor - startAuditorAnalysis] auditReports: ${auditReports?.length}`,
);

// Add auditRunId to each report
if (auditRunId) {
const auditRunIdNum =
typeof auditRunId === 'string' ? parseInt(auditRunId, 10) : auditRunId;
auditReports.forEach((audit) => {
audit.auditRunId = auditRunIdNum;
});
}

await AuditProvider.insertAuditList(auditReports);

AppLogger.info(
Expand All @@ -186,6 +201,15 @@ const startAuditorAnalysis = async ({ applicationId, browserPath }: LighthouseAu
`[LighthouseAuditor - startAuditorAnalysis] ecoIndexReports: ${ecoIndexReports?.length}`,
);

// Add auditRunId to each ecoIndex report
if (auditRunId) {
const auditRunIdNum =
typeof auditRunId === 'string' ? parseInt(auditRunId, 10) : auditRunId;
ecoIndexReports.forEach((audit) => {
audit.auditRunId = auditRunIdNum;
});
}

await AuditProvider.insertAuditList(ecoIndexReports);

AppLogger.info(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ export interface AuditCommonsType {
applicationId?: number;
application?: ApplicationType;
workspaceFolder?: string;
auditRunId?: string;
}
Loading
Loading