Skip to main content
These plugins run commands, call HTTP services, query databases, read and write files and keep shared state. Five of them need an optional module in the server build; KV_STORE is always included. See Built-in plugins for the modules. Most of them share one failure pattern, set with failureMode: With failureMode set to CONTINUE, PROCESS_EXECUTOR and HTTP_REQUEST can also stamp each message with the port success or failure (routeByExitCode, routeByStatus) so edges can route on the outcome without a separate BRANCH node.
PROCESS_EXECUTOR, SQL_QUERY, FILE_READ, FILE_WRITE and HTTP_REQUEST act with the permissions of the Yukta server. Anyone who can author a workflow can use them. Treat workflow authorship as a trusted operation and see Security.

PROCESS_EXECUTOR

Runs an operating system command for each message and emits the result. Requires the process-executor module. The server refuses every command until you allow some. Set yukta.process.allowed-commands to a list of executable names, exactly as they appear first in command. With that list set, useShell is refused. For trusted authors only, yukta.process.allow-any=true allows any executable. Output ports: default, or success and failure when routeByExitCode is on. The metadata always gets exitCode: the real exit code, or -1 when the process timed out. A timed-out process is stopped, then killed after a short grace period. Standard output and error lines appear live in the execution logs while the process runs. Variables whose names contain PASSWORD, SECRET, TOKEN, KEY and similar words cannot be read with ${env...} or ${sys...}. With inputMode ENV, the message is visible in the process’s environment, so do not use it for messages that carry secrets. See Variables and expressions. Default timeout: timeout plus 10 percent (at least 5 seconds), so 330 seconds with the default. Up to 256 messages are handled at once, with results emitted in order. This node runs a check and routes on its exit code:

HTTP_REQUEST

Makes one HTTP request per message and emits the response. Requires the http-request module. Output ports: default, or success and failure when routeByStatus is on. The payload is {"status", "success", "headers", "body"}. success is true for a 2xx status. body is parsed when the response declares a JSON content type, and is text otherwise. The metadata gets status. With CONTINUE, a transport error (no connection, timeout) is emitted with status 0 and the error text as body. A non-2xx answer is data, not an error, until failureMode is ERROR. The server does not restrict which hosts a request can reach, and the URL can come from the message. Treat the URL as trusted input. Default timeout: timeout plus 5 seconds. Up to 256 messages are handled at once, with results emitted in order.

SQL_QUERY

Runs one parameterised SQL statement per message. Requires the sql-query module, and the driver for your database must be part of the server build. Output ports: default, plus error when failureMode is CONTINUE. Values are always bound as parameters and never pasted into the statement, so they cannot change its structure. A parameter takes its value from the named field of the incoming payload, which must be an object. For a statement that returns rows the payload becomes {"rows": [...], "count": n}, with column names in lower case. For any other statement it becomes {"updated": n}. A connection is opened for each message and messages are handled one at a time. Credentials in url, username and password are not variable-resolved and are stored as written in the workflow definition.

FILE_READ

Reads a UTF-8 text file from a sandbox directory. Requires the file-io module. Output ports: default, plus error when failureMode is CONTINUE. The payload becomes {"path": "<absolute path>", "content": "<text>"}.

FILE_WRITE

Writes or appends text to a file in a sandbox directory and passes the message on unchanged. Requires the file-io module. Output ports: default, plus error when failureMode is CONTINUE. For both file plugins, a path is normalised and anything that escapes baseDir, by .. or through a symbolic link, is refused. baseDir and path are used as written, not variable-resolved. The sandbox limits what a path can reach, not who can author the workflow, since baseDir is itself part of the workflow. Messages are handled one at a time.

KV_STORE

Reads and writes small shared state: counters, flags and last-seen values. It is always part of the server. Output port: default. The payload becomes {"key": "...", "value": ...}. The store belongs to the whole server: every workflow and execution shares it. By default it lives in memory and is lost on restart. With the PostgreSQL module and yukta.kv.store-type=postgres it survives restarts and is shared between servers, and incr is a single atomic statement. See Persistence. Messages are handled one at a time.
Each message that reaches this node adds 1 to ci:build-failures.

Limits and defaults