From de0934bd95f2f0f2e47b65dce36e0d7c6f7bc213 Mon Sep 17 00:00:00 2001 From: SheyeJdev Date: Mon, 1 Jun 2026 16:23:59 +0100 Subject: [PATCH] feat:Setup production deployment checklist and verification --- .github/workflows/code-cleanup.yml | 23 +++++ .github/workflows/deployment-verification.yml | 25 ++++++ compliance/deprecation-registry.json | 11 +++ deployment/deployment-checklist.md | 0 deployment/deployment-runbook.md | 0 deployment/post-deployment-verification.md | 0 deployment/rollback-procedure.md | 0 docs/code-cleanup/cleanup-report-template.md | 0 docs/code-cleanup/cleanup-strategy.md | 0 docs/code-cleanup/deprecation-policy.md | 7 ++ docs/code-cleanup/removal-timeline.md | 7 ++ package-lock.json | 90 +++++++++++++++++++ scripts/analyze-dead-code.sh | 9 ++ scripts/find-unused-dependencies.sh | 13 +++ scripts/generate-deprecation-report.ts | 0 scripts/post-deployment-health-check.ts | 25 ++++++ src/common/decorators/deprecated.decorator.ts | 30 +++++++ src/common/utils/deprecation-logger.ts | 16 ++++ src/constants/deprecation.constants.ts | 10 +++ 19 files changed, 266 insertions(+) create mode 100644 .github/workflows/code-cleanup.yml create mode 100644 .github/workflows/deployment-verification.yml create mode 100644 compliance/deprecation-registry.json create mode 100644 deployment/deployment-checklist.md create mode 100644 deployment/deployment-runbook.md create mode 100644 deployment/post-deployment-verification.md create mode 100644 deployment/rollback-procedure.md create mode 100644 docs/code-cleanup/cleanup-report-template.md create mode 100644 docs/code-cleanup/cleanup-strategy.md create mode 100644 docs/code-cleanup/deprecation-policy.md create mode 100644 docs/code-cleanup/removal-timeline.md create mode 100644 scripts/analyze-dead-code.sh create mode 100644 scripts/find-unused-dependencies.sh create mode 100644 scripts/generate-deprecation-report.ts create mode 100644 scripts/post-deployment-health-check.ts create mode 100644 src/common/decorators/deprecated.decorator.ts create mode 100644 src/common/utils/deprecation-logger.ts create mode 100644 src/constants/deprecation.constants.ts diff --git a/.github/workflows/code-cleanup.yml b/.github/workflows/code-cleanup.yml new file mode 100644 index 00000000..e788b538 --- /dev/null +++ b/.github/workflows/code-cleanup.yml @@ -0,0 +1,23 @@ +name: Code Cleanup Audit + +on: + pull_request: + schedule: + - cron: "0 1 * * 0" + +jobs: + audit: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + + - run: npm ci + + - run: npx depcheck + + - run: npx ts-prune \ No newline at end of file diff --git a/.github/workflows/deployment-verification.yml b/.github/workflows/deployment-verification.yml new file mode 100644 index 00000000..77f13c1e --- /dev/null +++ b/.github/workflows/deployment-verification.yml @@ -0,0 +1,25 @@ +name: Deployment Verification + +on: + workflow_dispatch: + +jobs: + verify: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + + - run: npm ci + + - run: npm run verify:env + + - run: npm run verify:backup + + - run: npm run predeploy + + - run: npm run postdeploy \ No newline at end of file diff --git a/compliance/deprecation-registry.json b/compliance/deprecation-registry.json new file mode 100644 index 00000000..f1a67f41 --- /dev/null +++ b/compliance/deprecation-registry.json @@ -0,0 +1,11 @@ +{ + "deprecatedItems": [ + { + "name": "LegacyPaymentService", + "reason": "Superseded by PaymentOrchestrator", + "deprecatedDate": "2026-06-01", + "removalVersion": "v3.0.0", + "owner": "Backend Team" + } + ] + } \ No newline at end of file diff --git a/deployment/deployment-checklist.md b/deployment/deployment-checklist.md new file mode 100644 index 00000000..e69de29b diff --git a/deployment/deployment-runbook.md b/deployment/deployment-runbook.md new file mode 100644 index 00000000..e69de29b diff --git a/deployment/post-deployment-verification.md b/deployment/post-deployment-verification.md new file mode 100644 index 00000000..e69de29b diff --git a/deployment/rollback-procedure.md b/deployment/rollback-procedure.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/code-cleanup/cleanup-report-template.md b/docs/code-cleanup/cleanup-report-template.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/code-cleanup/cleanup-strategy.md b/docs/code-cleanup/cleanup-strategy.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/code-cleanup/deprecation-policy.md b/docs/code-cleanup/deprecation-policy.md new file mode 100644 index 00000000..1f38dec1 --- /dev/null +++ b/docs/code-cleanup/deprecation-policy.md @@ -0,0 +1,7 @@ +# Deprecation Policy + +1. Mark deprecated functionality with @Deprecated +2. Announce deprecation in release notes +3. Maintain functionality for at least one release cycle +4. Remove only after communicated deadline +5. Update deprecation registry \ No newline at end of file diff --git a/docs/code-cleanup/removal-timeline.md b/docs/code-cleanup/removal-timeline.md new file mode 100644 index 00000000..b704c375 --- /dev/null +++ b/docs/code-cleanup/removal-timeline.md @@ -0,0 +1,7 @@ +# Removal Timeline + +| Version | Action | +|----------|---------| +| v2.4.0 | Mark deprecated | +| v2.5.0 | Warning logs enabled | +| v3.0.0 | Removal | \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index c9e3a079..22e80453 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5870,6 +5870,78 @@ } } }, + "node_modules/@openapitools/openapi-generator-cli/node_modules/@nestjs/platform-express": { + "version": "11.1.24", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.24.tgz", + "integrity": "sha512-CeMKbRBm05aOBiWhIHWO2xDeHbxynBF9ySQv3gRjObz2N5+uJnYriAYkHvVqvC4JIydmMPmT5VdICFNlNz3qyA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "cors": "2.8.6", + "express": "5.2.1", + "multer": "2.1.1", + "path-to-regexp": "8.4.2", + "tslib": "2.8.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0" + } + }, + "node_modules/@openapitools/openapi-generator-cli/node_modules/@nestjs/platform-socket.io": { + "version": "11.1.24", + "resolved": "https://registry.npmjs.org/@nestjs/platform-socket.io/-/platform-socket.io-11.1.24.tgz", + "integrity": "sha512-ImdR9G8W5Y2Hhcptdci+tNaG6JV/dzDguFTgtXOL5ie/gD9O9ARw8Cd9RzF2+oteyzQ+1sPK/+wgVOPOyYGVCA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "socket.io": "4.8.3", + "tslib": "2.8.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/websockets": "^11.0.0", + "rxjs": "^7.1.0" + } + }, + "node_modules/@openapitools/openapi-generator-cli/node_modules/@nestjs/websockets": { + "version": "11.1.24", + "resolved": "https://registry.npmjs.org/@nestjs/websockets/-/websockets-11.1.24.tgz", + "integrity": "sha512-37Z/QYzZ4nPHcGyGGjhjoKVOcpSPMhmRQj5DS1l0RKlRYgq8S0cmgaZ6kQ8PI3259PdchLx41oQibXh22iEUiA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "iterare": "1.2.1", + "object-hash": "3.0.0", + "tslib": "2.8.1" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0", + "@nestjs/platform-socket.io": "^11.0.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "@nestjs/platform-socket.io": { + "optional": true + } + } + }, "node_modules/@openapitools/openapi-generator-cli/node_modules/@tokenizer/inflate": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz", @@ -7354,6 +7426,15 @@ "node": ">=20" } }, + "node_modules/@segment/analytics-node/node_modules/jose": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", + "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/@simple-libs/stream-utils": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-1.2.0.tgz", @@ -17009,6 +17090,15 @@ "dev": true, "license": "MIT" }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", diff --git a/scripts/analyze-dead-code.sh b/scripts/analyze-dead-code.sh new file mode 100644 index 00000000..e714768d --- /dev/null +++ b/scripts/analyze-dead-code.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +echo "Running dead code analysis" + +npx ts-prune > reports/unused-exports.txt + +npx depcheck > reports/unused-dependencies.txt + +echo "Analysis complete" \ No newline at end of file diff --git a/scripts/find-unused-dependencies.sh b/scripts/find-unused-dependencies.sh new file mode 100644 index 00000000..c007e824 --- /dev/null +++ b/scripts/find-unused-dependencies.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +echo "Checking unused dependencies..." + +npx depcheck + +echo "Checking TypeScript exports..." + +npx ts-prune + +echo "Checking duplicate packages..." + +npm ls \ No newline at end of file diff --git a/scripts/generate-deprecation-report.ts b/scripts/generate-deprecation-report.ts new file mode 100644 index 00000000..e69de29b diff --git a/scripts/post-deployment-health-check.ts b/scripts/post-deployment-health-check.ts new file mode 100644 index 00000000..df4557f8 --- /dev/null +++ b/scripts/post-deployment-health-check.ts @@ -0,0 +1,25 @@ +const endpoints = [ + '/health', + '/health/live', + '/health/ready', + ]; + + async function run() { + const baseUrl = process.env.APP_URL; + + for (const endpoint of endpoints) { + const response = await fetch( + `${baseUrl}${endpoint}`, + ); + + if (!response.ok) { + throw new Error( + `Health check failed: ${endpoint}`, + ); + } + } + + console.log('All health checks passed'); + } + + run(); \ No newline at end of file diff --git a/src/common/decorators/deprecated.decorator.ts b/src/common/decorators/deprecated.decorator.ts new file mode 100644 index 00000000..2055fe3c --- /dev/null +++ b/src/common/decorators/deprecated.decorator.ts @@ -0,0 +1,30 @@ +import { Logger } from '@nestjs/common'; + +const logger = new Logger('Deprecation'); + +export interface DeprecatedOptions { + reason: string; + removalVersion: string; +} + +export function Deprecated(options: DeprecatedOptions) { + return ( + target: any, + propertyKey?: string, + descriptor?: PropertyDescriptor, + ) => { + const originalMethod = descriptor?.value; + + if (originalMethod) { + descriptor.value = function (...args: any[]) { + logger.warn( + `[DEPRECATED] ${propertyKey} - ${options.reason}. Scheduled removal: ${options.removalVersion}`, + ); + + return originalMethod.apply(this, args); + }; + } + + Reflect.defineMetadata('deprecated', options, target); + }; +} \ No newline at end of file diff --git a/src/common/utils/deprecation-logger.ts b/src/common/utils/deprecation-logger.ts new file mode 100644 index 00000000..8c77d790 --- /dev/null +++ b/src/common/utils/deprecation-logger.ts @@ -0,0 +1,16 @@ +import { Logger } from '@nestjs/common'; + +export class DeprecationLogger { + private static readonly logger = + new Logger('DeprecationLogger'); + + static warn( + feature: string, + reason: string, + removalVersion: string, + ) { + this.logger.warn( + `${feature} is deprecated. Reason: ${reason}. Removal: ${removalVersion}`, + ); + } +} \ No newline at end of file diff --git a/src/constants/deprecation.constants.ts b/src/constants/deprecation.constants.ts new file mode 100644 index 00000000..93f4c478 --- /dev/null +++ b/src/constants/deprecation.constants.ts @@ -0,0 +1,10 @@ +export const DEPRECATION_VERSIONS = { + NEXT_MINOR: 'v2.5.0', + NEXT_MAJOR: 'v3.0.0', + }; + + export const DEPRECATION_REASONS = { + LEGACY_API: 'Legacy API implementation', + OLD_BUSINESS_LOGIC: 'Superseded business logic', + EXPERIMENTAL_FEATURE: 'Experimental implementation', + }; \ No newline at end of file