Skip to content

Commit

Permalink
fix(core): Use the configured timezone in task runner (#12032)
Browse files Browse the repository at this point in the history
  • Loading branch information
tomi authored and ivov committed Dec 4, 2024
1 parent 2fe181a commit b0f6c6f
Show file tree
Hide file tree
Showing 6 changed files with 49 additions and 2 deletions.
1 change: 1 addition & 0 deletions docker/images/n8n/n8n-task-runners.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"args": ["/usr/local/lib/node_modules/n8n/node_modules/@n8n/task-runner/dist/start.js"],
"allowed-env": [
"PATH",
"GENERIC_TIMEZONE",
"N8N_RUNNERS_GRANT_TOKEN",
"N8N_RUNNERS_N8N_URI",
"N8N_RUNNERS_MAX_PAYLOAD",
Expand Down
3 changes: 3 additions & 0 deletions packages/@n8n/task-runner/src/config/base-runner-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ export class BaseRunnerConfig {
@Env('N8N_RUNNERS_AUTO_SHUTDOWN_TIMEOUT')
idleTimeout: number = 0;

@Env('GENERIC_TIMEZONE')
timezone: string = 'America/New_York';

@Nested
healthcheckServer!: HealthcheckServerConfig;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { DateTime } from 'luxon';
import type { CodeExecutionMode, IDataObject } from 'n8n-workflow';
import { setGlobalState, type CodeExecutionMode, type IDataObject } from 'n8n-workflow';
import fs from 'node:fs';
import { builtinModules } from 'node:module';

Expand Down Expand Up @@ -326,6 +326,43 @@ describe('JsTaskRunner', () => {
});
});

describe('timezone', () => {
it('should use the specified timezone in the workflow', async () => {
const taskData = newDataRequestResponse(inputItems.map(wrapIntoJson), {});
taskData.workflow.settings = {
timezone: 'Europe/Helsinki',
};

const outcome = await execTaskWithParams({
task: newTaskWithSettings({
code: 'return { val: $now.toSeconds() }',
nodeMode: 'runOnceForAllItems',
}),
taskData,
});

const helsinkiTimeNow = DateTime.now().setZone('Europe/Helsinki').toSeconds();
expect(outcome.result[0].json.val).toBeCloseTo(helsinkiTimeNow, 1);
});

it('should use the default timezone', async () => {
setGlobalState({
defaultTimezone: 'Europe/Helsinki',
});

const outcome = await execTaskWithParams({
task: newTaskWithSettings({
code: 'return { val: $now.toSeconds() }',
nodeMode: 'runOnceForAllItems',
}),
taskData: newDataRequestResponse(inputItems.map(wrapIntoJson), {}),
});

const helsinkiTimeNow = DateTime.now().setZone('Europe/Helsinki').toSeconds();
expect(outcome.result[0].json.val).toBeCloseTo(helsinkiTimeNow, 1);
});
});

it('should allow access to Node.js Buffers', async () => {
const outcomeAll = await execTaskWithParams({
task: newTaskWithSettings({
Expand Down
6 changes: 5 additions & 1 deletion packages/@n8n/task-runner/src/start.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ensureError } from 'n8n-workflow';
import { ensureError, setGlobalState } from 'n8n-workflow';
import Container from 'typedi';

import { MainConfig } from './config/main-config';
Expand Down Expand Up @@ -44,6 +44,10 @@ function createSignalHandler(signal: string) {
void (async function start() {
const config = Container.get(MainConfig);

setGlobalState({
defaultTimezone: config.baseRunnerConfig.timezone,
});

if (config.sentryConfig.sentryDsn) {
const { ErrorReporter } = await import('@/error-reporter');
errorReporter = new ErrorReporter(config.sentryConfig);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ describe('TaskRunnerProcess', () => {
'N8N_VERSION',
'ENVIRONMENT',
'DEPLOYMENT_NAME',
'GENERIC_TIMEZONE',
])('should propagate %s from env as is', async (envVar) => {
jest.spyOn(authService, 'createGrantToken').mockResolvedValue('grantToken');
process.env[envVar] = 'custom value';
Expand Down
1 change: 1 addition & 0 deletions packages/cli/src/runners/task-runner-process.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ export class TaskRunnerProcess extends TypedEmitter<TaskRunnerProcessEventMap> {

private readonly passthroughEnvVars = [
'PATH',
'GENERIC_TIMEZONE',
'NODE_FUNCTION_ALLOW_BUILTIN',
'NODE_FUNCTION_ALLOW_EXTERNAL',
'N8N_SENTRY_DSN',
Expand Down

0 comments on commit b0f6c6f

Please sign in to comment.