deployctl
deployctl copied to clipboard
[Bug]: deployctl deploy executes entrypoint before setting --env vars
Problem description
When creating a deployment from the CLI with deployctl deploy
we can set environment variables with --env
/ --env-file
. During deployment, Deno Deploy appears to execute the entrypoint module without the envars set.
- If the entrypoint requires the vars to be set, deployment fails.
- If the entrypoint can execute without the vars set, deployment succeeds and the CLI output indicates envars are set/saved after the point that it executes the entrypoint.
Steps to reproduce
Create a module/app that requires environment variables to work:
// main.ts
const name = Deno.env.get("GREETING_NAME");
if (!name) throw new Error("GREETING_NAME is not set");
Deno.serve((): Response => {
return new Response(`Hello ${name}\n`);
});
Deploy it with the environment variables set. Deployment fails due to the module being executed without the vars set:
$ deployctl deploy --include '*.ts' --env=GREETING_NAME=Foo --project=required-env
ℹ Using config file '/workspaces/xxx/deploy_playground/deno.json'
✔ Deploying to project required-env.
✔ Entrypoint: /workspaces/xxx/deploy_playground/main.ts
ℹ Uploading all files from the current dir (/workspaces/xxx/deploy_playground)
✔ Found 2 assets.
✔ Uploaded 2 new assets.
✖ Deployment failed.
error: The deployment failed: UNCAUGHT_EXCEPTION
Error: GREETING_NAME is not set
at file:///src/main.ts:2:18
If the throw is removed, deploy proceeds and shows ⠸ Setting environment variables...
after the point that it failed previously.
Expected behavior
Environment variables provided should be set when the entrypoint is executed.
Environment
$ deployctl --version
deployctl 1.12.0
$ deno --version
deno 1.43.1 (release, aarch64-unknown-linux-gnu)
v8 12.4.254.12
typescript 5.4.3
Possible solution
If vars can't be set before executing the entrypoint, maybe provide a way for an app to know it's being executed during deployment as a test, so that it can avoid loading config & failing if it's not available?
Additional context
No response