Skip to content

Commit 327bff8

Browse files
authored
issue#257 | Madge changes to fail CD when required env are missing
1 parent 28636d7 commit 327bff8

File tree

6 files changed

+126
-4
lines changed

6 files changed

+126
-4
lines changed

.github/workflows/register-commands-production.yaml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,31 @@ on:
33
push:
44
branches: main
55
jobs:
6+
Environment-Variables-Check:
7+
runs-on: ubuntu-latest
8+
environment: production
9+
steps:
10+
- uses: actions/checkout@v2
11+
- uses: actions/setup-node@v3
12+
with:
13+
node-version: 18.18.2
14+
- run: npm install
15+
- run: npm run env-var-check
16+
env:
17+
CURRENT_ENVIRONMENT: production
18+
DISCORD_APPLICATION_ID: ${{secrets.DISCORD_APPLICATION_ID}}
19+
DISCORD_GUILD_ID: ${{secrets.DISCORD_GUILD_ID}}
20+
DISCORD_TOKEN: ${{secrets.DISCORD_TOKEN}}
21+
DISCORD_PUBLIC_KEY: ${{secrets.DISCORD_PUBLIC_KEY}}
22+
CLOUDFLARE_API_TOKEN: ${{secrets.CLOUDFLARE_API_TOKEN}}
23+
CLOUDFLARE_ACCOUNT_ID: ${{secrets.CLOUDFLARE_ACCOUNT_ID}}
24+
BOT_PRIVATE_KEY: ${{secrets.BOT_PRIVATE_KEY}}
25+
RDS_SERVERLESS_PUBLIC_KEY: ${{secrets.RDS_SERVERLESS_PUBLIC_KEY}}
26+
CRON_JOBS_PUBLIC_KEY: ${{secrets.CRON_JOBS_PUBLIC_KEY}}
27+
IDENTITY_SERVICE_PUBLIC_KEY: ${{secrets.IDENTITY_SERVICE_PUBLIC_KEY}}
28+
629
Register-Commands:
30+
needs: [Environment-Variables-Check]
731
runs-on: ubuntu-latest
832
environment: production
933
steps:

.github/workflows/register-commands-staging.yaml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,31 @@ on:
33
push:
44
branches: develop
55
jobs:
6+
Environment-Variables-Check:
7+
runs-on: ubuntu-latest
8+
environment: staging
9+
steps:
10+
- uses: actions/checkout@v2
11+
- uses: actions/setup-node@v3
12+
with:
13+
node-version: 18.18.2
14+
- run: npm install
15+
- run: npm run env-var-check
16+
env:
17+
CURRENT_ENVIRONMENT: staging
18+
DISCORD_APPLICATION_ID: ${{secrets.DISCORD_APPLICATION_ID}}
19+
DISCORD_GUILD_ID: ${{secrets.DISCORD_GUILD_ID}}
20+
DISCORD_TOKEN: ${{secrets.DISCORD_TOKEN}}
21+
DISCORD_PUBLIC_KEY: ${{secrets.DISCORD_PUBLIC_KEY}}
22+
CLOUDFLARE_API_TOKEN: ${{secrets.CLOUDFLARE_API_TOKEN}}
23+
CLOUDFLARE_ACCOUNT_ID: ${{secrets.CLOUDFLARE_ACCOUNT_ID}}
24+
BOT_PRIVATE_KEY: ${{secrets.BOT_PRIVATE_KEY}}
25+
RDS_SERVERLESS_PUBLIC_KEY: ${{secrets.RDS_SERVERLESS_PUBLIC_KEY}}
26+
CRON_JOBS_PUBLIC_KEY: ${{secrets.CRON_JOBS_PUBLIC_KEY}}
27+
IDENTITY_SERVICE_PUBLIC_KEY: ${{secrets.IDENTITY_SERVICE_PUBLIC_KEY}}
28+
629
Register-Commands:
30+
needs: [Environment-Variables-Check]
731
runs-on: ubuntu-latest
832
environment: staging
933
steps:

