Currently I am trying to update a value in Github CI with YQ for my deployment on digital ocean app platform. I download the app spec via the CLI and want to update that spec with new values if the jobs are done.
APP SPEC LAYOUT:
alerts:
- rule: DEPLOYMENT_FAILED
- rule: DOMAIN_FAILED
domains:
- domain: example.com
type: PRIMARY
zone: example.com
features:
- buildpack-stack=ubuntu-22
ingress:
rules:
- component:
name: example
match:
path:
prefix: /
name: example
region: ams
services:
- alerts:
- operator: GREATER_THAN
rule: MEM_UTILIZATION
value: 90
window: TEN_MINUTES
- operator: GREATER_THAN
rule: CPU_UTILIZATION
value: 90
window: TEN_MINUTES
envs:
- key: NITRO_PRESET
scope: RUN_AND_BUILD_TIME
value: node-cluster
- key: KEY
scope: RUN_AND_BUILD_TIME
type: SECRET
value: VALUE
- key: URL
scope: RUN_AND_BUILD_TIME
type: SECRET
value: URL
- key: ID
scope: RUN_AND_BUILD_TIME
value: 29349034
- key: NUXT_PUBLIC_VERSION
scope: RUN_AND_BUILD_TIME
value: v0.3.0 <-- I want to change this and keep the structure of the file.
http_port: 3000
image:
deploy_on_push: {}
registry_type: DOCR
repository: example-website
tag: v0.4.0
instance_count: 1
instance_size_slug: basic-xxs
name: example-website
I want to update the value under services.envs.key (NUXT_PUBLIC_VERSION).value
Currently if i run this code:
yq e '.services[0].envs[] | select(.key == "NUXT_PUBLIC_VERSION").value = "v0.5.0"' current-app-spec.yaml -i
It will change the value but only paste back the part inside envs section.
Anyone that can guide me in the right direction?
With mikefarah/yq, you can use the update select operator
|=to update the result and get the whole YAML back, right from the root node.Recommend using the
-i, --inplaceflag, only after you dry-run the command without and confirm the YAML produced is as expected, so that any invalid writes do not occur.Also the
eflag no longer needs to be provided, as it has been made the default command since 4.18.1. See Notice for v4.x versions prior to 4.18.1