JSON
| source | condition | target |
|---|---|---|
✔ | ✔ | ✔ |
Description
The json resource reads and writes a single value in a JSON document, addressed by a Dasel selector.
- source
Reads one value out of one file and returns it. Only a single file is accepted (
fileswith more than one entry fails withsource only supports one file).- condition
Reads the same value and compares it to
value, or to the source output whenvalueis unset. Withfiles, every file must match for the condition to pass.- target
Writes
value(or the source output) at the given key. Files already holding that value are reported as up to date and left untouched, so a target that changes nothing does not create a commit.
Parameters
| Name | Type | Description | Required |
|---|---|---|---|
| engine | string | “engine” defines the engine used to manipulate the json file. compatible:
default: dasel/v1 remark:
example:
| |
| file | string | “file” defines the path of the json file to use. compatible:
remark:
example:
| |
| files | array | “files” defines the list of json file paths to use. compatible:
remark:
| |
| key | string | “key” defines the json key path to use. compatible:
remark:
example:
| |
| query | string | “query” defines an advanced dasel v1 query returning several values. compatible:
remark:
example:
| |
| value | string | “value” defines the value associated with the json key. compatible:
default: the output of the associated source. | |
| versionfilter | object | “versionfilter” defines the version pattern and its kind, such as “regex”, “semver” or “latest”. compatible:
remark:
| |
| kind | string | “kind” defines the versioning scheme used to select a version. default: latest remark:
example:
| |
| pattern | string | “pattern” defines the version pattern, according to “kind”. default:
remark:
example:
| |
| regex | string | “regex” defines the regular expression extracting the version from each entry. remark:
example:
| |
| replaceall | object | “replaceall” applies a regular expression replacement to each version before filtering. remark:
example: turns “curl-8_15_0” into “curl-8.15.0”. | |
| strict | boolean | “strict” enforces strict semantic versioning rules when parsing versions. default: false remark:
|
file or files is mandatory, as is key or query; missing either aborts the run with wrong spec content. The two are mutually exclusive (setting both fails with parameter "file" and "files" are mutually exclusive).
valueDefaults to the source output. Setting it explicitly makes the condition or target independent of any source.
versionfilterOnly meaningful for a source, and only when the selector returns several values - it picks one out of the list. See the "Version Filtering" page.
Note | multiple is deprecated and hidden from the table above. It still works, logging a warning, and a key used together with it is silently rewritten into query. Use a selector that returns several values instead. |
Engines
engine selects which version of Dasel parses the file. It matters more than it looks: the selector syntax is not portable between versions.
| Value | Behaviour |
|---|---|
| Default when |
| Deprecated - every run logs a warning. |
| Current engine. |
| Alias resolving to the latest engine, currently |
The leading dot is the trap when migrating:
| Selector | dasel/v1 | dasel/v2 | dasel/v3 |
|---|---|---|---|
| ✔ | ✔ | ✗ parse error |
| ✔ | ✔ | ✔ |
On dasel/v3 a leading dot fails with error parsing selector: failed to parse: unexpected token 29 "." at position 0. Multi-value selectors differ too (.deps.[*].version on dasel/v1 is written .deps.all().version on dasel/v2).
Warning |
On |
Remote files
file accepts https://, http:// and file:// schemes for a source and a condition, which is how the example below reads the Node.js release index straight from nodejs.org.
A target cannot write to a URL, and refuses rather than silently skipping:
URL scheme is not supported for Json target: "https://nodejs.org/dist/index.json"Examples
Retrieves a value from a JSON file
# updatecli.yaml
name: Basic Json Example
scms:
default:
kind: git
spec:
url: https://github.com/updatecli/updatecli.git
sources:
local:
name: Get value from json
kind: json
scmid: default
spec:
file: pkg/plugins/resources/json/testdata/data.json
key: firstName
http:
name: Get value from json
kind: json
spec:
file: https://www.updatecli.io/schema/latest/config.json
key: $id
conditions:
local:
name: Test value from json
kind: json
sourceid: local
scmid: default
spec:
file: pkg/plugins/resources/json/testdata/data.json
key: firstName
http:
name: Test value from json
kind: json
disablesourceinput: true
spec:
file: https://www.updatecli.io/schema/latest/config.json
key: $schema
value: http://json-schema.org/draft-04/schema
targets:
local:
name: Test value from json
kind: json
sourceid: local
scmid: default
spec:
file: pkg/plugins/resources/json/testdata/data.json
key: firstName
value: John
Uses a path to find a value in a JSON file
# jenkins-old-versions.yaml
# We're working with https://updates.jenkins.io/tiers.json
# {"stableCores":["2.346.3","2.361.1", ...,"2.414.2"],"weeklyCores":["2.364","2.371",...,"2.425"]}
# This example finds the oldest weekly and stable supported Jenkins versions (first in the list)
# It also finds the latest weekly and stable Jenkins versions (last in the list)
name: Find oldest supported Jenkins versions
scms:
default:
kind: github
spec:
user: "{{ .github.user }}"
email: "{{ .github.email }}"
owner: "{{ .github.owner }}"
repository: "{{ .github.repository }}"
token: "{{ requiredEnv .github.token }}"
username: "{{ .github.username }}"
branch: "{{ .github.branch }}"
sources:
JenkinsOldestSupportedWeekly:
name: Get the oldest supported Jenkins weekly version
kind: json
scmid: default
spec:
file: https://updates.jenkins.io/tiers.json
key: "weeklyCores.[0]"
JenkinsOldestSupportedStable:
name: Get the oldest supported Jenkins stable version
kind: json
scmid: default
spec:
file: https://updates.jenkins.io/tiers.json
# `key` targets only one value, the first one of the list in this case
key: "stableCores.[0]"
JenkinsNewestWeeklyVersion:
name: Get the newest supported Jenkins weekly version
kind: json
spec:
file: https://updates.jenkins.io/tiers.json
# Here we use `query` to target all the values in the list
query: "weeklyCores.[*]"
# We use `versionfilter` to filter the list of versions
# Combined with `semver`, we can target the latest version that follows the semver pattern
versionfilter:
kind: semver
JenkinsNewestStableVersion:
name: Get the newest supported Jenkins stable version
kind: json
spec:
file: https://updates.jenkins.io/tiers.json
query: "stableCores.[*]"
versionfilter:
kind: semver
conditions:
# Test that the oldest Jenkins supported weekly version exists
jenkinsOldestSupportedWeeklyVersion:
kind: jenkins
spec:
release: weekly
sourceid: JenkinsOldestSupportedWeekly
# Test that the oldest Jenkins supported stable version exists
jenkinsOldestSupportedStableVersion:
kind: jenkins
sourceid: JenkinsOldestSupportedStable
# Test that the newest Jenkins supported weekly version exists
jenkinsNewestSupportedWeeklyVersion:
kind: jenkins
spec:
release: weekly
sourceid: JenkinsNewestWeeklyVersion
# Test that the newest Jenkins supported stable version exists
jenkinsNewestSupportedStableVersion:
kind: jenkins
sourceid: JenkinsNewestStableVersion
targets:
setJenkinsOldestSupportedWeekly:
kind: file
name: "Bump Jenkins oldest weekly supported version in the \"Choosing a version\" page"
sourceid: JenkinsOldestSupportedWeekly
spec:
file: content/doc/developer/plugin-development/choosing-jenkins-baseline.adoc
matchpattern: >-
(.*Do not use versions no longer supported by the update center.*older than )(.*)( for weekly releases.*for LTS releases.*)
replacepattern: >-
${1}{{ source "JenkinsOldestSupportedWeekly" }}${3}
scmid: default
setJenkinsOldestSupportedStable:
kind: file
name: "Bump Jenkins oldest stable supported version in the \"Choosing a version\" page"
sourceid: JenkinsOldestSupportedStable
spec:
file: content/doc/developer/plugin-development/choosing-jenkins-baseline.adoc
matchpattern: >-
(.*Do not use versions no longer supported by the update center.* weekly releases, and )(.*)( for LTS releases.*)
replacepattern: >-
${1}{{ source "JenkinsOldestSupportedStable" }}${3}
scmid: default
actions:
default:
kind: github/pullrequest
scmid: default
title: Bump Jenkins LTS and weekly versions in various parts of the documentation
spec:
labels:
- dependencies
- chore