From 420860a35410664e2e7b30b44a9ebf69dfffd75a Mon Sep 17 00:00:00 2001 From: Matous Marik Date: Mon, 24 Aug 2026 16:24:11 +0200 Subject: [PATCH] feat: add --apply-env-vars-to-build flag to apify push Allows env vars from actor.json to be applied to the Actor build process (Docker build args) without flipping the switch in Console. --no-apply-env-vars-to-build explicitly turns the setting off. When the flag is omitted, the value stored on the platform is kept. The flag parser matched provided flags by truthiness, which dropped scalar false values injected by the test harness (the real CLI path always yields arrays via multiple: true and was unaffected); it now checks for presence so harness-injected negated booleans behave the same as parsed ones. --- docs/reference.md | 9 ++++- src/commands/actors/push.ts | 10 ++++- src/lib/command-framework/apify-command.ts | 6 ++- test/api/commands/push.test.ts | 46 ++++++++++++++++++++++ 4 files changed, 66 insertions(+), 5 deletions(-) diff --git a/docs/reference.md b/docs/reference.md index a9f4d6b38..996f94fe4 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -760,8 +760,8 @@ DESCRIPTION USAGE $ apify actors push [actorId] [--allow-missing-secrets] - [-b ] [--dir ] [-f] [--json] [--open] - [-v ] [-w ] + [--apply-env-vars-to-build] [-b ] [--dir ] + [-f] [--json] [--open] [-v ] [-w ] ARGUMENTS actorId Name or ID of the Actor to push (e.g. "apify/hello-world" or @@ -772,6 +772,11 @@ FLAGS --allow-missing-secrets Allow the command to continue even when secret values are not found in the local secrets storage. + --apply-env-vars-to-build Make the environment + variables also available to the Actor build + process. Use --no-apply-env-vars-to-build to turn + the setting off. When omitted, the setting + currently stored on the platform is kept. -b, --build-tag= Build tag to be applied to the successful Actor build. By default, it is taken from the '.actor/actor.json' file. diff --git a/src/commands/actors/push.ts b/src/commands/actors/push.ts index d2d2c546a..c97f121bc 100644 --- a/src/commands/actors/push.ts +++ b/src/commands/actors/push.ts @@ -191,6 +191,11 @@ export class ActorsPushCommand extends ApifyCommand { required: false, default: false, }), + 'apply-env-vars-to-build': Flags.boolean({ + description: + 'Make the environment variables also available to the Actor build process. Use --no-apply-env-vars-to-build to turn the setting off. When omitted, the setting currently stored on the platform is kept.', + required: false, + }), }; static override args = { @@ -406,9 +411,11 @@ Skipping push. Use --force to override.`, allowMissing: this.flags.allowMissingSecrets, }) : undefined; + // true/false when --[no-]apply-env-vars-to-build is passed, undefined when omitted so the value stored on the platform is preserved + const { applyEnvVarsToBuild } = this.flags; if (actorCurrentVersion) { - const actorVersionModifier = { tarballUrl, sourceFiles, buildTag, sourceType, envVars }; + const actorVersionModifier = { tarballUrl, sourceFiles, buildTag, sourceType, envVars, applyEnvVarsToBuild }; // TODO: fix this type too -.- await actorClient.version(version).update(actorVersionModifier as never); run({ message: `Updated version ${version} for Actor ${actor.name}.` }); @@ -420,6 +427,7 @@ Skipping push. Use --force to override.`, buildTag, sourceType, envVars, + applyEnvVarsToBuild, }; await actorClient.versions().create({ diff --git a/src/lib/command-framework/apify-command.ts b/src/lib/command-framework/apify-command.ts index 06b024537..f4718581e 100644 --- a/src/lib/command-framework/apify-command.ts +++ b/src/lib/command-framework/apify-command.ts @@ -500,7 +500,9 @@ export abstract class ApifyCommand rawFlags[matcher]); + // Check for presence, not truthiness: the real CLI path always yields arrays (`multiple: true`), but + // internalRunCommand/testRunCommand inject scalar values, where an explicit `false` must match too + const matchingFlags = allMatchers.filter((matcher) => typeof rawFlags[matcher] !== 'undefined'); if (matchingFlags.length > 1) { throw new CommandError({ @@ -514,7 +516,7 @@ export abstract class ApifyCommand { TEST_TIMEOUT, ); + it( + 'should set applyEnvVarsToBuild when the flag is passed and keep it when omitted', + async () => { + const testActor = await testUserClient.actors().create(TEST_ACTOR); + actorsForCleanup.add(testActor.id); + const testActorClient = testUserClient.actor(testActor.id); + const actorJson = JSON.parse(readFileSync(joinPath(LOCAL_CONFIG_PATH), 'utf8')); + + await testRunCommand(ActorsPushCommand, { + args_actorId: testActor.id, + flags_noPrompt: true, + flags_force: true, + flags_applyEnvVarsToBuild: true, + }); + + const versionWithFlag = await testActorClient.version(actorJson.version).get(); + + await testRunCommand(ActorsPushCommand, { + args_actorId: testActor.id, + flags_noPrompt: true, + flags_force: true, + }); + + const versionWithoutFlag = await testActorClient.version(actorJson.version).get(); + + // false is what --no-apply-env-vars-to-build parses to + await testRunCommand(ActorsPushCommand, { + args_actorId: testActor.id, + flags_noPrompt: true, + flags_force: true, + flags_applyEnvVarsToBuild: false, + }); + + const versionWithNegatedFlag = await testActorClient.version(actorJson.version).get(); + + await testActorClient.delete(); + + expect(versionWithFlag!.applyEnvVarsToBuild).to.be.eql(true); + // omitting the flag must preserve the value stored on the platform + expect(versionWithoutFlag!.applyEnvVarsToBuild).to.be.eql(true); + // the negated flag must actively turn the setting off + expect(versionWithNegatedFlag!.applyEnvVarsToBuild).to.be.eql(false); + }, + TEST_TIMEOUT, + ); + it( 'should upload zip for source files larger that 3MB', async () => {