Search code examples
validationyq

How to validate yaml using yq?


I know there are at least two yq, I'm using this one: https://github.com/mikefarah/yq. According to the doc, I can validate a yaml file like this:

yq -v file.yaml

The problem: it outputs a lot of debug info however according to the doc, it should outputs "nothing if [the file] valid, otherwise it will print errors". As far as I see, the file looks valid.

How should I avoid output if the file is valid then?

The file:

name: Copywrite

on:
  push:
    tags:
      - v*
    branches:
      - main
  pull_request:
  workflow_dispatch:

jobs:
  copywrite:
    name: Run Header Copyright
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@93ea575cc8 # v3.1.0

      - name: Install Copywrite
        id: install
        uses: hashicorp/setup-copywrite@v1.0.0

      - name: Output Installed Copywrite Version
        run: echo "Installed Copywrite CLI ${{steps.install.outputs.version}}"

      - name: Run Copywrite Header Compliance
        run: copywrite headers --plan

The output:

yq -v ./file.yml
16:52:54 processArgs [DEBU] processed args: [./file.yml]
16:52:54 maybeFile [DEBU] checking './file.yml' is a file
16:52:54 maybeFile [DEBU] error: <nil>, dir: false
16:52:54 maybeFile [DEBU] result: true
16:52:54 FormatFromFilename [DEBU] checking file extension './file.yml' for auto format detection
16:52:54 FormatFromFilename [DEBU] detected format 'yml'
16:52:54 initCommand [DEBU] Using input format yml
16:52:54 initCommand [DEBU] Using output format yml
16:52:54 ParseExpression [DEBU] Parsing expression: []
16:52:54 ConvertToPostfix [DEBU] postfix processing currentToken )
16:52:54 ConvertToPostfix [DEBU] opstackLen: 0
16:52:54 ConvertToPostfix [DEBU] PostFix Result:
16:52:54 GetMatchingNodes [DEBU] getMatchingNodes - nothing to do
16:52:54 PrintResults [DEBU] PrintResults for 1 matches
16:52:54 PrintResults [DEBU] -- print sep logic: p.firstTimePrinting: false, previousDocIndex: 0, mappedDoc.Document: 0
16:52:54 PrintResults [DEBU] D0, P[], (doc)::name: Copywrite
on:
    push:
        tags:
            - v*
        branches:
            - main
    pull_request:
    workflow_dispatch:
jobs:
    copywrite:
        name: Run Header Copyright
        runs-on: ubuntu-latest
        steps:
            - name: Checkout
              uses: actions/checkout@93ea575cc8 # v3.1.0
            - name: Install Copywrite
              id: install
              uses: hashicorp/setup-copywrite@v1.0.0
            - name: Output Installed Copywrite Version
              run: echo "Installed Copywrite CLI ${{steps.install.outputs.version}}"
            - name: Run Copywrite Header Compliance
              run: copywrite headers --plan
name: Copywrite
on:
  push:
    tags:
      - v*
    branches:
      - main
  pull_request:
  workflow_dispatch:
jobs:
  copywrite:
    name: Run Header Copyright
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@93ea575cc8 # v3.1.0
      - name: Install Copywrite
        id: install
        uses: hashicorp/setup-copywrite@v1.0.0
      - name: Output Installed Copywrite Version
        run: echo "Installed Copywrite CLI ${{steps.install.outputs.version}}"
      - name: Run Copywrite Header Compliance
        run: copywrite headers --plan
16:52:54 PrintResults [DEBU] done printing results

Solution

  • Firstly, the documentation uses v as command (no dash), you are trying to use it as flag -v. Secondly, you are referencing a documentation for version 3.x but your output suggests you are using version 4.x.

    With version 3.x the following works, and gives no output if the file is valid:

    yq v file.yaml
    # or
    yq validate file.yaml
    

    With version 4.x (where -v and --verbose stand for verbose mode), you could simply feed the file into yq (defaulting to the idempotent filter .), and suppress stdout. Possible errors will come through on stderr.

    yq file.yaml >/dev/null