config/config.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,51 @@ import {
1919
DISCORD_PROFILE_SERVICE_STAGING_HELP_GROUP,
2020
DISCORD_PROFILE_SERVICE_DEVELOPMENT_HELP_GROUP,
2121
} from "../src/constants/variables";
22+
import { config as configFromDotEnv } from "dotenv";
23+
24+
export function loadEnv(env: env, fromWorkerEnv: boolean): env {
25+
const Env: env = {
26+
//if `fromWokerEnv` is true, then load from the `env` passed as argument to the function,
27+
// else if `fromWokerEnv` is false, load from process.env
28+
//(or set to '' if value from process.env is undefined) to avoid Error TS2322
29+
CURRENT_ENVIRONMENT: fromWorkerEnv
30+
? env.CURRENT_ENVIRONMENT
31+
: process.env.CURRENT_ENVIRONMENT || "",
32+
DISCORD_APPLICATION_ID: fromWorkerEnv
33+
? env.DISCORD_APPLICATION_ID
34+
: process.env.DISCORD_APPLICATION_ID || "",
35+
DISCORD_GUILD_ID: fromWorkerEnv
36+
? env.DISCORD_GUILD_ID
37+
: process.env.DISCORD_GUILD_ID || "",
38+
DISCORD_TOKEN: fromWorkerEnv
39+
? env.DISCORD_TOKEN
40+
: process.env.DISCORD_TOKEN || "",
41+
DISCORD_PUBLIC_KEY: fromWorkerEnv
42+
? env.DISCORD_PUBLIC_KEY
43+
: process.env.DISCORD_PUBLIC_KEY || "",
44+
CLOUDFLARE_API_TOKEN: fromWorkerEnv
45+
? env.CLOUDFLARE_API_TOKEN
46+
: process.env.CLOUDFLARE_API_TOKEN || "",
47+
CLOUDFLARE_ACCOUNT_ID: fromWorkerEnv
48+
? env.CLOUDFLARE_ACCOUNT_ID
49+
: process.env.CLOUDFLARE_ACCOUNT_ID || "",
50+
BOT_PRIVATE_KEY: fromWorkerEnv
51+
? env.BOT_PRIVATE_KEY
52+
: process.env.BOT_PRIVATE_KEY || "",
53+
RDS_SERVERLESS_PUBLIC_KEY: fromWorkerEnv
54+
? env.RDS_SERVERLESS_PUBLIC_KEY
55+
: process.env.RDS_SERVERLESS_PUBLIC_KEY || "",
56+
CRON_JOBS_PUBLIC_KEY: fromWorkerEnv
57+
? env.CRON_JOBS_PUBLIC_KEY
58+
: process.env.CRON_JOBS_PUBLIC_KEY || "",
59+
IDENTITY_SERVICE_PUBLIC_KEY: fromWorkerEnv
60+
? env.IDENTITY_SERVICE_PUBLIC_KEY
61+
: process.env.IDENTITY_SERVICE_PUBLIC_KEY || "",
62+
};
63+
return Env;
64+
}
65+
66+
configFromDotEnv();
2267

2368
const config = (env: env) => {
2469
const environment: environment = {

config/envVarCheck.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { env } from "../src/typeDefinitions/default.types";
2+
import { loadEnv } from "./config";
3+
4+
validateEnv();
5+
6+
/**
7+
* Validate if all the required environment variables are set to a non empty value
8+
* else throw an error
9+
* ---
10+
*/
11+
export function validateEnv() {
12+
//pass empty object as env and fromWorkerEnv = false, since this method is should get executed in github actions and not in worker
13+
const envLoadedFromProcess: env = loadEnv({}, false);
14+
const missingEnvVars = Object.keys(envLoadedFromProcess).filter(
15+
(key) => envLoadedFromProcess[key] == ""
16+
);
17+
18+
// Logging missing environment variables and throw error if any are missing
19+
if (missingEnvVars.length > 0) {
20+
throw new Error(
21+
`Missing environment variables: ${missingEnvVars.join(", ")}`
22+
);
23+
} else {
24+
console.log("All required environment variables are set.");
25+
}
26+
}

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
"format-fix": "prettier --write .",
1616
"fix": "npm run lint-fix && npm run format-fix",
1717
"ngrok": "ngrok http 8787",
18-
"register": "ts-node-esm src/register.ts"
18+
"register": "ts-node-esm src/register.ts",
19+
"env-var-check": "ts-node-esm config/envVarCheck.ts"
1920
},
2021
"keywords": [],
2122
"author": "",

src/index.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { generateInviteLink } from "./controllers/generateDiscordInvite";
2222
import { sendProfileBlockedMessage } from "./controllers/profileHandler";
2323
import { sendTaskUpdatesHandler } from "./controllers/taskUpdatesHandler";
2424

25-
import config from "./../config/config";
25+
import config, { loadEnv } from "./../config/config";
2626

2727
const router = Router();
2828

@@ -107,10 +107,12 @@ export default {
107107
return new JSONResponse(response.BAD_SIGNATURE, { status: 401 });
108108
}
109109
}
110-
return router.handle(request, env, ctx);
110+
const envLoadedFromWorker: env = loadEnv(env, true);
111+
return router.handle(request, envLoadedFromWorker, ctx);
111112
},
112113

113114
async scheduled(req: Request, env: env, ctx: ExecutionContext) {
114-
ctx.waitUntil(send(env));
115+
const envLoadedFromWorker: env = loadEnv(env, true);
116+
ctx.waitUntil(send(envLoadedFromWorker));
115117
},
116118
};

0 commit comments

Comments
 (0)