def update(
project,
environment,
name,
patch = nil,
product: nil,
timeout: nil,
**fields
)def update: (
String project,
String environment,
String name,
?(variable_patch | Hash[Symbol | String, untyped])? patch,
?product: (String | Symbol)?,
?timeout: seconds?,
**untyped
) -> variable_resourcePatches one variable addressed by its current name. Every field is optional and anything you omit keeps its stored value.
value and defaultValue must be ciphertext when present, otherwise the call fails with 400 variable.ciphertext_invalid and error.field naming which one. Send defaultValue: nil to clear it and omit it to leave it alone, the two are not interchangeable.
Passing name renames the variable, which changes the address every later call must use. The new name must match ^[A-Za-z_][A-Za-z0-9_]*$ and be 1 to 100 characters, is stored with exactly the casing you send, and the rename is refused with 409 variable.name_conflict when another live variable already holds that name, compared without regard to case. Prefer update_by_id inside a long running sync loop, since an id cannot go stale under a rename.
Example
require "envless/sdk"
passphrase = ENV.fetch("ENVLESS_PASSPHRASE")
workspace_id = Envless.me.get[:workspaceId]
ciphertext = Envless.encrypt_value(
"sk_live_rotated",
passphrase,
workspace_id
)
variable = Envless.variables.update(
"api",
"production",
"STRIPE_SECRET_KEY",
value: ciphertext
)
puts variable[:updatedAt]Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
project | String | Yes | Project slug the environment belongs to. |
environment | String | Yes | Environment slug the variable lives in. |
name | String | Yes | Current variable name, matched without regard to case. |
patch | variable_patch | No | The fields below as one Hash, with Symbol or String keys, in place of the keywords. |
name: | String | No | New name, matching ^[A-Za-z_][A-Za-z0-9_]*$ and 1 to 100 characters, which renames the variable and changes how you address it. |
value: | String | No | Replacement ciphertext from encrypt_value, prefixed v1: or v2:. |
type: | String | No | One of the Envless::VARIABLE_TYPE values. |
isSecret: | bool | No | Marks or unmarks the variable as a secret, which the example feed reports as secret. Stored, but not echoed in the response. |
visibility: | String | No | One of the Envless::VARIABLE_VISIBILITY_LEVELS values. |
required: | bool | No | Toggles whether the variable is required for the environment. |
defaultValue: | String | nil | No | Replacement ciphertext fallback, or nil to clear it. |
product: | String | Symbol | No | Product slug, needed when the project slug is not unique in the workspace. |
timeout: | Integer | Float | Rational | No | Seconds each attempt of this call may take, redirects and the response body included, before it raises Envless::NetworkError with timeout? set. Overrides the client's timeout for this call, and 0 turns the limit off. |
Returns
variable_resource reflecting the row after the patch, with a fresh updatedAt.
Worth knowing
- A rename does not start a new audit trail. History is keyed to the variable id, so events survive the new name.
- The returned
updatedAtis the value a laterapplybaseline must carry, down to the millisecond. - A rename is checked locally before anything is sent. The new name must be 1 to 100 characters of letters, numbers and underscores, and it must not start with a number. Case is kept exactly as you type it, and a local refusal raises
Envless::ApiErrorcarryingrequest.body_invalid.
Required scopes
variables:write
Underlying endpoint
PATCH /projects/{slug}/environments/{environmentSlug}/variables/{name}
Request and response schema, every error code, and a live playground.
In TypeScript
envless.variables.update()
The same method in @goenvless/sdk, with the same request, retries and errors.